From 9a803305c8d07e90948cda0c387efe8aaa925a1b Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Wed, 30 Sep 2026 06:15:09 +0200 Subject: [PATCH] fix: address verified v6 app findings Fix authentication recovery, account imports, application tracking, resume editing and exports, sharing, API contracts, provider selection, and private local attachments. Preserve authored content during PDF pagination. Update guides, generated OpenAPI output, and translation catalogs to match verified behavior and documented constraints. Validation: 1,019 tests passed; 12 database/OAuth integration tests skipped. Ten affected package typechecks, production build, Biome, and package boundaries passed. --- .env.example | 7 +- .github/workflows/crowdin-sync.yml | 2 + AGENTS.md | 8 +- Dockerfile.dev | 6 +- GLOSSARY.md | 9 +- README.md | 2 +- apps/server/src/app-version.ts | 5 +- apps/server/src/http/app.ts | 2 +- apps/server/src/http/auth.test.ts | 19 ++ apps/server/src/http/auth.ts | 9 +- apps/server/src/http/health.test.ts | 8 +- apps/server/src/http/health.ts | 2 +- apps/server/src/mcp/auth.test.ts | 24 ++ apps/server/src/mcp/auth.ts | 45 +--- apps/server/src/mcp/server.ts | 2 +- apps/server/src/openapi/generator.test.ts | 4 + apps/server/src/static/uploads-local.test.ts | 44 ++++ apps/web/locales/af-ZA.po | 140 ++++++++--- apps/web/locales/am-ET.po | 140 ++++++++--- apps/web/locales/ar-SA.po | 140 ++++++++--- apps/web/locales/az-AZ.po | 140 ++++++++--- apps/web/locales/bg-BG.po | 140 ++++++++--- apps/web/locales/bn-BD.po | 140 ++++++++--- apps/web/locales/ca-ES.po | 140 ++++++++--- apps/web/locales/cs-CZ.po | 140 ++++++++--- apps/web/locales/da-DK.po | 140 ++++++++--- apps/web/locales/de-DE.po | 140 ++++++++--- apps/web/locales/el-GR.po | 140 ++++++++--- apps/web/locales/en-GB.po | 140 ++++++++--- apps/web/locales/en-US.po | 144 ++++++++--- apps/web/locales/es-ES.po | 140 ++++++++--- apps/web/locales/fa-IR.po | 140 ++++++++--- apps/web/locales/fi-FI.po | 140 ++++++++--- apps/web/locales/fr-FR.po | 140 ++++++++--- apps/web/locales/he-IL.po | 140 ++++++++--- apps/web/locales/hi-IN.po | 140 ++++++++--- apps/web/locales/hu-HU.po | 140 ++++++++--- apps/web/locales/id-ID.po | 140 ++++++++--- apps/web/locales/it-IT.po | 140 ++++++++--- apps/web/locales/ja-JP.po | 140 ++++++++--- apps/web/locales/km-KH.po | 140 ++++++++--- apps/web/locales/kn-IN.po | 140 ++++++++--- apps/web/locales/ko-KR.po | 140 ++++++++--- apps/web/locales/lt-LT.po | 140 ++++++++--- apps/web/locales/lv-LV.po | 140 ++++++++--- apps/web/locales/ml-IN.po | 140 ++++++++--- apps/web/locales/mr-IN.po | 140 ++++++++--- apps/web/locales/ms-MY.po | 140 ++++++++--- apps/web/locales/ne-NP.po | 140 ++++++++--- apps/web/locales/nl-NL.po | 140 ++++++++--- apps/web/locales/no-NO.po | 140 ++++++++--- apps/web/locales/or-IN.po | 140 ++++++++--- apps/web/locales/pl-PL.po | 140 ++++++++--- apps/web/locales/pt-BR.po | 140 ++++++++--- apps/web/locales/pt-PT.po | 140 ++++++++--- apps/web/locales/ro-RO.po | 140 ++++++++--- apps/web/locales/ru-RU.po | 140 ++++++++--- apps/web/locales/sk-SK.po | 140 ++++++++--- apps/web/locales/sl-SI.po | 140 ++++++++--- apps/web/locales/sq-AL.po | 140 ++++++++--- apps/web/locales/sr-SP.po | 140 ++++++++--- apps/web/locales/sv-SE.po | 140 ++++++++--- apps/web/locales/ta-IN.po | 140 ++++++++--- apps/web/locales/te-IN.po | 140 ++++++++--- apps/web/locales/th-TH.po | 140 ++++++++--- apps/web/locales/tr-TR.po | 140 ++++++++--- apps/web/locales/uk-UA.po | 140 ++++++++--- apps/web/locales/uz-UZ.po | 140 ++++++++--- apps/web/locales/vi-VN.po | 140 ++++++++--- apps/web/locales/zh-CN.po | 140 ++++++++--- apps/web/locales/zh-TW.po | 140 ++++++++--- apps/web/locales/zu-ZA.po | 130 +++++++--- .../components/typography/combobox.test.tsx | 11 + .../src/components/typography/combobox.tsx | 15 +- .../components/typography/get-next-weights.ts | 7 +- apps/web/src/dialogs/auth/change-password.tsx | 4 +- .../dialogs/auth/enable-two-factor.test.tsx | 49 ++++ .../src/dialogs/auth/enable-two-factor.tsx | 12 +- .../components/application-detail-sheet.tsx | 4 +- .../applications/components/board.tsx | 46 +++- .../components/detail/next-step-card.test.tsx | 52 ++++ .../components/detail/next-step-card.tsx | 19 +- .../applications/components/insights-view.tsx | 16 +- .../features/applications/insights.test.ts | 23 +- .../web/src/features/applications/insights.ts | 9 +- .../assistant/assistant-panel.test.tsx | 101 ++++++++ .../features/assistant/assistant-panel.tsx | 63 ++++- apps/web/src/features/assistant/chat.ts | 2 +- .../features/assistant/conversation.test.tsx | 113 +++++++++ .../src/features/assistant/conversation.tsx | 31 ++- apps/web/src/features/assistant/document.ts | 18 +- apps/web/src/features/ats-checker/checker.tsx | 18 +- .../src/features/auth/login-redirect.test.tsx | 38 +++ apps/web/src/features/auth/pages/register.tsx | 6 +- .../features/auth/pages/reset-password.tsx | 4 +- .../src/features/auth/pages/verify-2fa.tsx | 5 +- .../src/features/command-palette/index.tsx | 1 + .../src/features/documents/document-card.tsx | 1 + .../documents/new-document-dialog.tsx | 15 +- .../src/features/resume/builder/draft.test.ts | 6 + apps/web/src/features/resume/builder/draft.ts | 7 + .../resume/editor/check/job-match.tsx | 9 +- .../features/resume/editor/design/presets.ts | 2 +- .../resume/editor/design/template-group.tsx | 6 +- .../features/resume/editor/page-overlay.tsx | 2 +- .../resume/editor/write/basics-card.tsx | 15 +- .../resume/editor/write/dates-field.tsx | 6 +- .../features/resume/editor/write/entries.tsx | 4 +- .../resume/editor/write/picture-settings.tsx | 15 +- .../resume/editor/write/rich-text-editor.tsx | 4 +- .../resume/editor/write/write-panel.tsx | 2 +- .../resume/export/use-resume-export.ts | 14 +- .../features/resume/import/read-file.test.ts | 14 ++ .../src/features/resume/import/read-file.ts | 38 ++- .../resume/public/resume-reflow.test.tsx | 16 ++ .../features/resume/public/resume-reflow.tsx | 12 +- .../src/features/resume/share/link-tab.tsx | 20 +- .../src/features/resume/stylesheet/editor.tsx | 77 +++--- .../features/resume/stylesheet/toolbar.tsx | 4 +- .../features/settings/account/auth-hooks.ts | 55 ++-- .../features/settings/account/export.test.ts | 40 ++- .../src/features/settings/account/export.ts | 10 +- .../src/features/settings/account/profile.tsx | 4 +- .../features/settings/account/security.tsx | 22 +- apps/web/src/features/settings/ai/catalog.ts | 2 +- .../src/features/settings/ai/providers.tsx | 25 +- apps/web/src/libs/error-message.ts | 3 + .../libs/resume/move-item-round-trip.test.ts | 15 +- apps/web/src/libs/resume/move-item.ts | 4 +- .../$resumeId/-components/design-panel.tsx | 6 +- .../-components/use-editor-hotkeys.ts | 20 +- .../-sidebar/right/sections/notes.tsx | 2 +- .../-sidebar/right/sections/typography.tsx | 3 +- .../src/routes/builder/$resumeId/route.tsx | 2 + .../routes/builder/letter/$coverLetterId.tsx | 1 + .../routes/dashboard/applications/index.tsx | 2 +- .../src/routes/dashboard/settings/index.tsx | 13 +- docs/applying-custom-styles.mdx | 22 +- docs/guides/arranging-the-layout.mdx | 4 +- docs/guides/choosing-a-template.mdx | 4 +- docs/guides/customizing-typography.mdx | 2 +- docs/guides/editing-entries.mdx | 4 +- docs/guides/editing-on-mobile.mdx | 2 +- docs/guides/entering-dates.mdx | 4 +- docs/guides/exporting-resume-to-markdown.mdx | 2 +- docs/guides/exporting-your-data.mdx | 2 +- docs/guides/filling-in-your-details.mdx | 4 +- docs/guides/formatting-text.mdx | 4 +- docs/guides/importing-resumes.mdx | 6 +- docs/guides/linking-social-accounts.mdx | 2 +- docs/guides/setting-up-passkeys.mdx | 8 +- .../setting-up-two-factor-authentication.mdx | 20 +- docs/guides/sharing-your-resume-publicly.mdx | 6 +- docs/guides/signing-in.mdx | 2 +- docs/guides/tracking-job-applications.mdx | 2 +- docs/guides/using-ai.mdx | 14 +- docs/guides/using-the-api.mdx | 1 + docs/guides/using-the-assistant.mdx | 9 +- docs/guides/using-the-ats-checker.mdx | 2 +- docs/guides/using-the-patch-api.mdx | 4 +- docs/guides/viewing-application-insights.mdx | 4 +- docs/guides/writing-a-cover-letter.mdx | 2 + docs/self-hosting/environment-variables.mdx | 8 +- docs/self-hosting/examples.mdx | 15 +- docs/self-hosting/migration.mdx | 8 + docs/self-hosting/sso.mdx | 8 +- docs/self-hosting/upgrading-to-v6.mdx | 8 + docs/spec.json | 238 +++++++++++++++--- packages/api/src/context.test.ts | 11 + packages/api/src/context.ts | 5 +- packages/api/src/dto/resume.test.ts | 13 + packages/api/src/dto/resume.ts | 13 +- .../api/src/features/agent/document.test.ts | 19 +- packages/api/src/features/agent/document.ts | 11 +- packages/api/src/features/agent/messages.ts | 1 + packages/api/src/features/agent/service.ts | 13 +- .../api/src/features/ai-providers/inputs.ts | 15 +- .../src/features/ai-providers/router.test.ts | 13 +- .../src/features/ai-providers/service.test.ts | 14 +- .../api/src/features/ai-providers/service.ts | 5 +- .../api/src/features/ai/credentials.test.ts | 19 ++ packages/api/src/features/ai/credentials.ts | 18 +- .../src/features/applications/service.test.ts | 37 +-- packages/api/src/features/auth/export.test.ts | 1 + packages/api/src/features/auth/service.ts | 3 +- .../src/features/documents/service.test.ts | 13 +- .../api/src/features/documents/service.ts | 5 +- packages/api/src/features/resume/crud.ts | 3 + packages/api/src/features/resume/router.ts | 2 +- .../api/src/features/resume/service.test.ts | 41 +++ packages/api/src/features/resume/service.ts | 23 +- packages/api/src/features/resume/sharing.ts | 1 + packages/api/src/features/storage/service.ts | 6 +- .../src/middleware/rate-limit/index.test.ts | 61 +++++ .../api/src/middleware/rate-limit/index.ts | 37 +-- packages/auth/src/config.ts | 6 +- packages/docx/src/section-renderers.ts | 10 +- packages/mcp/src/mcp-server-card.ts | 4 +- packages/mcp/src/tool-meta.ts | 13 +- packages/mcp/src/tools.test.ts | 14 ++ packages/mcp/src/tools.ts | 33 ++- packages/pdf/src/forme/render.ts | 36 ++- packages/pdf/src/forme/to-forme.tsx | 13 +- packages/pdf/src/semantic/tree.test.ts | 23 +- packages/pdf/src/semantic/tree.ts | 4 - .../pdf/src/templates/shared/filtering.ts | 6 +- .../resume/src/ats-pdf/analyze/contact.ts | 13 +- packages/resume/src/ats-pdf/index.test.ts | 20 ++ packages/resume/src/markdown.test.ts | 24 ++ packages/resume/src/markdown.ts | 38 ++- packages/schema/src/resume/sample.ts | 6 +- packages/ui/src/components/menu-styles.tsx | 2 +- 212 files changed, 7519 insertions(+), 2647 deletions(-) create mode 100644 apps/server/src/mcp/auth.test.ts create mode 100644 apps/server/src/static/uploads-local.test.ts create mode 100644 apps/web/src/dialogs/auth/enable-two-factor.test.tsx create mode 100644 apps/web/src/features/applications/components/detail/next-step-card.test.tsx create mode 100644 apps/web/src/features/assistant/assistant-panel.test.tsx create mode 100644 apps/web/src/features/assistant/conversation.test.tsx create mode 100644 apps/web/src/features/resume/public/resume-reflow.test.tsx create mode 100644 packages/api/src/middleware/rate-limit/index.test.ts diff --git a/.env.example b/.env.example index cff7817cc..94893f000 100644 --- a/.env.example +++ b/.env.example @@ -100,8 +100,9 @@ S3_BUCKET="reactive-resume" S3_FORCE_PATH_STYLE="true" # --- AI Agent Workspace (optional) --- -# Required for the authenticated /agent workspace and saved AI providers. -# Redis also shares rate limits, resume events, cancellation and view deduplication. +# ENCRYPTION_SECRET is required for saved AI providers and the assistant. +# Redis is optional on a single server. Providers and conversations persist in PostgreSQL. +# Redis shares rate limits, resume events, cancellation and view deduplication, and resumes reply streams. # Vercel Upstash KV_URL is accepted as an alias for REDIS_URL. REDIS_URL="redis://redis:6379" ENCRYPTION_SECRET="change-me-to-a-secure-agent-secret-in-production" @@ -118,7 +119,7 @@ FLAG_DISABLE_EMAIL_AUTH="false" # This is useful if you are using a machine with limited resources, like a Raspberry Pi. FLAG_DISABLE_IMAGE_PROCESSING="false" -# This flag disables API rate limiting for authentication endpoints. +# This flag disables API and authentication rate limiting, including PDF export and AI requests. # Rate limiting is enabled by default in production to prevent abuse. FLAG_DISABLE_API_RATE_LIMIT="false" diff --git a/.github/workflows/crowdin-sync.yml b/.github/workflows/crowdin-sync.yml index 8cff6f5d5..3ba7833f4 100644 --- a/.github/workflows/crowdin-sync.yml +++ b/.github/workflows/crowdin-sync.yml @@ -32,6 +32,8 @@ jobs: uses: crowdin/github-action@v2 with: download_translations: true + export_only_approved: true + skip_untranslated_strings: true localization_branch_name: "l10n" commit_message: "[skip ci] chore(i18n): sync translations from crowdin" pull_request_title: "Sync Translations from Crowdin" diff --git a/AGENTS.md b/AGENTS.md index fcee86f95..a25281ceb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -58,7 +58,7 @@ Internal packages are source-consumed through `package.json` export maps pointin ## Setup -Prerequisites: **Node.js 24** (`.nvmrc`, root `engines`, and Dockerfile), **pnpm 12.6.0** (root `packageManager`; pnpm self-manages to this version), and **Docker with Docker Compose** for local infrastructure. The Dockerfile's `ARG PNPM_VERSION` chooses its base image, not the project's pnpm version. Start your Docker daemon before running Compose. +Prerequisites: **Node.js 24** (`.nvmrc`, root `engines`, and Dockerfile), **pnpm 12.8.1** (root `packageManager`; pnpm self-manages to this version), and **Docker with Docker Compose** for local infrastructure. The Dockerfile's `ARG PNPM_VERSION` chooses its base image, not the project's pnpm version. Start your Docker daemon before running Compose. Run commands from the workspace root unless stated otherwise: @@ -78,7 +78,7 @@ S3_ENDPOINT=http://localhost:8333 REDIS_URL=redis://localhost:6379 ``` -Set `AUTH_SECRET` to a generated secret (`openssl rand -hex 32`). If using saved AI providers or `/agent`, also set a separate `ENCRYPTION_SECRET` of at least 32 characters. For database-only development, start just `postgres` and set `STORAGE_BACKEND=local` to avoid the template's S3 defaults. +Set `AUTH_SECRET` to a generated secret (`openssl rand -hex 32`). If using saved AI providers or the assistant, also set a separate `ENCRYPTION_SECRET` of at least 32 characters. For database-only development, start just `postgres` and set `STORAGE_BACKEND=local` to avoid the template's S3 defaults. ## Development workflow @@ -115,7 +115,7 @@ Where each concern lives, and where new code for it goes: | DOCX export | `packages/docx` | | MCP tools/prompts/resources/server-card | `packages/mcp` | | Generic UI primitives + hooks | `packages/ui` (Base UI/shadcn-style); workflow-specific UI stays in the owning web feature | -| Desktop Shell integration | `packages/dsh-plugin` (separately built/published plugin) | +| DeepSeek Harness integration | `packages/dsh-plugin` (separately built/published plugin) | | Focused support surfaces | `packages/fonts`, `packages/email`, `packages/import`, `packages/ai`, `packages/utils`, `packages/config` — prefer existing exports over cross-package shortcuts | | Dev-only scripts | `tooling/`, not `packages/`, so packages only hold runtime-bundled code | @@ -153,7 +153,7 @@ Multi-place changes: Host development requires `APP_URL`, `DATABASE_URL`, and non-empty `AUTH_SECRET`. `packages/env/src/server.ts` also loads root `.env` through Node's native `process.loadEnvFile`; existing process variables take precedence. Root dev/database scripts explicitly load `.env.local` through `dotenvx`. Tests and application code can have their own environment loaders; do not assume every command loads `.env.local`. - **Storage**: explicit `STORAGE_BACKEND=local|s3|blob` wins. Otherwise, complete S3 credentials select S3; Vercel selects private Blob; other deployments select local storage. `.env.example` ships SeaweedFS defaults, so either run SeaweedFS or select `local`/remove the S3 credentials. Local storage defaults to `/data` in development and `/app/data` in Docker. `LOCAL_STORAGE_PATH` must be absolute and writable; persist it in deployed installations. -- **`REDIS_URL` and `ENCRYPTION_SECRET`** are optional for core resume flows but both required for saved AI providers and the authenticated `/agent` workspace. Host-run dev uses `REDIS_URL=redis://localhost:6379`; the container-run app uses `redis://redis:6379`. +- **`ENCRYPTION_SECRET`** is required for saved AI providers and the assistant. **`REDIS_URL`** is optional outside Vercel; it shares rate limits, cancellation and resumable replies between processes. Vercel deployment preparation requires Redis. Host-run dev uses `REDIS_URL=redis://localhost:6379`; the container-run app uses `redis://redis:6379`. - **`drizzle-kit` (used by `pnpm db:migrate`) reads `DATABASE_URL` from `process.env` directly** — it does not auto-load `.env`. The root migration scripts load `.env.local` through `dotenvx` before invoking Drizzle Kit. - `DATABASE_MIGRATION_URL` supplies a direct migration connection when runtime `DATABASE_URL` is pooled. Review generated migration SQL before applying it; avoid resetting databases or deleting volumes to fix setup errors. - Startup verifies the migrated schema. `STRICT_SCHEMA_CHECK=true` makes detected drift fatal; otherwise the server logs it and continues. diff --git a/Dockerfile.dev b/Dockerfile.dev index 00f5888d1..debf3df06 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,5 +1,6 @@ # syntax=docker/dockerfile:1.7 +# Base image only; pnpm self-manages to the packageManager version. ARG PNPM_VERSION=11.21.0 ARG NODE_VERSION=24 @@ -15,7 +16,6 @@ ENV NODE_ENV=development \ TURBO_TELEMETRY_DISABLED=1 COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./ -COPY patches ./patches COPY apps/server/package.json ./apps/server/package.json COPY apps/web/package.json ./apps/web/package.json COPY packages/ai/package.json ./packages/ai/package.json @@ -31,6 +31,10 @@ COPY packages/pdf/package.json ./packages/pdf/package.json COPY packages/schema/package.json ./packages/schema/package.json COPY packages/ui/package.json ./packages/ui/package.json COPY packages/utils/package.json ./packages/utils/package.json +COPY packages/docx/package.json ./packages/docx/package.json +COPY packages/mcp/package.json ./packages/mcp/package.json +COPY packages/resume/package.json ./packages/resume/package.json +COPY packages/dsh-plugin/package.json ./packages/dsh-plugin/package.json COPY tooling/package.json ./tooling/package.json RUN --mount=type=cache,id=reactive-resume-dev-pnpm-store,target=/pnpm/store,sharing=locked \ diff --git a/GLOSSARY.md b/GLOSSARY.md index 75d7975fa..a0622506a 100644 --- a/GLOSSARY.md +++ b/GLOSSARY.md @@ -23,7 +23,7 @@ PDF, DOCX, JSON, CSV, API, MCP, oRPC, SSO, CSS, URL, JSON Resume. AI provider names are brand names and stay in English: OpenAI, Anthropic Claude, Google Gemini, Vercel AI Gateway, OpenRouter, Mistral AI, Cohere, xAI Grok, Groq, DeepSeek, Together.ai, -Fireworks, Cerebras, Perplexity, Ollama Cloud. +Fireworks, Cerebras, Perplexity, Ollama. Template names are proper nouns and are never translated: Azurill, Bronzor, Chikorita, Ditgar, Ditto, Gengar, Glalie, Kakuna, Lapras, Leafish, Meowth, Onyx, Pikachu, Rhyhorn, Scizor. @@ -38,8 +38,7 @@ Where a locale's normal word for this document is CV, use CV. **Resumes** — plural of the above. A list of the user's documents. -**Cover letter** — the letter accompanying a resume. Stored as a resume section, not a separate -document. +**Cover letter** — the letter accompanying a resume. Stored as its own document, with optional links to a resume and an application. **Builder** — the editor where a resume is composed. A tool, not a construction worker or a person who builds. @@ -165,7 +164,7 @@ order, not the builder's layout settings. **Blocker, Warning, Tip** — the three severity levels of a finding. **Note** — the label for an informational finding, in -`apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/ats-check.tsx`. A severity label, +the resume editor's Check panel. A severity label, not a written note. Unrelated to **Notes** in the application tracker. **Parse / parsing** — software reading text out of the PDF. @@ -208,7 +207,7 @@ section, above. **Custom** — in `color-picker.tsx`, a user-chosen color as opposed to a preset. An adjective. **Public URL** — the shareable address of a published resume. Use one term consistently; the -English strings say "public URL" rather than "public link". +English interface strings say "Public link"; URL refers to the address itself. ## Redesigned workspace diff --git a/README.md b/README.md index a4d8187fd..693a485e8 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,7 @@ For Docker, the stack includes: - **PostgreSQL** — Database for storing user data and resumes - **SeaweedFS** (optional) — S3-compatible storage for file uploads -> **From v5.1.0 onwards** — PDF generation runs entirely client-side via `@react-pdf/renderer`. New deployments no longer need Browserless, Chromium, or any external print service. The `PRINTER_*` and `BROWSERLESS_*` environment variables are no longer read and can be removed from your `.env`. +> **From v6 onwards** — PDF generation uses Forme in the browser and on the server. New deployments no longer need Browserless, Chromium, or any external print service. The `PRINTER_*` and `BROWSERLESS_*` environment variables are no longer read and can be removed from your `.env`. Pull the latest image from Docker Hub or GitHub Container Registry: diff --git a/apps/server/src/app-version.ts b/apps/server/src/app-version.ts index 375c5bb8e..041e3b2e0 100644 --- a/apps/server/src/app-version.ts +++ b/apps/server/src/app-version.ts @@ -1 +1,4 @@ -export const appVersion = typeof __APP_VERSION__ === "undefined" ? "0.0.0" : __APP_VERSION__; +// @boundaries-ignore root release metadata +import { version } from "../../../package.json"; + +export const appVersion = typeof __APP_VERSION__ === "undefined" ? version : __APP_VERSION__; diff --git a/apps/server/src/http/app.ts b/apps/server/src/http/app.ts index f6207de66..6d9377a48 100644 --- a/apps/server/src/http/app.ts +++ b/apps/server/src/http/app.ts @@ -58,7 +58,7 @@ export function createApp(options: AppOptions = {}) { app.all("/api/openapi", (c) => handleOpenApi(c.req.raw, client(c))); app.all("/api/openapi/*", (c) => handleOpenApi(c.req.raw, client(c))); app.get("/api/auth/oauth", (c) => handleOAuth(c.req.raw)); - app.all("/api/auth/*", (c) => handleAuth(c.req.raw)); + app.all("/api/auth/*", (c) => handleAuth(c.req.raw, client(c))); app.get("/api/health", () => handleHealth()); app.get("/api/resumes/:username/:slug/pdf", (c) => handlePublicResumePdf(c.req.raw, c.req.param("username"), c.req.param("slug"), client(c)), diff --git a/apps/server/src/http/auth.test.ts b/apps/server/src/http/auth.test.ts index e42f54cba..6ecefeada 100644 --- a/apps/server/src/http/auth.test.ts +++ b/apps/server/src/http/auth.test.ts @@ -36,6 +36,25 @@ beforeEach(() => { }); describe("handleAuth", () => { + it.each(["203.0.113.9", "unknown"])("uses only the adapter's client address (%s)", async (trustedClient) => { + const { handleAuth } = await import("./auth"); + await handleAuth( + new Request("http://localhost:3000/api/auth/get-session", { + headers: { + "cf-connecting-ip": "198.51.100.1", + "true-client-ip": "198.51.100.2", + "x-forwarded-for": "198.51.100.3, 192.0.2.1", + "x-real-ip": "198.51.100.4", + }, + }), + trustedClient, + ); + const request = mocks.handler.mock.calls[0]?.[0] as Request; + expect(request.headers.get("cf-connecting-ip")).toBeNull(); + expect(request.headers.get("true-client-ip")).toBeNull(); + expect(request.headers.get("x-forwarded-for")).toBeNull(); + expect(request.headers.get("x-real-ip")).toBe(trustedClient === "unknown" ? null : trustedClient); + }); it.for([null, false, 42, "client", [], [{ redirect_uris: [] }]])( "rejects non-object registration payload %j", async (body) => { diff --git a/apps/server/src/http/auth.ts b/apps/server/src/http/auth.ts index bb4c339ec..cb760cad3 100644 --- a/apps/server/src/http/auth.ts +++ b/apps/server/src/http/auth.ts @@ -1,6 +1,8 @@ +import { isIP } from "node:net"; import { APIError } from "better-auth/api"; import { auth } from "@reactive-resume/auth/config"; import { env } from "@reactive-resume/env/server"; +import { TRUSTED_IP_HEADERS } from "@reactive-resume/utils/rate-limit"; import { isAllowedOAuthRedirectUri } from "@reactive-resume/utils/url-security.node"; const oauthAuthorizeSanitizedParams = [ @@ -134,7 +136,12 @@ async function validateDynamicClientRegistrationRequest(request: Request): Promi } } -export async function handleAuth(request: Request) { +export async function handleAuth(incomingRequest: Request, trustedClient = "unknown") { + // Only the server adapter may supply the client address. Never forward client-sent proxy headers to auth. + const headers = new Headers(incomingRequest.headers); + for (const name of TRUSTED_IP_HEADERS) headers.delete(name); + if (isIP(trustedClient)) headers.set("X-Real-IP", trustedClient); + const request = new Request(incomingRequest, { headers }); const registrationValidationError = await validateDynamicClientRegistrationRequest(request); if (registrationValidationError) return registrationValidationError; diff --git a/apps/server/src/http/health.test.ts b/apps/server/src/http/health.test.ts index e8e45bbc4..103c1f75b 100644 --- a/apps/server/src/http/health.test.ts +++ b/apps/server/src/http/health.test.ts @@ -1,9 +1,10 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -const { execute, healthcheck } = vi.hoisted(() => ({ execute: vi.fn(), healthcheck: vi.fn() })); +const { execute, healthcheck, ping } = vi.hoisted(() => ({ execute: vi.fn(), healthcheck: vi.fn(), ping: vi.fn() })); vi.mock("@reactive-resume/db/client", () => ({ db: { execute } })); vi.mock("@reactive-resume/api/features/storage", () => ({ getStorageService: () => ({ healthcheck }) })); +vi.mock("@reactive-resume/db/redis", () => ({ getRedis: () => ({ ping }) })); import { handleHealth } from "./health"; @@ -11,16 +12,17 @@ describe("health failure reporting", () => { beforeEach(() => { execute.mockResolvedValue([]); healthcheck.mockResolvedValue({ status: "healthy" }); + ping.mockResolvedValue("PONG"); }); afterEach(() => { vi.restoreAllMocks(); }); - it.each(["database", "storage"])("keeps thrown %s error details in server logs only", async (dependency) => { + it.each(["database", "storage", "redis"])("keeps thrown %s error details in server logs only", async (dependency) => { const detail = "Connection failed for private-user at internal.example:5432"; const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); - (dependency === "database" ? execute : healthcheck).mockRejectedValueOnce(new Error(detail)); + ({ database: execute, storage: healthcheck, redis: ping })[dependency]?.mockRejectedValueOnce(new Error(detail)); const response = await handleHealth(); const body = await response.json(); diff --git a/apps/server/src/http/health.ts b/apps/server/src/http/health.ts index 240c85246..96c333847 100644 --- a/apps/server/src/http/health.ts +++ b/apps/server/src/http/health.ts @@ -77,7 +77,7 @@ export async function handleHealth() { }; if (status === "unhealthy") { - console.warn("[Healthcheck]", { route: "/api/health", database, storage }); + console.warn("[Healthcheck]", { route: "/api/health", database, storage, ...(redis ? { redis } : {}) }); } return Response.json(checks, { status: checks.status === "unhealthy" ? 503 : 200 }); diff --git a/apps/server/src/mcp/auth.test.ts b/apps/server/src/mcp/auth.test.ts new file mode 100644 index 000000000..5962657a9 --- /dev/null +++ b/apps/server/src/mcp/auth.test.ts @@ -0,0 +1,24 @@ +import { beforeEach, expect, it, vi } from "vitest"; + +const resolve = vi.hoisted(() => vi.fn()); +vi.mock("@reactive-resume/api/context", () => ({ resolveUserFromRequestHeaders: resolve })); + +import { AuthError, authenticateRequest } from "./auth"; + +beforeEach(() => resolve.mockReset()); +it("resolves MCP credentials through the shared API auth policy without accepting cookies", async () => { + resolve.mockResolvedValue({ id: "user-1" }); + await authenticateRequest( + new Request("https://resume.example/mcp", { + headers: { authorization: "Bearer valid-token", "x-api-key": "expired-key", cookie: "session=browser" }, + }), + ); + const headers = resolve.mock.calls[0]?.[0] as Headers; + expect(headers.get("authorization")).toBe("Bearer valid-token"); + expect(headers.get("x-api-key")).toBe("expired-key"); + expect(headers.has("cookie")).toBe(false); +}); +it("rejects requests when shared credential resolution finds no user", async () => { + resolve.mockResolvedValue(null); + await expect(authenticateRequest(new Request("https://resume.example/mcp"))).rejects.toBeInstanceOf(AuthError); +}); diff --git a/apps/server/src/mcp/auth.ts b/apps/server/src/mcp/auth.ts index 53dbef5de..474ec3ce3 100644 --- a/apps/server/src/mcp/auth.ts +++ b/apps/server/src/mcp/auth.ts @@ -1,20 +1,4 @@ -import { auth, verifyOAuthToken } from "@reactive-resume/auth/config"; - -const OAUTH_WARN_THROTTLE_MS = 60_000; -let lastOAuthWarnAt = 0; - -function warnOAuthThrottled(message: string, detail?: unknown): void { - const now = Date.now(); - if (now - lastOAuthWarnAt < OAUTH_WARN_THROTTLE_MS) return; - lastOAuthWarnAt = now; - - if (detail !== undefined) { - console.warn(message, detail); - return; - } - - console.warn(message); -} +import { resolveUserFromRequestHeaders } from "@reactive-resume/api/context"; export class AuthError extends Error { constructor() { @@ -23,28 +7,9 @@ export class AuthError extends Error { } export async function authenticateRequest(request: Request): Promise { - const authHeader = request.headers.get("authorization"); - - if (authHeader?.startsWith("Bearer ")) { - try { - const payload = await verifyOAuthToken(authHeader.slice(7)); - if (payload?.sub) return; - warnOAuthThrottled("[MCP] OAuth token verified but missing `sub` claim"); - } catch (error) { - warnOAuthThrottled("[MCP] OAuth token verification failed:", error); - } - } - - const apiKey = request.headers.get("x-api-key"); - - if (apiKey) { - try { - const result = await auth.api.verifyApiKey({ body: { key: apiKey } }); - if (result.valid) return; - } catch { - // Invalid or malformed key; fall through to AuthError. - } - } - + // MCP accepts API keys and bearer tokens; share their priority and validation with its oRPC tools. + const headers = new Headers(request.headers); + headers.delete("cookie"); + if (await resolveUserFromRequestHeaders(headers)) return; throw new AuthError(); } diff --git a/apps/server/src/mcp/server.ts b/apps/server/src/mcp/server.ts index e64c45855..a78520505 100644 --- a/apps/server/src/mcp/server.ts +++ b/apps/server/src/mcp/server.ts @@ -38,7 +38,7 @@ export function createMcpServer(request: Request) { `Read schema at \`resume://_meta/schema\`; read resume JSON via \`resume://{id}\` or \`${MCP_TOOL_NAME.getResume}\`.`, `Apply body edits with JSON Patch through \`${MCP_TOOL_NAME.patchResume}\`.`, `Change name, slug, tags, or public visibility with \`${MCP_TOOL_NAME.updateResume}\` (returns canonical share URL; anonymous access only when \`isPublic\` is true; passwords are managed in the web app only).`, - `Create short-lived authenticated PDF download URLs with \`${MCP_TOOL_NAME.downloadResumePdf}\`; set target to \`cover-letter\` to export a visible cover letter separately.`, + `Create short-lived authenticated PDF download URLs with \`${MCP_TOOL_NAME.downloadResumePdf}\`. Export letters separately with \`${MCP_TOOL_NAME.exportCoverLetter}\`.`, `Import full ResumeData JSON with \`${MCP_TOOL_NAME.importResume}\`.`, ].join(" "), }); diff --git a/apps/server/src/openapi/generator.test.ts b/apps/server/src/openapi/generator.test.ts index 69a9e5e74..49539fcc1 100644 --- a/apps/server/src/openapi/generator.test.ts +++ b/apps/server/src/openapi/generator.test.ts @@ -69,6 +69,10 @@ function findImpossibleRequestSchemas(spec: GeneratedSpecView) { } describe("generateOpenApiSpec", () => { + it("keeps instance homepage resolution out of the public API", async () => { + const spec = (await generateSpec()) as GeneratedSpecView; + expect(spec.paths).not.toHaveProperty("/resume/getRoot"); + }, 15_000); it("uses the canonical input-side ResumeData schema in update requests", async () => { const spec = (await generateSpec()) as GeneratedSpecView; const { $schema: _dialect, ...canonicalInputSchema } = createResumeDataJsonSchema(); diff --git a/apps/server/src/static/uploads-local.test.ts b/apps/server/src/static/uploads-local.test.ts new file mode 100644 index 000000000..b9e0e3fc2 --- /dev/null +++ b/apps/server/src/static/uploads-local.test.ts @@ -0,0 +1,44 @@ +import { mkdtemp, rm, stat } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterAll, beforeAll, expect, it, vi } from "vitest"; + +const envMock = vi.hoisted(() => ({ + APP_URL: "https://resume.example.com", + STORAGE_BACKEND: "local", + LOCAL_STORAGE_PATH: "", +})); +vi.mock("@reactive-resume/env/server", () => ({ env: envMock })); + +let storage: ReturnType; +let handleUpload: typeof import("./uploads").handleUpload; +beforeAll(async () => { + envMock.LOCAL_STORAGE_PATH = await mkdtemp(join(tmpdir(), "resume-private-upload-")); + storage = (await import("@reactive-resume/api/features/storage")).getStorageService(); + ({ handleUpload } = await import("./uploads")); +}); +afterAll(async () => { + await rm(envMock.LOCAL_STORAGE_PATH, { recursive: true, force: true }); +}); + +it("stores a private local attachment for authenticated reads and excludes it from public uploads", async () => { + const key = "uploads/user-1/agent/thread-1/attachment-1"; + const data = new TextEncoder().encode("private attachment"); + await storage.write({ key, data, contentType: "text/plain", private: true }); + const stored = await storage.read(key); + expect(stored).not.toBeNull(); + expect(Uint8Array.from(stored?.data ?? [])).toEqual(data); + if (process.platform !== "win32") + expect((await stat(join(envMock.LOCAL_STORAGE_PATH, key))).mode & 0o777).toBe(0o600); + expect((await handleUpload(new Request(`${envMock.APP_URL}/api/${key}`))).status).toBe(404); +}); + +it.each(["uploads/user-1/pictures/private", "uploads/../agent/thread-1/private", "uploads/user-1/agent/../private"])( + "rejects private writes outside the canonical attachment namespace: %s", + async (key) => { + await expect( + storage.write({ key, data: new Uint8Array([1]), contentType: "text/plain", private: true }), + ).rejects.toThrow(); + expect(await storage.read(key)).toBeNull(); + }, +); diff --git a/apps/web/locales/af-ZA.po b/apps/web/locales/af-ZA.po index d86b4b8a5..c23c12924 100644 --- a/apps/web/locales/af-ZA.po +++ b/apps/web/locales/af-ZA.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} aansoeke gevolg" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Voeg by pyplyn" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Voeg twee of drie reëls bo-aan by wat beskryf wat jy doen." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Vermy swaar letterspasiëring-effekte, en voer dan weer uit." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Toets tans…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Maak toe" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Kon nie hierdie koppeling voltooi nie. Begin die koppeling weer vanaf jo msgid "Could not generate the DOCX. Please try again." msgstr "Kon nie die DOCX skep nie. Probeer asseblief weer." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Pasgemaakte afdelings" msgid "Custom Styles" msgstr "Pasgemaakte style" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tsjeggies" @@ -2500,6 +2503,7 @@ msgstr "Graad" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Vee uit" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Uitgevoerde pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japanees" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Regsinligting" @@ -5525,6 +5550,10 @@ msgstr "maak in nuwe oortjie oop" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Plak vul die velde outomaties in." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Reghoek (volle breedte)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Herhaal stylbladwysiging" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Onthou jy jou wagwoord? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Afstand, Hibriede, ’n stad…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Verwyder merker" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Bespaar hoofletters vir kort opskrifte. Dit vertraag lees en kan hoofletter-sensitiewe soektogte verongeluk." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Herstel wagwoord" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Herstel jou wagwoord" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotasie" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Voer weer uit" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Stoor neem langer as verwag. Jou veranderinge is steeds daar." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Dieselfde reël herhaal op elke bladsy." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Hierdie koppelingsversoek is ongeldig of het verval." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Ongedaan maak" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Maak stylbladwysiging ongedaan" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Besig om wagwoord te verifieer..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verifiëring van jou e-pos is vereis wanneer jy jou wagwoord herstel." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/am-ET.po b/apps/web/locales/am-ET.po index 4da00e779..488436d35 100644 --- a/apps/web/locales/am-ET.po +++ b/apps/web/locales/am-ET.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} ማመልከቻዎች ተከታትለዋል" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "ወደ ሂደቱ ያክሉ" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "ምን እንደሚሰሩ የሚገልጹ ሁለት ወይም ሶስት መስመሮችን ከላይ ይጨምሩ።" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "ከባድ የፊደላት-ክፍተት ተጽዕኖዎችን ያስወግዱ፣ ከዚያም እንደገና ወደ ውጭ ይላኩ።" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "በማረጋገጥ ላይ…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "ዝጋ" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "ይህን ግንኙነት ማጠናቀቅ አልተቻለም። ግን msgid "Could not generate the DOCX. Please try again." msgstr "DOCX መፍጠር አልተቻለም። እባክዎ እንደገና ይሞክሩ።" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "ብጁ ክፍሎች" msgid "Custom Styles" msgstr "ብጁ ቅጦች" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "ቼክኛ" @@ -2500,6 +2503,7 @@ msgstr "ዲግሪ" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "ሰርዝ" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "ወደ ውጭ የተላከ የ pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "ጃፓንኛ" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "ሕጋዊ" @@ -5525,6 +5550,10 @@ msgstr "በአዲስ ታብ ይከፈታል" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "መለጠፍ መስኮቹን በራስ-ሰር ይሞላል።" msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "አክታ (ሙሉ ወፍር)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "የቅጥ ሉህ አርትዖትን ድገም" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "የይለፍ ቃልዎን ያስታውሳሉ? <0/>" msgid "Remote, Hybrid, a city…" msgstr "ርቀት, ሃይብሪድ, ከተማ…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "መለያ አስወግድ" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "አቢይ ሆሄያትን ለአጫጭር ርዕሶች ብቻ ይያዙ። ንባብን ያዘገዩና ጉዳይ-ተኮር ፍለጋን ሊያከሽፉ ይችላሉ።" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "የይለፍ ቃል ዳግም አስጀምር" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "የይለፍ ቃልዎን ዳግም ያስጀምሩ" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "ማሽከርከር" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "እንደገና ያሂዱ" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "ቁጠባ ከተጠበቀው በላይ እየወሰደ ነው። የእርስዎ ለውጦች አሁንም ክፍት ናቸው።" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "ተመሳሳይ መስመር በእያንዳንዱ ገጽ ላይ ይደጋገማል።" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "ይህ የግንኙነት ጥያቄ ልክ ያልሆነ ወይም ጊዜ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "ቀልብስ" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "የቅጥ ሉህ አርትዖትን ቀልብስ" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "የይለፍ ቃል በማረጋገጥ ላይ…" #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "የይለፍ ቃል ለመዳግም ኢሜል ማረጋገጥ ያስፈልጋል።" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ar-SA.po b/apps/web/locales/ar-SA.po index 6b82df905..c908ad118 100644 --- a/apps/web/locales/ar-SA.po +++ b/apps/web/locales/ar-SA.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "تم تتبع {0} طلبات" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "أضف إلى المسار" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "أضف سطرين أو ثلاثة في الأعلى تصف فيها ما تقوم به." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "تجنّب تأثيرات التباعد الكبير بين الأحرف، ثم أعد التصدير." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "جارٍ الفحص…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "إغلاق" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "لا يمكن إكمال هذا الاتصال. أعد تشغيل الا msgid "Could not generate the DOCX. Please try again." msgstr "تعذّر إنشاء ملف DOCX. يرجى المحاولة مرة أخرى." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "أقسام مخصصة" msgid "Custom Styles" msgstr "أنماط مخصصة" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "التشيكية" @@ -2500,6 +2503,7 @@ msgstr "الدرجة" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "حذف" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "تم تصدير ملف pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "اليابانية" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "قانوني" @@ -5525,6 +5550,10 @@ msgstr "يفتح في علامة تبويب جديدة" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "اللصق يملأ الحقول تلقائياً." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "مستطيل (عرض كامل)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "إعادة تحرير ورقة الأنماط" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "تتذكر كلمة المرور؟ <0/>" msgid "Remote, Hybrid, a city…" msgstr "عن بُعد، هجين، مدينة…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "إزالة الوسم" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "اقصر الأحرف الكبيرة على العناوين القصيرة. فهي تبطئ القراءة ويمكن أن تُفشل البحث الحساس لحالة الأحرف." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "إعادة تعيين كلمة المرور" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "إعادة تعيين كلمة المرور" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "الدوران" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "تشغيل مرة أخرى" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "يستغرق الادخار وقتًا أطول من المتوقع. التغييرات الخاصة بك لا تزال مفتوحة." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "يتكرر السطر نفسه في كل صفحة." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "طلب الاتصال هذا غير صالح أو انتهت صلاحي msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "التراجع" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "التراجع عن تعديل ورقة الأنماط" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "جاري التحقق من كلمة المرور..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "التحقق من بريدك الإلكتروني مطلوب عند إعادة تعيين كلمة المرور." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/az-AZ.po b/apps/web/locales/az-AZ.po index 9fe14cec2..e6fbd04f3 100644 --- a/apps/web/locales/az-AZ.po +++ b/apps/web/locales/az-AZ.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} müraciət izlənilir" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Prosesə əlavə edin" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Yuxarı hissəyə nə etdiyinizi təsvir edən iki-üç sətir əlavə edin." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Ağır hərflərarası boşluq effektlərindən çəkinin, sonra yenidən ixrac edin." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Yoxlanılır…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Bağlayın" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Bu əlaqəni tamamlamaq mümkün olmadı. Müştərinizdən əlaqəni ye msgid "Could not generate the DOCX. Please try again." msgstr "DOCX yaradıla bilmədi. Zəhmət olmasa, yenidən cəhd edin." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Xüsusi Bölmələr" msgid "Custom Styles" msgstr "Xüsusi Stillər" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Çex" @@ -2500,6 +2503,7 @@ msgstr "Dərəcə" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Sil" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png ixrac edildi" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Yapon" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Hüquqi" @@ -5525,6 +5550,10 @@ msgstr "yeni vərəqdə açılır" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Yapışdırma sahələri avtomatik doldurur." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Düzbucaqlı (Tam En)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Stil cədvəli redaktəsini yenidən edin" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Şifrənizi xatırlayırsınız? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Uzaqdan, Hibrid, şəhər…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Etiketi sil" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Böyük hərfləri yalnız qısa başlıqlar üçün saxlayın. Onlar oxumağı yavaşladır və hərf registrinə həssas axtarışı poza bilər." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Parolu Sıfırla" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Parolunuzu sıfırlayın" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Döndürmə" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Yenidən işə sal" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Qənaət gözlənildiyindən daha uzun çəkir. Dəyişiklikləriniz hələ də açıqdır." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Eyni sətir hər səhifədə təkrarlanır." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Bu əlaqə sorğusu etibarsızdır və ya vaxtı keçib." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Geri al" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Stil cədvəli düzəlişini geri qaytarın" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Parol yoxlanılır..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Parolunuzu sıfırlayarkən e‑poçtunuzu təsdiqləməyiniz tələb olunur." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/bg-BG.po b/apps/web/locales/bg-BG.po index 52ea72e06..05fe00f27 100644 --- a/apps/web/locales/bg-BG.po +++ b/apps/web/locales/bg-BG.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} проследени кандидатури" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Добавяне към процеса" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Добавете два или три реда в началото, описващи с какво се занимавате." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Избягвайте силни ефекти на разредка между буквите, след което експортирайте отново." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Проверка…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "затвори" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Тази връзка не можа да се осъществи. Рес msgid "Could not generate the DOCX. Please try again." msgstr "DOCX файлът не можа да бъде генериран. Моля, опитайте отново." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Потребителски раздели" msgid "Custom Styles" msgstr "Персонализирани стилове" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Чешки" @@ -2500,6 +2503,7 @@ msgstr "Степен" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Изтриване" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Експортиран pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Японски" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Правна информация" @@ -5525,6 +5550,10 @@ msgstr "отваря се в нов раздел" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Поставянето попълва полетата автомати msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Правоъгълник (пълна ширина)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Възстановяване на редакцията на стиловия лист" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Спомняте ли си паролата? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Дистанционно, хибридно, град…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Премахване на етикет" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Запазете главните букви за кратки заглавия. Те забавят четенето и могат да провалят търсене с чувствителност към регистъра." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Нулиране на паролата" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Нулирайте паролата си" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Завъртане" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Изпълнете отново" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Запазването отнема повече време от очакваното. Вашите промени все още са отворени." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Един и същ ред се повтаря на всяка страница." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Тази заявка за връзка е невалидна или е msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Отмяна" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Отмяна на редакцията на стиловия лист" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Потвърждаване на паролата..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Потвърждаването на имейла е задължително при нулиране на паролата." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/bn-BD.po b/apps/web/locales/bn-BD.po index 389d4159d..da30b0bab 100644 --- a/apps/web/locales/bn-BD.po +++ b/apps/web/locales/bn-BD.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0}টি আবেদন ট্র্যাক করা হয়েছে" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "পাইপলাইনে যোগ করুন" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "শীর্ষে দুই বা তিন লাইনে আপনি কী করেন তা বর্ণনা করুন।" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "ভারী লেটার-স্পেসিং এফেক্ট এড়িয়ে চলুন, তারপর পুনরায় এক্সপোর্ট করুন।" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "চেক করা হচ্ছে…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "বন্ধ" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "এই সংযোগ সম্পূর্ণ করা যায় msgid "Could not generate the DOCX. Please try again." msgstr "DOCX তৈরি করা যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "কাস্টম বিভাগসমূহ" msgid "Custom Styles" msgstr "কাস্টম স্টাইল" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "চেক" @@ -2500,6 +2503,7 @@ msgstr "ডিগ্রি" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "মুছে ফেলুন" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "রপ্তানিকৃত pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "জাপানি" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "আইনি" @@ -5525,6 +5550,10 @@ msgstr "নতুন ট্যাবে খুলবে" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "পেস্ট করলে ঘরগুলো স্বয়ংক্ msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "আয়তক্ষেত্র (পূর্ণ প্রস্থ)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "স্টাইলশীট সম্পাদনা পুনরায় করুন" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "আপনার পাসওয়ার্ড মনে আছে? <0/> msgid "Remote, Hybrid, a city…" msgstr "রিমোট, হাইব্রিড, একটি শহর…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "ট্যাগ সরান" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "সংক্ষিপ্ত শিরোনামের জন্য বড় হাতের অক্ষর সংরক্ষণ রাখুন। এগুলো পড়া ধীর করে দেয় এবং কেস-সংবেদনশীল সার্চ ব্যর্থ করতে পারে।" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "পাসওয়ার্ড রিসেট করুন" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "আপনার পাসওয়ার্ড রিসেট করুন" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "রোটেশন" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "আবার চালান" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "সংরক্ষণ প্রত্যাশার চেয়ে বেশি সময় নিচ্ছে। আপনার পরিবর্তনগুলি এখনও খোলা আছে।" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "একই লাইন প্রতিটি পৃষ্ঠায় পুনরাবৃত্তি হয়।" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "এই সংযোগ অনুরোধটি অবৈধ বা ম msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "পূর্বাবস্থায় ফেরান" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "স্টাইলশীট সম্পাদনা পূর্বাবস্থায় ফেরান" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "পাসওয়ার্ড যাচাই করা হচ্ছে..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "পাসওয়ার্ড রিসেট করার সময় আপনার ইমেইল যাচাই করা বাধ্যতামূলক।" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ca-ES.po b/apps/web/locales/ca-ES.po index 4c3c17c04..f8298ff47 100644 --- a/apps/web/locales/ca-ES.po +++ b/apps/web/locales/ca-ES.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} sol·licituds en seguiment" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Afegeix al pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Afegeix dues o tres línies a dalt que descriguin què fas." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Evita efectes pesants d'espaiat entre lletres i torna a exportar." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Comprovant…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Tanca" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "No s'ha pogut completar aquesta connexió. Reinicia la connexió des del msgid "Could not generate the DOCX. Please try again." msgstr "No s'ha pogut generar el DOCX. Torna-ho a provar." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Seccions personalitzades" msgid "Custom Styles" msgstr "Estils personalitzats" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Txec" @@ -2500,6 +2503,7 @@ msgstr "Titulació" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Suprimeix" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "S'ha exportat pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonès" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Legal" @@ -5525,6 +5550,10 @@ msgstr "s’obre en una pestanya nova" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "En enganxar-la, els camps s'omplen automàticament." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rectangle (amplada completa)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Refés l'edició del full d'estils" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Recordeu la contrasenya? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remot, híbrid, una ciutat…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Elimina l’etiqueta" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserva les majúscules per a encapçalaments curts. Alenteixen la lectura i poden fer fallar les cerques sensibles a majúscules." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Restableix la contrasenya" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Restableix la contrasenya" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotació" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Torna a executar" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "El desament està trigant més del previst. Els teus canvis continuen oberts." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "La mateixa línia es repeteix a cada pàgina." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Aquesta sol·licitud de connexió no és vàlida o ha caducat." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Desfer" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Desfés l'edició del full d'estils" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "S’està verificant la contrasenya..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verificar el correu electrònic és necessari per restablir la contrasenya." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/cs-CZ.po b/apps/web/locales/cs-CZ.po index 302ff9613..43bb9c59e 100644 --- a/apps/web/locales/cs-CZ.po +++ b/apps/web/locales/cs-CZ.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "Sledováno {0} žádostí" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Přidat do procesu" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Přidejte na začátek dva až tři řádky popisující, čím se zabýváte." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Vyhněte se výrazným efektům prostrkání písma a poté znovu exportujte." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Kontroluje se…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Zavřít" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Toto připojení nelze dokončit. Restartujte připojení ze svého klie msgid "Could not generate the DOCX. Please try again." msgstr "Nepodařilo se vytvořit DOCX. Zkuste to prosím znovu." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Vlastní sekce" msgid "Custom Styles" msgstr "Vlastní styly" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Čeština" @@ -2500,6 +2503,7 @@ msgstr "Titul" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Odstranit" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Exportovaný soubor pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonština" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Právní informace" @@ -5525,6 +5550,10 @@ msgstr "otevře se na nové kartě" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Vložením se pole vyplní automaticky." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Obdélník (plná šířka)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Znovu upravit stylový list" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Vzpomínáte si na heslo? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Vzdáleně, hybridně, město…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Odebrat štítek" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Vyhraďte velká písmena pro krátké nadpisy. Zpomalují čtení a mohou zmařit vyhledávání rozlišující velikost písmen." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Obnovit heslo" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Obnovte své heslo" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Otočení" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Spustit znovu" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Ukládání trvá déle, než se očekávalo. Vaše změny jsou stále otevřené." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Stejný řádek se opakuje na každé stránce." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Tento požadavek na připojení je neplatný nebo jeho platnost vypršel msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Zpět" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Zrušit úpravu stylového listu" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Ověřování hesla…" #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Ověření e-mailu je při obnovování hesla povinné." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/da-DK.po b/apps/web/locales/da-DK.po index 6e622a566..71e99a4c1 100644 --- a/apps/web/locales/da-DK.po +++ b/apps/web/locales/da-DK.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} ansøgninger sporet" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Tilføj til pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Tilføj to eller tre linjer øverst, der beskriver, hvad du laver." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Undgå kraftige bogstavmellemrumseffekter, og eksporter derefter igen." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Tjekker…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Luk" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Forbindelsen kunne ikke gennemføres. Start forbindelsen forfra fra din msgid "Could not generate the DOCX. Please try again." msgstr "Kunne ikke generere DOCX-filen. Prøv venligst igen." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Brugerdefinerede afsnit" msgid "Custom Styles" msgstr "Brugerdefinerede stilarter" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tjekkisk" @@ -2500,6 +2503,7 @@ msgstr "Grad" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Slet" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Eksporteret pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japansk" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Juridisk" @@ -5525,6 +5550,10 @@ msgstr "åbner i ny fane" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Indsættelse udfylder felterne automatisk." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rektangel (fuld bredde)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Gentag redigering af stylesheet" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Husker du din adgangskode? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remote, hybrid, en by…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Fjern tag" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserver versaler til korte overskrifter. De sænker læsehastigheden og kan besejre versalfølsom søgning." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Nulstil adgangskode" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Nulstil din adgangskode" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotation" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Kør igen" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Det tager længere tid end forventet at gemme. Dine ændringer er der stadig." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Den samme linje gentages på hver side." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Denne forbindelsesanmodning er ugyldig eller udløbet." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Fortryd" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Fortryd redigering af stylesheet" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verificerer adgangskode..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verificering af din e-mail er påkrævet, når du nulstiller din adgangskode." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/de-DE.po b/apps/web/locales/de-DE.po index e2d780690..aded99340 100644 --- a/apps/web/locales/de-DE.po +++ b/apps/web/locales/de-DE.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} Bewerbungen erfasst" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Zur Pipeline hinzufügen" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Fügen Sie oben zwei oder drei Zeilen hinzu, die beschreiben, was Sie tun." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Vermeiden Sie starke Laufweiten-Effekte und exportieren Sie erneut." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Wird geprüft…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Schließen" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Diese Verbindung konnte nicht abgeschlossen werden. Starten Sie die Verb msgid "Could not generate the DOCX. Please try again." msgstr "Die DOCX-Datei konnte nicht erstellt werden. Bitte versuchen Sie es erneut." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Benutzerdefinierte Abschnitte" msgid "Custom Styles" msgstr "Benutzerdefinierte Stile" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tschechisch" @@ -2500,6 +2503,7 @@ msgstr "Abschluss" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Löschen" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png exportiert" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japanisch" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Rechtliches" @@ -5525,6 +5550,10 @@ msgstr "öffnet in neuem Tab" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Durch das Einfügen werden die Felder automatisch ausgefüllt." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rechteck (volle Breite)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Stylesheet-Bearbeitung wiederholen" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Passwort noch parat? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remote, Hybrid, eine Stadt…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Tag entfernen" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reservieren Sie Großbuchstaben für kurze Überschriften. Sie verlangsamen das Lesen und können die Groß-/Kleinschreibungssuche vereiteln." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Passwort zurücksetzen" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Setzen Sie Ihr Passwort zurück" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Drehung" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Erneut ausführen" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Das Speichern dauert länger als erwartet. Ihre Änderungen sind weiterhin vorhanden." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Dieselbe Zeile wiederholt sich auf jeder Seite." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Diese Verbindungsanfrage ist ungültig oder abgelaufen." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Rückgängig machen" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Stylesheet-Änderung rückgängig machen" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Passwort wird verifiziert..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Die Verifizierung Ihrer E-Mail ist beim Zurücksetzen Ihres Passworts erforderlich." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/el-GR.po b/apps/web/locales/el-GR.po index 4773c1396..18a20fa5c 100644 --- a/apps/web/locales/el-GR.po +++ b/apps/web/locales/el-GR.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} καταγεγραμμένες αιτήσεις" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Προσθήκη στη ροή" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Προσθέστε δύο ή τρεις γραμμές στην κορυφή που περιγράφουν τι κάνετε." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Αποφύγετε έντονα εφέ απόστασης γραμμάτων και μετά επανεξαγάγετε." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Έλεγχος…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Κλείσιμο" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Δεν ήταν δυνατή η ολοκλήρωση αυτής της msgid "Could not generate the DOCX. Please try again." msgstr "Δεν ήταν δυνατή η δημιουργία του DOCX. Προσπαθήστε ξανά." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Προσαρμοσμένες ενότητες" msgid "Custom Styles" msgstr "Προσαρμοσμένα στυλ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Τσεχικά" @@ -2500,6 +2503,7 @@ msgstr "Πτυχίο" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Διαγραφή" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Έγινε εξαγωγή του pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Ιαπωνικά" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Νομικά" @@ -5525,6 +5550,10 @@ msgstr "ανοίγει σε νέα καρτέλα" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Η επικόλληση συμπληρώνει τα πεδία αυτό msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Ορθογώνιο (πλήρους πλάτους)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Επανάληψη επεξεργασίας φύλλου στυλ" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Θυμάστε τον κωδικό σας; <0/>" msgid "Remote, Hybrid, a city…" msgstr "Απομακρυσμένα, Υβριδικά, μια πόλη…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Αφαίρεση ετικέτας" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Χρησιμοποιήστε τα κεφαλαία μόνο για σύντομες επικεφαλίδες. Επιβραδύνουν την ανάγνωση και μπορούν να ματαιώσουν αναζητήσεις με διάκριση πεζών-κεφαλαίων." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Επαναφορά κωδικού πρόσβασης" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Επαναφορά κωδικού πρόσβασης" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Περιστροφή" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Εκτέλεση ξανά" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Η αποθήκευση διαρκεί περισσότερο από το αναμενόμενο. Οι αλλαγές σας είναι ακόμα ανοιχτές." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Η ίδια γραμμή επαναλαμβάνεται σε κάθε σελίδα." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Αυτό το αίτημα σύνδεσης δεν είναι έγκυρ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Ξεκάνω" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Αναίρεση επεξεργασίας φύλλου στυλ" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Γίνεται επαλήθευση κωδικού πρόσβασης..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Η επαλήθευση του email σας είναι απαραίτητη κατά την επαναφορά του κωδικού πρόσβασης." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/en-GB.po b/apps/web/locales/en-GB.po index ef5b935c0..80b9f8c51 100644 --- a/apps/web/locales/en-GB.po +++ b/apps/web/locales/en-GB.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} applications tracked" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Add to pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Add two or three lines at the top describing what you do." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Avoid heavy letter-spacing effects, then re-export." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Checking…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Close" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Could not complete this connection. Restart the connection from your cli msgid "Could not generate the DOCX. Please try again." msgstr "Could not generate the DOCX. Please try again." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Custom Sections" msgid "Custom Styles" msgstr "Custom Styles" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Czech" @@ -2500,6 +2503,7 @@ msgstr "Degree" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Delete" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Exported pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japanese" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Legal" @@ -5525,6 +5550,10 @@ msgstr "opens in new tab" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Pasting fills the fields automatically." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rectangle (Full Width)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Redo stylesheet edit" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Remember your password? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remote, Hybrid, a city…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Remove tag" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Reset Password" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Reset your password" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotation" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Run again" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Saving is taking longer than expected. Your changes are still open." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "The same line repeats on every page." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "This connection request is invalid or has expired." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Undo" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Undo stylesheet edit" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verifying password..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verifying your email is required when resetting your password." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/en-US.po b/apps/web/locales/en-US.po index bcaebfc07..7d38f519f 100644 --- a/apps/web/locales/en-US.po +++ b/apps/web/locales/en-US.po @@ -162,8 +162,8 @@ msgstr "{0} (copy)" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} applications tracked" +msgid "{0} active applications" +msgstr "{0} active applications" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -919,11 +919,6 @@ msgstr "Add to pipeline" msgid "Add to Skills" msgstr "Add to Skills" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "Add to Skills · {0}" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Add two or three lines at the top describing what you do." @@ -1340,11 +1335,6 @@ msgstr "autosaved" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "Available · {0}/{username}/{slug}" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Avoid heavy letter-spacing effects, then re-export." @@ -1682,8 +1672,8 @@ msgid "Checking the exported PDF…" msgstr "Checking the exported PDF…" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Checking…" +msgid "Checking… Copy is available after saving." +msgstr "Checking… Copy is available after saving." #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1782,6 +1772,7 @@ msgstr "Close" msgid "Close {title}" msgstr "Close {title}" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "Close application" @@ -2045,6 +2036,14 @@ msgstr "Could not complete this connection. Restart the connection from your cli msgid "Could not generate the DOCX. Please try again." msgstr "Could not generate the DOCX. Please try again." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "Could not generate the JSON. Please try again." + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "Could not generate the Markdown. Please try again." + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2409,6 +2408,10 @@ msgstr "Custom Sections" msgid "Custom Styles" msgstr "Custom Styles" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "Custom styles aren't applied. Fix these errors to apply them:" + #: src/libs/locale.ts msgid "Czech" msgstr "Czech" @@ -2495,6 +2498,7 @@ msgstr "Degree" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Delete" @@ -2574,6 +2578,10 @@ msgstr "Delete this entry?" msgid "Delete this interview?" msgstr "Delete this interview?" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "Delete this provider?" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "Delete your account?" @@ -2650,8 +2658,8 @@ msgid "Design groups" msgstr "Design groups" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" -msgstr "Design reset to the template defaults" +msgid "Design reset to defaults" +msgstr "Design reset to defaults" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -2780,6 +2788,10 @@ msgstr "Download PDF instead" msgid "Download them" msgstr "Download them" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "Download totals can include repeat clicks." + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3160,10 +3172,6 @@ msgstr "Every term the posting stresses is already there." msgid "Everything" msgstr "Everything" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "Everything was read clearly." - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "Everything you’ve done, on one page." @@ -3238,6 +3246,10 @@ msgstr "Exported PDF: {0}" msgid "Exported pipeline-flow.png" msgstr "Exported pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "Extract this account archive, then import a JSON file from its resumes or letters folder." + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "Extracted from the PDF on the page · reading order" @@ -3913,6 +3925,7 @@ msgstr "Import this file into a free Reactive Resume. Every issue is waiting for msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "Imported" @@ -4064,6 +4077,10 @@ msgstr "It will be deleted for good and can't be restored." msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "It will be removed from the timeline and calendar. This can't be undone." +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "It will no longer sign you in." + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "It will show on the application's timeline and on the calendar." @@ -4096,6 +4113,10 @@ msgstr "Its messages and attachments are deleted. Edits you accepted stay in the msgid "Its own design ({summary})." msgstr "Its own design ({summary})." +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "Its saved key is deleted. Conversations using it need another provider." + #: src/libs/locale.ts msgid "Japanese" msgstr "Japanese" @@ -4366,6 +4387,10 @@ msgstr "Led <0>user research for the onboarding redesign; activation rose fr msgid "Left" msgstr "Left" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Legal" @@ -5520,6 +5545,10 @@ msgstr "opens in new tab" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "Opens the editor on your name. Nothing else to fill in first." +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "Optional for local Ollama" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5740,6 +5769,10 @@ msgstr "Pasting fills the fields automatically." msgid "Pause the list of languages" msgstr "Pause the list of languages" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." @@ -6208,8 +6241,8 @@ msgid "Rectangle (Full Width)" msgstr "Rectangle (Full Width)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Redo stylesheet edit" +msgid "Redo resume change" +msgstr "Redo resume change" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6244,6 +6277,7 @@ msgstr "Remember your password? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remote, Hybrid, a city…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6288,7 +6322,16 @@ msgstr "Remove tag" msgid "Remove the password?" msgstr "Remove the password?" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "Remove this passkey?" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "Remove this photo?" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "Rename" @@ -6354,15 +6397,15 @@ msgstr "Require a password" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "Reset design defaults" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Reset Password" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "Reset to template defaults" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Reset your password" @@ -6474,6 +6517,10 @@ msgstr "Retry saving" msgid "Review" msgstr "Review" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "Review each section before using this resume." + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "Review writing" @@ -6528,6 +6575,10 @@ msgstr "Roomy" msgid "Rotation" msgstr "Rotation" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "Rotation isn't supported by PDF rendering." + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Run again" @@ -6617,6 +6668,11 @@ msgstr "Saved “{trimmed}”" msgid "Saved as an application and linked" msgstr "Saved as an application and linked" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "Saving {0}/{username}/{slug}… Copy is available after saving." + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Saving is taking longer than expected. Your changes are still open." @@ -7825,6 +7881,10 @@ msgstr "The review couldn't finish. Try again." msgid "The same line repeats on every page." msgstr "The same line repeats on every page." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." @@ -7902,6 +7962,10 @@ msgstr "This connection request is invalid or has expired." msgid "This conversation couldn't be opened." msgstr "This conversation couldn't be opened." +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "This document" @@ -8166,8 +8230,8 @@ msgid "Turn on the link to choose an address." msgstr "Turn on the link to choose an address." #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." -msgstr "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." +msgstr "Turn on the public link to count views and downloads. Counts are anonymous." #: src/features/resume/editor/design/template-group.tsx msgid "Two columns" @@ -8282,8 +8346,8 @@ msgid "Undo" msgstr "Undo" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Undo stylesheet edit" +msgid "Undo resume change" +msgstr "Undo resume change" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8419,14 +8483,14 @@ msgstr "Use {minimum} pt margins" msgid "Use {url}" msgstr "Use {url}" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." +msgstr "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." + #: src/features/resume/editor/design/style-groups.tsx msgid "Use a darker shade" msgstr "Use a darker shade" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." -msgstr "Use a month and year, like Mar 2022, or just a year." - #: src/features/ats-checker/messages.ts msgid "Use a plain international form, such as +1 555 010 1234." msgstr "Use a plain international form, such as +1 555 010 1234." @@ -8465,10 +8529,6 @@ msgstr "Use details from “{0}”" msgid "Use lowercase letters, numbers and single dashes." msgstr "Use lowercase letters, numbers and single dashes." -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "Use lowercase letters, numbers, dots, hyphens and underscores." - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "Use one column" @@ -8553,8 +8613,8 @@ msgid "Verifying password..." msgstr "Verifying password..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verifying your email is required when resetting your password." +msgid "Verifying your email confirms that you own this address." +msgstr "Verifying your email confirms that you own this address." #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8917,6 +8977,10 @@ msgstr "You sign in without one" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "You're offline. Reconnect to save your changes before leaving." + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/es-ES.po b/apps/web/locales/es-ES.po index 1c498f231..161fe419f 100644 --- a/apps/web/locales/es-ES.po +++ b/apps/web/locales/es-ES.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} candidaturas registradas" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Añadir al pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Añada dos o tres líneas al principio que describan a qué se dedica." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Evite efectos pronunciados de espaciado entre letras y vuelva a exportar." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Comprobando…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Cerrar" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "No se ha podido completar esta conexión. Reinicia la conexión desde tu msgid "Could not generate the DOCX. Please try again." msgstr "No se pudo generar el DOCX. Inténtalo de nuevo." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Secciones personalizadas" msgid "Custom Styles" msgstr "Estilos personalizados" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Checo" @@ -2500,6 +2503,7 @@ msgstr "Título académico" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Eliminar" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png exportado" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonés" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Aviso legal" @@ -5525,6 +5550,10 @@ msgstr "abrir en una nueva pestaña" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Al pegar, los campos se rellenan automáticamente." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rectángulo (ancho completo)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Rehacer la edición de la hoja de estilos" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "¿Recuerdas tu contraseña? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remoto, híbrido, una ciudad…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Eliminar etiqueta" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserve las mayúsculas para encabezados cortos. Ralentizan la lectura y pueden interferir con búsquedas sensibles a mayúsculas y minúsculas." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Restablecer contraseña" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Restablecer tu contraseña" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotación" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Volver a ejecutar" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "El guardado está tardando más de lo esperado. Tus cambios siguen abiertos." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "La misma línea se repite en todas las páginas." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Esta solicitud de conexión no es válida o ha caducado." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Deshacer" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Deshacer la edición de la hoja de estilos" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verificando contraseña..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verificar tu correo electrónico es obligatorio para restablecer tu contraseña." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/fa-IR.po b/apps/web/locales/fa-IR.po index 01784741f..0c30baa30 100644 --- a/apps/web/locales/fa-IR.po +++ b/apps/web/locales/fa-IR.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} درخواست ثبت‌شده" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "افزودن به مسیر" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "دو یا سه خط در بالای صفحه بنویسید که کارتان را توصیف کند." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "از افکت‌های فاصله‌گذاری زیاد بین حروف پرهیز کنید، سپس دوباره خروجی بگیرید." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "در حال بررسی…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "بستن" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "این اتصال کامل نشد. اتصال را از مشتری خو msgid "Could not generate the DOCX. Please try again." msgstr "ساخت فایل DOCX ممکن نشد. لطفاً دوباره تلاش کنید." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "بخش‌های سفارشی" msgid "Custom Styles" msgstr "سبک‌های سفارشی" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "چکی" @@ -2500,6 +2503,7 @@ msgstr "مدرک" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "حذف" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png خروجی گرفته شد" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "ژاپنی" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "حقوقی" @@ -5525,6 +5550,10 @@ msgstr "در زبانهٔ جدید باز می‌شود" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "جای‌گذاری، فیلدها را به‌طور خودکار پر msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "مستطیل (تمام‌عرض)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "ویرایش استایل‌شیت را دوباره انجام دهید" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "رمز عبور را به خاطر دارید؟ <0/>" msgid "Remote, Hybrid, a city…" msgstr "دورکاری، هیبرید، یک شهر…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "حذف برچسب" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "حروف بزرگ را فقط برای عنوان‌های کوتاه نگه دارید. آن‌ها خواندن را کند می‌کنند و می‌توانند جستجوی حساس به بزرگی و کوچکی حروف را بی‌اثر کنند." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "تنظیم مجدد گذرواژه" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "تنظیم مجدد گذرواژهٔ شما" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "چرخش" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "دوباره اجرا کن" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "ذخیره بیش از حد انتظار طول می کشد. تغییرات شما هنوز باز است." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "همان خط در هر صفحه تکرار می‌شود." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "این درخواست اتصال نامعتبر است یا منقضی msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "لغو" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "ویرایش برگه سبک را لغو کنید" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "در حال تأیید گذرواژه..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "برای تنظیم مجدد گذرواژه، تأیید ایمیل الزامی است." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/fi-FI.po b/apps/web/locales/fi-FI.po index 8979ad1d2..54a967f05 100644 --- a/apps/web/locales/fi-FI.po +++ b/apps/web/locales/fi-FI.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} hakemusta seurannassa" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Lisää prosessiin" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Lisää alkuun kaksi tai kolme riviä, jotka kuvaavat, mitä teet." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Vältä voimakkaita kirjainvälistystehosteita ja vie tiedosto uudelleen." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Tarkistetaan…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Sulje" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Yhteyden muodostamista ei voitu viimeistellä. Aloita yhteyden muodostus msgid "Could not generate the DOCX. Please try again." msgstr "DOCX-tiedostoa ei voitu luoda. Yritä uudelleen." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Mukautetut osiot" msgid "Custom Styles" msgstr "Mukautetut tyylit" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "tšekki" @@ -2500,6 +2503,7 @@ msgstr "Tutkinto" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Poista" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png viety" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "japani" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Oikeudelliset tiedot" @@ -5525,6 +5550,10 @@ msgstr "avautuu uuteen välilehteen" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Liittäminen täyttää kentät automaattisesti." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Suorakulmio (täysi leveys)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Tee tyylitiedoston muokkaus uudelleen" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Muistatko salasanasi? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Etä, hybridi, kaupunki…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Poista tunniste" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Käytä suuraakkosia vain lyhyissä otsikoissa. Ne hidastavat lukemista ja voivat haitata kirjainkoon huomioivaa hakua." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Palauta salasana" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Palauta salasanasi" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Kierrätys" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Suorita uudelleen" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Tallentaminen kestää odotettua kauemmin. Muutoksesi ovat edelleen tallessa." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Sama rivi toistuu jokaisella sivulla." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Tämä yhteyspyyntö on virheellinen tai vanhentunut." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Kumoa" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Kumoa tyylitiedoston muokkaus" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Vahvistetaan salasanaa..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Sähköpostin vahvistus vaaditaan, kun palautat salasanaasi." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/fr-FR.po b/apps/web/locales/fr-FR.po index 8f8bab387..5d0dc3179 100644 --- a/apps/web/locales/fr-FR.po +++ b/apps/web/locales/fr-FR.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} candidatures suivies" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Ajouter au pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Ajoutez deux ou trois lignes en haut décrivant ce que vous faites." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Évitez les effets d'espacement des lettres marqués, puis réexportez." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Vérification…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Fermer" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Impossible d'établir cette connexion. Relancez la connexion depuis votr msgid "Could not generate the DOCX. Please try again." msgstr "Impossible de générer le DOCX. Veuillez réessayer." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Sections personnalisées" msgid "Custom Styles" msgstr "Styles personnalisés" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tchèque" @@ -2500,6 +2503,7 @@ msgstr "Diplôme" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Supprimer" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png exporté" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonais" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Mentions légales" @@ -5525,6 +5550,10 @@ msgstr "s'ouvre dans un nouvel onglet" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Le collage remplit les champs automatiquement." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rectangle (pleine largeur)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Rétablir la modification de la feuille de style" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Vous vous souvenez de votre mot de passe ? <0/>" msgid "Remote, Hybrid, a city…" msgstr "À distance, hybride, une ville…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Supprimer l’étiquette" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Réservez les majuscules aux titres courts. Elles ralentissent la lecture et peuvent mettre en échec une recherche sensible à la casse." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Réinitialiser le mot de passe" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Réinitialisez votre mot de passe" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotation" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Relancer" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "L'enregistrement prend plus de temps que prévu. Vos modifications sont toujours en cours." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "La même ligne se répète sur chaque page." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Cette demande de connexion est invalide ou a expiré." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Défaire" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Annuler la modification de la feuille de style" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Vérification du mot de passe..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "La vérification de votre adresse e-mail est requise lors de la réinitialisation de votre mot de passe." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/he-IL.po b/apps/web/locales/he-IL.po index 64457f6f9..1ecf9fc35 100644 --- a/apps/web/locales/he-IL.po +++ b/apps/web/locales/he-IL.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} מועמדויות במעקב" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "הוסף לתהליך" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "הוסף שתיים או שלוש שורות בראש העמוד שמתארות במה אתה עוסק." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "הימנע מאפקטים כבדים של ריווח אותיות, ולאחר מכן ייצא מחדש." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "בודק…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "סגור" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "לא ניתן היה להשלים את החיבור הזה. הפעל מ msgid "Could not generate the DOCX. Please try again." msgstr "לא ניתן היה ליצור את קובץ ה-DOCX. אנא נסה שוב." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "סעיפים מותאמים אישית" msgid "Custom Styles" msgstr "סגנונות מותאמים אישית" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "צ׳כית" @@ -2500,6 +2503,7 @@ msgstr "תואר" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "מחיקה" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png יוצא" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "יפנית" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "משפטי" @@ -5525,6 +5550,10 @@ msgstr "נפתח בלשונית חדשה" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "ההדבקה ממלאת את השדות אוטומטית." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "מלבן (רוחב מלא)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "בצע שוב עריכת גיליון סגנונות" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "זוכר את הסיסמה? <0/>" msgid "Remote, Hybrid, a city…" msgstr "מרחוק, היברידי, עיר…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "הסר תגית" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "שמור אותיות רישיות לכותרות קצרות בלבד. הן מאטות קריאה ועלולות לשבש חיפוש תלוי-רישיות." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "איפוס סיסמה" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "איפוס הסיסמה שלך" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "סיבוב" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "הרץ שוב" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "השמירה נמשכת זמן רב מהצפוי. השינויים שלך עדיין פתוחים." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "אותה שורה חוזרת בכל עמוד." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "בקשת חיבור זו אינה חוקית או שפג תוקפו." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "לְבַטֵל" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "בטל עריכת גיליון סגנונות" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "מאמת סיסמה..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "אימות הדוא\"ל שלך נדרש בעת איפוס הסיסמה." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/hi-IN.po b/apps/web/locales/hi-IN.po index 105a72dbf..1b51172ba 100644 --- a/apps/web/locales/hi-IN.po +++ b/apps/web/locales/hi-IN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} आवेदन ट्रैक किए गए" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "पाइपलाइन में जोड़ें" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "ऊपर दो या तीन पंक्तियाँ जोड़ें जो बताएँ कि आप क्या करते हैं।" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "भारी लेटर-स्पेसिंग प्रभावों से बचें, फिर दोबारा एक्सपोर्ट करें।" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "जांच हो रही है…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "बंद करें" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "इस कनेक्शन को पूरा नहीं किय msgid "Could not generate the DOCX. Please try again." msgstr "DOCX नहीं बनाया जा सका। कृपया फिर से प्रयास करें।" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "कस्टम अनुभाग" msgid "Custom Styles" msgstr "कस्टम शैलियाँ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "चेक" @@ -2500,6 +2503,7 @@ msgstr "डिग्री" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "हटाएँ" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png निर्यात किया गया" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "जापानी" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "कानूनी" @@ -5525,6 +5550,10 @@ msgstr "नए टैब में खुलता है" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "पेस्ट करने पर फ़ील्ड अपने आ msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "आयत (पूर्ण चौड़ाई)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "स्टाइलशीट संपादन को पुनः करें" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "अपना पासवर्ड याद है? <0/>" msgid "Remote, Hybrid, a city…" msgstr "रिमोट, हाइब्रिड, कोई शहर…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "टैग हटाएँ" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "कैपिटल को केवल छोटे शीर्षकों के लिए रखें। ये पढ़ने की गति धीमी करते हैं और केस-सेंसिटिव खोज को विफल कर सकते हैं।" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "पासवर्ड रीसेट करें" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "अपना पासवर्ड रीसेट करें" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "रोटेशन" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "फिर से चलाएँ" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "बचत में अपेक्षा से अधिक समय लग रहा है. आपके परिवर्तन अभी भी खुले हैं." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "वही पंक्ति हर पेज पर दोहराई जाती है।" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "यह कनेक्शन अनुरोध अमान्य ह msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "पूर्ववत" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "स्टाइलशीट संपादन को पूर्ववत करें" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "पासवर्ड सत्यापित किया जा रहा है..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "अपना पासवर्ड रीसेट करते समय आपका ईमेल सत्यापित करना आवश्यक है।" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/hu-HU.po b/apps/web/locales/hu-HU.po index c2e0f0da8..1c54b4c3b 100644 --- a/apps/web/locales/hu-HU.po +++ b/apps/web/locales/hu-HU.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} jelentkezés nyomon követve" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Hozzáadás a folyamathoz" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Adj hozzá két-három sort a tetejére, amely leírja, mivel foglalkozol." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Kerüld az erős betűköz-effekteket, majd exportáld újra." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Ellenőrzés…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Bezárás" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Nem sikerült befejezni ezt a kapcsolatot. Indítsa újra a kapcsolatot msgid "Could not generate the DOCX. Please try again." msgstr "Nem sikerült létrehozni a DOCX-fájlt. Kérjük, próbálja meg újra." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Egyéni szekciók" msgid "Custom Styles" msgstr "Egyéni stílusok" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "cseh" @@ -2500,6 +2503,7 @@ msgstr "Fokozat" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Törlés" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "A pipeline-flow.png exportálva." +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "japán" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Jogi információk" @@ -5525,6 +5550,10 @@ msgstr "új lapon nyílik meg" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "A beillesztés automatikusan kitölti a mezőket." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Téglalap (teljes szélesség)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Stíluslap szerkesztésének megismétlése" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Emlékszik a jelszavára? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Távoli, hibrid, város…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Címke eltávolítása" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Tartsd fenn a nagybetűket rövid címsoroknak. Lassítják az olvasást, és megzavarhatják a kis- és nagybetűre érzékeny keresést." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Jelszó visszaállítása" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Jelszó visszaállítása" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Forgatás" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Futtatás újra" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "A mentés a vártnál tovább tart. A módosítások továbbra is nyitva állnak." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Ugyanaz a sor ismétlődik minden oldalon." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Ez a csatlakozási kérelem érvénytelen vagy lejárt." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Visszavonás" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Stíluslap szerkesztésének visszavonása" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Jelszó ellenőrzése..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "A jelszó megerősítése kötelező a jelszó visszaállításakor." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/id-ID.po b/apps/web/locales/id-ID.po index bf878ddf1..85730c899 100644 --- a/apps/web/locales/id-ID.po +++ b/apps/web/locales/id-ID.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} lamaran dilacak" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Tambahkan ke pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Tambahkan dua atau tiga baris di bagian atas yang menjelaskan apa yang Anda kerjakan." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Hindari efek spasi antarhuruf yang berat, lalu ekspor ulang." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Memeriksa…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Tutup" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Koneksi ini tidak dapat diselesaikan. Mulai ulang koneksi dari klien And msgid "Could not generate the DOCX. Please try again." msgstr "Tidak dapat membuat DOCX. Silakan coba lagi." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Bagian Kustom" msgid "Custom Styles" msgstr "Gaya Kustom" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Ceko" @@ -2500,6 +2503,7 @@ msgstr "Gelar" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Hapus" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png diekspor" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Jepang" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Hukum" @@ -5525,6 +5550,10 @@ msgstr "terbuka di tab baru" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Menempel akan mengisi kolom secara otomatis." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Persegi Panjang (Lebar Penuh)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Ulangi pengeditan stylesheet" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Ingat kata sandi Anda? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remote, Hybrid, kota…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Hapus tag" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Simpan huruf kapital hanya untuk judul singkat. Huruf kapital memperlambat pembacaan dan dapat mengecoh pencarian yang peka huruf besar/kecil." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Atur Ulang Kata Sandi" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Atur ulang kata sandi Anda" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotasi" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Jalankan lagi" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Penghematan membutuhkan waktu lebih lama dari yang diperkirakan. Perubahan Anda masih terbuka." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Baris yang sama berulang di setiap halaman." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Permintaan koneksi ini tidak valid atau telah kedaluwarsa." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Membuka" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Batalkan pengeditan stylesheet" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Memverifikasi kata sandi..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Memverifikasi email Anda diperlukan saat mengatur ulang kata sandi Anda." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/it-IT.po b/apps/web/locales/it-IT.po index c3c219911..f72d2959c 100644 --- a/apps/web/locales/it-IT.po +++ b/apps/web/locales/it-IT.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} candidature monitorate" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Aggiungi alla pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Aggiungi due o tre righe in alto che descrivano cosa fai." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Evita effetti marcati di spaziatura tra le lettere, quindi esporta di nuovo." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Controllo in corso…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Chiudi" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Impossibile completare questa connessione. Riavvia la connessione dal tu msgid "Could not generate the DOCX. Please try again." msgstr "Impossibile generare il DOCX. Riprova." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Sezioni personalizzate" msgid "Custom Styles" msgstr "Stili personalizzati" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Ceco" @@ -2500,6 +2503,7 @@ msgstr "Titolo di studio" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Elimina" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png esportato" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Giapponese" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Note legali" @@ -5525,6 +5550,10 @@ msgstr "apre in una nuova scheda" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Incollando, i campi vengono compilati automaticamente." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rettangolo (larghezza completa)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Riesegui la modifica del foglio di stile" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Ricordi la tua password? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Da remoto, ibrido, una città…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Rimuovi tag" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Riserva il maiuscolo alle intestazioni brevi. Rallenta la lettura e può vanificare le ricerche sensibili alle maiuscole." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Reimposta password" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Reimposta la tua password" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotazione" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Esegui di nuovo" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Il salvataggio sta richiedendo più tempo del previsto. Le tue modifiche sono ancora aperte." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "La stessa riga si ripete su ogni pagina." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Questa richiesta di connessione non è valida o è scaduta." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Disfare" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Annulla la modifica del foglio di stile" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verifica della password in corso..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "La verifica della tua email è necessaria per reimpostare la password." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ja-JP.po b/apps/web/locales/ja-JP.po index 956ea83ef..8d099d479 100644 --- a/apps/web/locales/ja-JP.po +++ b/apps/web/locales/ja-JP.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} 件の応募を追跡中" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "パイプラインに追加" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "冒頭に、自分の仕事内容を説明する2〜3行を追加してください。" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "文字間隔を大きく広げる効果を避けてから、再エクスポートしてください。" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "チェック中…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "閉じる" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "この接続を完了できませんでした。クライアントから msgid "Could not generate the DOCX. Please try again." msgstr "DOCX を生成できませんでした。もう一度お試しください。" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "カスタムセクション" msgid "Custom Styles" msgstr "スタイルのカスタマイズ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "チェコ語" @@ -2500,6 +2503,7 @@ msgstr "学位" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "削除" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png をエクスポートしました" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "日本語" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "法務" @@ -5525,6 +5550,10 @@ msgstr "新しいタブで開きます" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "貼り付けるとフィールドが自動的に入力されます。" msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "長方形(全幅)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "スタイルシートの編集をやり直す" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "パスワードを思い出しましたか? <0/>" msgid "Remote, Hybrid, a city…" msgstr "リモート、ハイブリッド、都市名…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "タグを削除" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "大文字は短い見出しにのみ使用してください。読む速度が落ち、大文字小文字を区別する検索が機能しなくなることがあります。" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "パスワードをリセット" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "パスワードをリセット" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "回転" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "再実行" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "保存に予想以上に時間がかかっています。変更は保持されています。" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "同じ行がすべてのページに繰り返し表示されています。" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "この接続リクエストは無効か、有効期限が切れていま msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "元に戻す" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "スタイルシートの編集を元に戻す" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "パスワードを確認しています..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "パスワードをリセットするには、メールアドレスの確認が必要です。" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/km-KH.po b/apps/web/locales/km-KH.po index 48cf3e131..9d663265d 100644 --- a/apps/web/locales/km-KH.po +++ b/apps/web/locales/km-KH.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} ពាក្យសុំត្រូវបានតាមដាន" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "បន្ថែមទៅដំណើរការ" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "បន្ថែមពីរឬបីបន្ទាត់នៅខាងលើពិពណ៌នាអំពីអ្វីដែលអ្នកធ្វើ។" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "ជៀសវាងបែបផែនចន្លោះអក្សរធ្ងន់ធ្ងរ រួចនាំចេញម្តងទៀត។" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "កំពុងត្រួតពិនិត្យ…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "បិទ" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "មិនអាចបញ្ចប់ការតភ្ជាប់នេ msgid "Could not generate the DOCX. Please try again." msgstr "មិនអាចបង្កើត DOCX បានទេ។ សូមព្យាយាមម្ដងទៀត។" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "ផ្នែក​ផ្ទាល់ខ្លួន" msgid "Custom Styles" msgstr "រចនាប័ទ្មផ្ទាល់ខ្លួន" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Czech" @@ -2500,6 +2503,7 @@ msgstr "សញ្ញាប័ត្រ" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "លុប" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "បាននាំចេញ pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japanese" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "ផ្នែកច្បាប់" @@ -5525,6 +5550,10 @@ msgstr "បើក​ក្នុង​ផ្ទាំង​ថ្មី" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "ការបិទភ្ជាប់នឹងបំពេញវាលដ msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "ចតុកោណ (ទទឹង​ពេញ)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "ធ្វើការកែសម្រួលសន្លឹករចនាប័ទ្មឡើងវិញ" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "ចាំពាក្យសម្ងាត់របស់អ្នក? < msgid "Remote, Hybrid, a city…" msgstr "ពីចម្ងាយ, កូនកាត់, ទីក្រុង…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "យកស្លាកចេញ" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "ទុកអក្សរធំសម្រាប់ចំណងជើងខ្លីៗប៉ុណ្ណោះ។ វាធ្វើឱ្យអានយឺត ហើយអាចធ្វើឱ្យការស្វែងរកប្រកាន់អក្សរតូចធំបរាជ័យ។" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "កំណត់​ពាក្យសម្ងាត់​ឡើងវិញ" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "កំណត់​ពាក្យសម្ងាត់​របស់​អ្នក​ឡើងវិញ" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "មុំ​បង្វែរ" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "ដំណើរការម្តងទៀត" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "ការសន្សំចំណាយពេលយូរជាងការរំពឹងទុក។ ការផ្លាស់ប្តូររបស់អ្នកនៅតែបើកចំហ។" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "បន្ទាត់ដដែលកើតឡើងម្តងទៀតនៅលើគ្រប់ទំព័រ។" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "សំណើ​តភ្ជាប់​នេះ​មិន​ត្រ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "មិនធ្វើវិញ" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "មិនធ្វើ​ការ​កែសម្រួល​សន្លឹក​រចនាប័ទ្ម​វិញ" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "កំពុង​ផ្ទៀងផ្ទាត់​ពាក្យសម្ងាត់..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "ការផ្ទៀងផ្ទាត់​អ៊ីមែល​ជា​លក្ខខណ្ឌ​ចាំបាច់ នៅ​ពេល​កំណត់​ពាក្យសម្ងាត់​ឡើងវិញ។" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/kn-IN.po b/apps/web/locales/kn-IN.po index 44a92b1f3..f6642e66c 100644 --- a/apps/web/locales/kn-IN.po +++ b/apps/web/locales/kn-IN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} ಅರ್ಜಿಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲಾಗಿದೆ" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "ಪೈಪ್‌ಲೈನ್‌ಗೆ ಸೇರಿಸಿ" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "ನೀವು ಏನು ಮಾಡುತ್ತೀರಿ ಎಂಬುದನ್ನು ವಿವರಿಸುವ ಎರಡು ಅಥವಾ ಮೂರು ಸಾಲುಗಳನ್ನು ಮೇಲ್ಭಾಗದಲ್ಲಿ ಸೇರಿಸಿ." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "ಭಾರೀ ಅಕ್ಷರ-ಅಂತರ ಪರಿಣಾಮಗಳನ್ನು ತಪ್ಪಿಸಿ, ನಂತರ ಮರು-ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡಿ." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "ಮುಚ್ಚಿ" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "ಈ ಸಂಪರ್ಕವನ್ನು ಪೂರ್ಣಗೊಳಿಸಲ msgid "Could not generate the DOCX. Please try again." msgstr "DOCX ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "ಕಸ್ಟಮ್ ವಿಭಾಗಗಳು" msgid "Custom Styles" msgstr "ಕಸ್ಟಮ್ ಶೈಲಿಗಳು" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "ಚೆಕ್" @@ -2500,6 +2503,7 @@ msgstr "ಪದವಿ" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "ಅಳಿಸಿ" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png ರಫ್ತು ಮಾಡಲಾಗಿದೆ" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "ಜಾಪನೀಸ್" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "ಕಾನೂನು" @@ -5525,6 +5550,10 @@ msgstr "ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ತೆರೆಯುತ್ msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "ಅಂಟಿಸಿದರೆ ಕ್ಷೇತ್ರಗಳು ತಾನಾ msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "ಆಯತ (ಪೂರ್ಣ ಅಗಲ)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "ಸ್ಟೈಲ್‌ಶೀಟ್ ಸಂಪಾದನೆಯನ್ನು ಮತ್ತೆ ಮಾಡಿ" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ನೆನಪಿದೆಯ msgid "Remote, Hybrid, a city…" msgstr "ರಿಮೋಟ್, ಹೈಬ್ರಿಡ್, ನಗರ…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "ಟ್ಯಾಗ್ ತೆಗೆದುಹಾಕಿ" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "ದೊಡ್ಡಕ್ಷರಗಳನ್ನು ಚಿಕ್ಕ ಶೀರ್ಷಿಕೆಗಳಿಗೆ ಮಾತ್ರ ಬಳಸಿ. ಅವು ಓದುವಿಕೆಯನ್ನು ನಿಧಾನಗೊಳಿಸುತ್ತವೆ ಮತ್ತು ಕೇಸ್-ಸೆನ್ಸಿಟಿವ್ ಹುಡುಕಾಟವನ್ನು ವಿಫಲಗೊಳಿಸಬಹುದು." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರುಹೊಂದಿಸಿ" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರುಹೊಂದಿಸಿ" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "ಭ್ರಮನ" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "ಮತ್ತೆ ರನ್ ಮಾಡಿ" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "ಉಳಿತಾಯ ನಿರೀಕ್ಷೆಗಿಂತ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತಿದೆ. ನಿಮ್ಮ ಬದಲಾವಣೆಗಳು ಇನ್ನೂ ತೆರೆದಿರುತ್ತವೆ." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "ಅದೇ ಸಾಲು ಪ್ರತಿ ಪುಟದಲ್ಲಿಯೂ ಪುನರಾವರ್ತನೆಯಾಗುತ್ತದೆ." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "ಈ ಸಂಪರ್ಕ ವಿನಂತಿಯು ಅಮಾನ್ಯವಾ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "ರದ್ದುಗೊಳಿಸಿ" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "ಸ್ಟೈಲ್‌ಶೀಟ್ ಸಂಪಾದನೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿ" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "ಪಾಸ್‌ವರ್ಡ್ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸುವಾಗ ನಿಮ್ಮ ಇಮೇಲ್ ಪರಿಶೀಲನೆ ಅಗತ್ಯವಿದೆ." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ko-KR.po b/apps/web/locales/ko-KR.po index ac08f255a..21519d983 100644 --- a/apps/web/locales/ko-KR.po +++ b/apps/web/locales/ko-KR.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0}개 지원 추적 중" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "파이프라인에 추가" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "상단에 본인이 하는 일을 설명하는 두세 줄을 추가하세요." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "강한 자간 효과를 피한 뒤 다시 내보내세요." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "점검 중…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "닫기" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "이 연결을 완료하지 못했습니다. 클라이언트에서 연결 msgid "Could not generate the DOCX. Please try again." msgstr "DOCX를 생성하지 못했습니다. 다시 시도하세요." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "사용자 지정 섹션" msgid "Custom Styles" msgstr "사용자 지정 스타일" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "체코어" @@ -2500,6 +2503,7 @@ msgstr "학위" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "삭제" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png를 내보냈습니다" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "일본어" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "법적 고지" @@ -5525,6 +5550,10 @@ msgstr "새 탭에서 열림" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "붙여넣으면 항목이 자동으로 채워집니다." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "사각형(전체 너비)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "스타일시트 편집 다시 실행" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "비밀번호가 기억나시나요? <0/>" msgid "Remote, Hybrid, a city…" msgstr "원격, 하이브리드, 도시…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "태그 제거" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "대문자는 짧은 제목에만 사용하세요. 읽기 속도를 늦추고 대소문자를 구분하는 검색을 방해할 수 있습니다." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "비밀번호 재설정" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "비밀번호 재설정" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "회전" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "다시 실행" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "저장이 예상보다 오래 걸리고 있습니다. 변경 사항은 그대로 남아 있습니다." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "같은 줄이 모든 페이지에 반복됩니다." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "이 연결 요청이 유효하지 않거나 만료되었습니다." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "끄르다" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "스타일시트 편집 취소" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "비밀번호를 확인하는 중입니다..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "비밀번호를 재설정하려면 이메일 인증이 필요합니다." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/lt-LT.po b/apps/web/locales/lt-LT.po index 8150b5041..51d927ca0 100644 --- a/apps/web/locales/lt-LT.po +++ b/apps/web/locales/lt-LT.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "Stebima {0} paraiškų" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Pridėti į procesą" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Viršuje pridėkite dvi ar tris eilutes, aprašančias, ką dirbate." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Venkite ryškių raidžių tarpų efektų ir eksportuokite iš naujo." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Tikrinama…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Uždaryti" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Nepavyko užbaigti šio ryšio. Iš naujo paleiskite ryšį iš savo kli msgid "Could not generate the DOCX. Please try again." msgstr "Nepavyko sugeneruoti DOCX. Bandykite dar kartą." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Pasirinktiniai skyriai" msgid "Custom Styles" msgstr "Pasirinktiniai stiliai" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Čekų" @@ -2500,6 +2503,7 @@ msgstr "Laipsnis" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Ištrinti" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png eksportuota" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonų" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Teisinė informacija" @@ -5525,6 +5550,10 @@ msgstr "atidaro naujame skirtuke" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Įklijavus laukai užpildomi automatiškai." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Stačiakampis (visas plotis)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Grąžinti stiliaus lapo redagavimą" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Prisimenate slaptažodį? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Nuotolinis, hibridinis, miestas…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Pašalinti žymą" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Didžiąsias raides naudokite tik trumpoms antraštėms. Jos lėtina skaitymą ir gali sutrikdyti raidžių dydį skiriančią paiešką." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Atkurti slaptažodį" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Atkurkite slaptažodį" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Sukimas" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Vykdyti dar kartą" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Taupymas užtrunka ilgiau nei tikėtasi. Jūsų pakeitimai vis dar galioja." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Ta pati eilutė kartojasi kiekviename puslapyje." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Ši ryšio užklausa neteisinga arba pasibaigė." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Atšaukti" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Atšaukti stiliaus lapo redagavimą" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Tikrinamas slaptažodis..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Slaptažodžio atkūrimui būtina patvirtinti el. paštą." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/lv-LV.po b/apps/web/locales/lv-LV.po index 13f7fc74c..fed1b0491 100644 --- a/apps/web/locales/lv-LV.po +++ b/apps/web/locales/lv-LV.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "Izsekoti {0} pieteikumi" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Pievienot procesam" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Pievienojiet augšpusē divas vai trīs rindas, kas apraksta, ko jūs darāt." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Izvairieties no izteiktiem burtu atstarpju efektiem un pēc tam eksportējiet atkārtoti." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Pārbauda…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Aizvērt" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Nevarēja pabeigt šo savienojumu. Restartējiet savienojumu no sava kli msgid "Could not generate the DOCX. Please try again." msgstr "Neizdevās izveidot DOCX. Lūdzu, mēģiniet vēlreiz." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Pielāgotās sadaļas" msgid "Custom Styles" msgstr "Pielāgoti stili" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Čehu" @@ -2500,6 +2503,7 @@ msgstr "Grāds" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Dzēst" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png eksportēts" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japāņu" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Juridiskā informācija" @@ -5525,6 +5550,10 @@ msgstr "atveras jaunā cilnē" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Ielīmējot lauki tiek aizpildīti automātiski." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Taisnstūris (pilns platums)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Atkārtoti veikt stila lapas rediģēšanu" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Atceraties paroli? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Attālināti, hibrīdi, pilsēta…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Noņemt birku" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Lielos burtus izmantojiet tikai īsiem virsrakstiem. Tie palēnina lasīšanu un var traucēt reģistrjutīgu meklēšanu." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Atiestatīt paroli" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Atiestatīt paroli" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotācija" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Palaist vēlreiz" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Saglabāšana aizņem ilgāku laiku, nekā paredzēts. Jūsu izmaiņas joprojām ir atvērtas." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Viena un tā pati rinda atkārtojas katrā lapā." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Šis savienojuma pieprasījums nav derīgs vai ir beidzies." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Atsaukt" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Atsaukt stila lapas rediģēšanu" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verificē paroli..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Paroles atiestatīšanai ir nepieciešama jūsu e-pasta verifikācija." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ml-IN.po b/apps/web/locales/ml-IN.po index ede0e185d..eba635df9 100644 --- a/apps/web/locales/ml-IN.po +++ b/apps/web/locales/ml-IN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} അപേക്ഷകൾ ട്രാക്ക് ചെയ്തു" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "പൈപ്പ്ലൈനിലേക്ക് ചേർക്കു msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "നിങ്ങൾ ചെയ്യുന്നത് വിവരിക്കുന്ന രണ്ടോ മൂന്നോ വരികൾ മുകളിൽ ചേർക്കുക." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "കനത്ത അക്ഷര അകലം ഒഴിവാക്കി, വീണ്ടും എക്സ്പോർട്ട് ചെയ്യുക." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "പരിശോധിക്കുന്നു…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "അടയ്ക്കുക" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "ഈ കണക്ഷൻ പൂർത്തിയാക്കാൻ കഴ msgid "Could not generate the DOCX. Please try again." msgstr "DOCX ഉണ്ടാക്കാനായില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "കസ്റ്റം സെക്ഷനുകൾ" msgid "Custom Styles" msgstr "ഇഷ്ടാനുസൃത ശൈലികൾ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "ചെക്ക്" @@ -2500,6 +2503,7 @@ msgstr "ഡിഗ്രി" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "ഡിലീറ്റ് ചെയ്യുക" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "കയറ്റുമതി ചെയ്ത pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "ജാപ്പനീസ്" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "നിയമപരം" @@ -5525,6 +5550,10 @@ msgstr "പുതിയ ടാബിൽ തുറക്കും" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "ഒട്ടിക്കുമ്പോൾ ഫീൽഡുകൾ സ് msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "ചതുരാകൃതി (പൂർണ്ണ വീതി)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "സ്റ്റൈൽഷീറ്റ് എഡിറ്റ് വീണ്ടും ചെയ്യുക" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "നിങ്ങളുടെ പാസ്‌വേഡ് ഓർമ്മ msgid "Remote, Hybrid, a city…" msgstr "റിമോട്ട്, ഹൈബ്രിഡ്, ഒരു നഗരം…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "ടാഗ് നീക്കംചെയ്യുക" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "ചെറിയ തലക്കെട്ടുകൾക്കായി ക്യാപിറ്റൽസ് നീക്കിവയ്ക്കുക. അവ വായന മന്ദഗതിയിലാക്കുകയും കേസ്-സെൻസിറ്റീവ് തിരയലിനെ പരാജയപ്പെടുത്തുകയും ചെയ്യും." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യുക" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "നിങ്ങളുടെ പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യുക" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "ററോട്ടേഷൻ" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "വീണ്ടും പ്രവർത്തിപ്പിക്കുക" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "ലാഭിക്കാൻ പ്രതീക്ഷിച്ചതിലും കൂടുതൽ സമയമെടുക്കുന്നു. നിങ്ങളുടെ മാറ്റങ്ങൾ ഇപ്പോഴും തുറന്നിരിക്കുന്നു." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "ഒരേ വരി ഓരോ പേജിലും ആവർത്തിക്കുന്നു." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "ഈ കണക്ഷൻ അഭ്യർത്ഥന അസാധുവാ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "പഴയപടിയാക്കുക" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "സ്റ്റൈൽഷീറ്റ് എഡിറ്റ് പഴയപടിയാക്കുക" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "പാസ്‌വേഡ് പരിശോദിക്കുന്നു..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "നിങ്ങളുടെ പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യുമ്പോൾ ഇമെയിൽ സ്ഥിരീകരണം നിർബന്ധമാണ്." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/mr-IN.po b/apps/web/locales/mr-IN.po index 9993286cc..f35fe3fb9 100644 --- a/apps/web/locales/mr-IN.po +++ b/apps/web/locales/mr-IN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} अर्ज ट्रॅक केले" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "पाइपलाइनमध्ये जोडा" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "तुम्ही काय करता हे सांगणाऱ्या दोन किंवा तीन ओळी वर जोडा." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "जड अक्षर-अंतर प्रभाव टाळा, नंतर पुन्हा निर्यात करा." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "तपासत आहे…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "बंद करा" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "हे कनेक्शन पूर्ण करू शकलो न msgid "Could not generate the DOCX. Please try again." msgstr "DOCX तयार करता आले नाही. कृपया पुन्हा प्रयत्न करा." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "सानुकूल विभाग" msgid "Custom Styles" msgstr "सानुकूल शैली" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "चेक" @@ -2500,6 +2503,7 @@ msgstr "पदवी" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "हटवा" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "निर्यात केलेली pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "जपानी" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "कायदेशीर" @@ -5525,6 +5550,10 @@ msgstr "नवीन टॅबमध्ये उघडतो" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "पेस्ट केल्यावर फील्ड आपोआप msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "आयत (पूर्ण रुंदी)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "स्टाईलशीट संपादन पुन्हा करा" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "तुमचा पासवर्ड आठवतो? <0/>" msgid "Remote, Hybrid, a city…" msgstr "रिमोट, हायब्रिड, शहर…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "टॅग काढा" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "कॅपिटल्स फक्त लहान शीर्षकांसाठी राखून ठेवा. ते वाचन मंदावतात आणि केस-सेन्सिटिव्ह शोध निष्फळ करू शकतात." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "पासवर्ड रीसेट करा" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "तुमचा पासवर्ड रीसेट करा" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "रोटेशन" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "पुन्हा चालवा" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "सेव्ह करण्यास अपेक्षेपेक्षा जास्त वेळ लागत आहे. तुमच्या बदला अद्याप उघडे आहेत." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "तीच ओळ प्रत्येक पानावर पुनरावृत्त होते." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "हा कनेक्शन विनंती अमान्य आ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "पूर्ववत करा" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "स्टाईलशीटमधील बदल पूर्ववत करा" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "पासवर्ड पडताळला जात आहे..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "पासवर्ड रीसेट करताना ईमेल पडताळणे आवश्यक आहे." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ms-MY.po b/apps/web/locales/ms-MY.po index 9f066d10d..01a59232d 100644 --- a/apps/web/locales/ms-MY.po +++ b/apps/web/locales/ms-MY.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} permohonan dijejaki" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Tambahkan ke pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Tambah dua atau tiga baris di bahagian atas yang menerangkan apa yang anda lakukan." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Elakkan kesan jarak huruf yang berat, kemudian eksport semula." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Menyemak…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "tutup" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Tidak dapat melengkapkan sambungan ini. Mulakan semula sambungan daripad msgid "Could not generate the DOCX. Please try again." msgstr "Tidak dapat menjana DOCX. Sila cuba lagi." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Seksyen Tersuai" msgid "Custom Styles" msgstr "Gaya Tersuai" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Czech" @@ -2500,6 +2503,7 @@ msgstr "Ijazah" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Padam" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png dieksport" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Jepun" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Perundangan" @@ -5525,6 +5550,10 @@ msgstr "dibuka dalam tab baharu" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Menampal akan mengisi medan secara automatik." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Segi empat tepat (Lebar Penuh)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Buat semula suntingan helaian gaya" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Ingat kata laluan anda? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Jauh, Hibrid, sebuah bandar…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Alih keluar tag" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Simpan huruf besar untuk tajuk pendek sahaja. Ia melambatkan pembacaan dan boleh menggagalkan carian sensitif huruf besar/kecil." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Tetapkan Semula Kata Laluan" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Tetapkan semula kata laluan anda" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Putaran" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Jalankan semula" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Menyimpan mengambil masa lebih lama daripada jangkaan. Perubahan anda masih terbuka." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Baris yang sama berulang pada setiap halaman." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Permintaan sambungan ini tidak sah atau telah tamat tempoh." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Buat asal" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Buat asal suntingan helaian gaya" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Mengesahkan kata laluan..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Mengesahkan e-mel anda diperlukan apabila menetapkan semula kata laluan anda." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ne-NP.po b/apps/web/locales/ne-NP.po index c10bd63cf..5fa1a0bd1 100644 --- a/apps/web/locales/ne-NP.po +++ b/apps/web/locales/ne-NP.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} आवेदनहरू ट्र्याक गरियो" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "पाइपलाइनमा थप्नुहोस्" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "माथि तपाईंले के गर्नुहुन्छ भनेर वर्णन गर्ने दुई वा तीन लाइन थप्नुहोस्।" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "धेरै अक्षर-स्पेसिङ प्रभावबाट जोगिनुहोस्, त्यसपछि पुनः निर्यात गर्नुहोस्।" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "जाँच गर्दै…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "बन्द गर्नुहोस्" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "यो जडान पूरा गर्न सकिएन। आफ msgid "Could not generate the DOCX. Please try again." msgstr "DOCX बनाउन सकिएन। कृपया फेरि प्रयास गर्नुहोस्।" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "अनुकूल (Custom) खण्डहरू" msgid "Custom Styles" msgstr "अनुकूलन शैलीहरू" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "चेक" @@ -2500,6 +2503,7 @@ msgstr "डिग्री" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "मेटाउनुहोस्" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "निर्यात गरिएको pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "जापानी" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "कानुनी" @@ -5525,6 +5550,10 @@ msgstr "नयाँ ट्याबमा खुल्छ" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "टाँस्दा फिल्डहरू स्वतः भरि msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "आयत (पूर्ण चौडाइ)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "शैलीपत्र सम्पादन पुन: गर्नुहोस्" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "पासवर्ड सम्झनुभयो? <0/>" msgid "Remote, Hybrid, a city…" msgstr "रिमोट, हाइब्रिड, शहर…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "ट्याग हटाउनुहोस्" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "ठूला अक्षर छोटो शीर्षकका लागि मात्र प्रयोग गर्नुहोस्। यसले पढाइ ढिलो बनाउँछ र केस-सेन्सिटिभ खोजलाई असफल बनाउन सक्छ।" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "पासवर्ड रिसेट गर्नुहोस्" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "तपाईंको पासवर्ड रिसेट गर्नुहोस्" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "घुमाउने कोण (Rotation)" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "फेरि चलाउनुहोस्" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "बचतले सोचेभन्दा बढी समय लिइरहेको छ। तपाईंका परिवर्तनहरू अझै खुला छन्।" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "उही लाइन हरेक पृष्ठमा दोहोरिन्छ।" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "यो जडान अनुरोध अमान्य छ वा म msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "पूर्ववत गर्नुहोस्" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "शैलीपत्र सम्पादन पूर्ववत गर्नुहोस्" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "पासवर्ड यकिन हुँदैछ..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "पासवर्ड रिसेट गर्दा इमेल यकिन गर्नु अनिवार्य छ।" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/nl-NL.po b/apps/web/locales/nl-NL.po index 2ba2c84f1..7e0cfed1c 100644 --- a/apps/web/locales/nl-NL.po +++ b/apps/web/locales/nl-NL.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} sollicitaties bijgehouden" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Toevoegen aan pijplijn" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Voeg twee of drie regels bovenaan toe die beschrijven wat je doet." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Vermijd zware letterspatiëring en exporteer opnieuw." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Bezig met controleren…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Sluiten" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Deze koppeling kon niet worden voltooid. Start de koppeling opnieuw vanu msgid "Could not generate the DOCX. Please try again." msgstr "Het DOCX-bestand kon niet worden gegenereerd. Probeer het opnieuw." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Aangepaste secties" msgid "Custom Styles" msgstr "Aangepaste stijlen" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tsjechisch" @@ -2500,6 +2503,7 @@ msgstr "Diploma" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Verwijderen" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Geëxporteerde pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japans" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Juridisch" @@ -5525,6 +5550,10 @@ msgstr "opent in nieuw tabblad" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Plakken vult de velden automatisch in." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rechthoek (volledige breedte)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Stijlpagina bewerken opnieuw uitvoeren" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Wachtwoord nog weten? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remote, hybride, een stad…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Tag verwijderen" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Gebruik hoofdletters alleen voor korte kopjes. Ze vertragen het lezen en kunnen hoofdlettergevoelig zoeken verstoren." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Wachtwoord resetten" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Reset uw wachtwoord" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotatie" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Opnieuw uitvoeren" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Het opslaan duurt langer dan verwacht. Je wijzigingen staan er nog." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Dezelfde regel herhaalt zich op elke pagina." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Dit koppelingsverzoek is ongeldig of verlopen." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Ongedaan maken" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Stijlbewerking ongedaan maken" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Wachtwoord wordt geverifieerd..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Het verifiëren van uw e-mailadres is vereist bij het resetten van uw wachtwoord." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/no-NO.po b/apps/web/locales/no-NO.po index 3508eaabe..7ccb14bd9 100644 --- a/apps/web/locales/no-NO.po +++ b/apps/web/locales/no-NO.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} søknader sporet" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Legg til pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Legg til to eller tre linjer øverst som beskriver hva du gjør." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Unngå kraftig sperring, og eksporter på nytt." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Sjekker…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Lukk" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Kunne ikke fullføre denne tilkoblingen. Start tilkoblingen på nytt fra msgid "Could not generate the DOCX. Please try again." msgstr "Kunne ikke generere DOCX-filen. Prøv igjen." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Tilpassede seksjoner" msgid "Custom Styles" msgstr "Tilpassede stiler" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tsjekkisk" @@ -2500,6 +2503,7 @@ msgstr "Grad" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Slett" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Eksportert pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japansk" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Juridisk" @@ -5525,6 +5550,10 @@ msgstr "åpnes i ny fane" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Innliming fyller ut feltene automatisk." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rektangel (full bredde)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Gjør om redigeringen av stilark" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Husker du passordet ditt? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Eksternt, hybrid, en by…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Fjern tagg" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserver store bokstaver til korte overskrifter. De bremser lesingen og kan hindre søk som skiller mellom store og små bokstaver." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Tilbakestill passord" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Tilbakestill passordet ditt" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotasjon" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Kjør på nytt" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Lagringen tar lengre tid enn forventet. Endringene dine er fortsatt her." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Den samme linjen gjentas på hver side." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Denne tilkoblingsforespørselen er ugyldig eller har utløpt." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Angre" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Angre redigering av stilark" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verifiserer passord..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verifisering av e-posten din er påkrevd når du tilbakestiller passordet." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/or-IN.po b/apps/web/locales/or-IN.po index ea04bed75..ca7254205 100644 --- a/apps/web/locales/or-IN.po +++ b/apps/web/locales/or-IN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} ଆବେଦନ ଟ୍ରାକ୍ କରାଯାଇଛି" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "ପାଇପଲାଇନରେ ଯୋଡନ୍ତୁ |" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "ଶୀର୍ଷରେ ଆପଣ କଣ କରନ୍ତି ତାହା ବର୍ଣ୍ଣନା କରି ଦୁଇ କିମ୍ବା ତିନି ଧାଡ଼ି ଯୋଡନ୍ତୁ।" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "ଭାରୀ ଅକ୍ଷର-ବ୍ୟବଧାନ ପ୍ରଭାବ ଏଡାନ୍ତୁ, ତାପରେ ପୁନଃ-ରପ୍ତାନି କରନ୍ତୁ।" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "ଯାଞ୍ଚ କରାଯାଉଛି…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "ବନ୍ଦ" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "ଏହି ସଂଯୋଗ ସଂପୂର୍ଣ୍ଣ କରିପାର msgid "Could not generate the DOCX. Please try again." msgstr "DOCX ତିଆରି କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "କଷ୍ଟମ୍ ବିଭାଗଗୁଡିକ" msgid "Custom Styles" msgstr "କଷ୍ଟମ୍ ଷ୍ଟାଇଲ୍ସ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "ଚେକ୍" @@ -2500,6 +2503,7 @@ msgstr "ଡିଗ୍ରୀ" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "ବିଲୋପ କରନ୍ତୁ" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "ରପ୍ତାନି ହୋଇଥିବା ପାଇପଲାଇନ-ପ୍ରବାହ। png |" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "ଜାପାନୀ" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "ଆଇନଗତ" @@ -5525,6 +5550,10 @@ msgstr "ନୂତନ ଟାବ୍‌ରେ ଖୋଲେ" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "ପେଷ୍ଟ କରିବା ଦ୍ୱାରା ଫିଲ୍ଡଗୁ msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "ଆୟାତାକାର (ପୁରା ପ୍ରସ୍ଥ)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "ଷ୍ଟାଇଲସିଟ୍ ସମ୍ପାଦନ ପୁନଃକରିବା" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "ଆପଣଙ୍କ ପାସୱାର୍ଡ ମନେ ଅଛି? <0/>" msgid "Remote, Hybrid, a city…" msgstr "ରିମୋଟ୍, ହାଇବ୍ରିଡ୍, ଏକ ସହର…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "ଟ୍ୟାଗ୍ ହଟାନ୍ତୁ" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "ଛୋଟ ଶୀର୍ଷକ ପାଇଁ ବଡ଼ ଅକ୍ଷର ସଂରକ୍ଷିତ ରଖନ୍ତୁ। ସେଗୁଡ଼ିକ ପଠନକୁ ମନ୍ଥର କରନ୍ତି ଏବଂ କେସ୍-ସେନ୍ସିଟିଭ୍ ସନ୍ଧାନକୁ ବିଫଳ କରିପାରନ୍ତି।" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "ପାସୱାର୍ଡ ରିସେଟ୍ କରନ୍ତୁ" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "ଆପଣଙ୍କ ପାସୱାର୍ଡ ରିସେଟ୍ କରନ୍ତୁ" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "ଘୁର୍ଣ୍ଣନ" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "ପୁନର୍ବାର ଚଲାନ୍ତୁ" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "ସଞ୍ଚୟ ଆଶା କରାଯାଉଥିବା ସମୟଠାରୁ ଅଧିକ ସମୟ ନେଉଛି | ତୁମର ପରିବର୍ତ୍ତନ ଏପର୍ଯ୍ୟନ୍ତ ଖୋଲା ଅଛି |" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "ସମାନ ଧାଡ଼ି ପ୍ରତ୍ୟେକ ପୃଷ୍ଠାରେ ପୁନରାବୃତ୍ତି ହୁଏ।" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "ଏହି ସଂଯୋଗ ଅନୁରୋଧ ଅବ alid ଧ କିମ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "ପୂର୍ବବତ୍ କରନ୍ତୁ" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "ଷ୍ଟାଇଲସିଟ୍ ସମ୍ପାଦନକୁ ପୂର୍ବବତ୍ କରନ୍ତୁ" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "ପାସୱାର୍ଡ ସତ୍ୟାପନ ହେଉଛି..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "ଆପଣଙ୍କ ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରିବା ବେଳେ ଇମେଲ୍ ସତ୍ୟାପନ ଆବଶ୍ୟକ।" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/pl-PL.po b/apps/web/locales/pl-PL.po index ae30444e9..d964fbeed 100644 --- a/apps/web/locales/pl-PL.po +++ b/apps/web/locales/pl-PL.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} śledzonych aplikacji" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Dodaj do procesu" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Dodaj dwa lub trzy zdania na górze opisujące, czym się zajmujesz." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Unikaj mocnych efektów rozstrzelenia liter, a następnie wyeksportuj ponownie." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Sprawdzanie…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Zamknij" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Nie udało się nawiązać tego połączenia. Uruchom ponownie połącze msgid "Could not generate the DOCX. Please try again." msgstr "Nie udało się wygenerować pliku DOCX. Proszę spróbować ponownie." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Sekcje niestandardowe" msgid "Custom Styles" msgstr "Style niestandardowe" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Czeski" @@ -2500,6 +2503,7 @@ msgstr "Stopień" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Usuń" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Wyeksportowany przepływ potoku.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japoński" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Informacje prawne" @@ -5525,6 +5550,10 @@ msgstr "otwiera się w nowej karcie" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Wklejenie automatycznie wypełni pola." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Prostokąt (pełna szerokość)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Ponów edycję arkusza stylów" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Pamiętasz hasło? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Zdalnie, hybrydowo, miasto…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Usuń tag" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Zarezerwuj wielkie litery dla krótkich nagłówków. Spowalniają czytanie i mogą zakłócić wyszukiwanie uwzględniające wielkość liter." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Zresetuj hasło" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Zresetuj swoje hasło" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Obrót" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Uruchom ponownie" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Zapisywanie trwa dłużej, niż oczekiwano. Twoje zmiany są nadal otwarte." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Ten sam wiersz powtarza się na każdej stronie." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "To żądanie połączenia jest nieprawidłowe lub wygasło." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Anulować" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Cofnij edycję arkusza stylów" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Weryfikowanie hasła..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Weryfikacja adresu e-mail jest wymagana przy resetowaniu hasła." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/pt-BR.po b/apps/web/locales/pt-BR.po index b3781cb42..ead4346b3 100644 --- a/apps/web/locales/pt-BR.po +++ b/apps/web/locales/pt-BR.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} candidaturas acompanhadas" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Adicionar ao pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Adicione duas ou três linhas no topo descrevendo o que você faz." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Evite efeitos pesados de espaçamento entre letras e exporte novamente." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Verificando…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Fechar" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Não foi possível concluir esta conexão. Reinicie a conexão no seu cl msgid "Could not generate the DOCX. Please try again." msgstr "Não foi possível gerar o DOCX. Tente novamente." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Seções personalizadas" msgid "Custom Styles" msgstr "Estilos personalizados" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tcheco" @@ -2500,6 +2503,7 @@ msgstr "Grau" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Apagar" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png exportado" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonês" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Jurídico" @@ -5525,6 +5550,10 @@ msgstr "abre em nova aba" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Ao colar, os campos são preenchidos automaticamente." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Retângulo (largura total)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Refazer edição da folha de estilo" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Lembrou sua senha? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remoto, híbrido, uma cidade…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Remover tag" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserve as maiúsculas para títulos curtos. Elas dificultam a leitura e podem prejudicar buscas sensíveis a maiúsculas e minúsculas." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Redefinir senha" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Redefinir a sua senha" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotação" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Executar novamente" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "O salvamento está demorando mais do que o esperado. Suas alterações continuam abertas." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "A mesma linha se repete em todas as páginas." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Esta solicitação de conexão é inválida ou expirou." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Desfazer" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Desfazer edição da folha de estilo" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verificando senha..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verificar seu email é obrigatório ao redefinir sua senha." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/pt-PT.po b/apps/web/locales/pt-PT.po index e71d3d98c..8ae4e5abb 100644 --- a/apps/web/locales/pt-PT.po +++ b/apps/web/locales/pt-PT.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} candidaturas acompanhadas" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Adicionar ao pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Adicione duas ou três linhas no topo a descrever o que faz." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Evite efeitos pesados de espaçamento entre letras e volte a exportar." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "A verificar…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Fechar" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Não foi possível concluir esta ligação. Reinicie a ligação a parti msgid "Could not generate the DOCX. Please try again." msgstr "Não foi possível gerar o DOCX. Tente novamente." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Secções personalizadas" msgid "Custom Styles" msgstr "Estilos personalizados" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Checo" @@ -2500,6 +2503,7 @@ msgstr "Grau" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Apagar" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png exportado" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonês" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Jurídico" @@ -5525,6 +5550,10 @@ msgstr "abre num novo separador" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Ao colar, os campos são preenchidos automaticamente." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Retângulo (largura total)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Refazer edição da folha de estilos" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Lembra-se da sua palavra-passe? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remoto, híbrido, uma cidade…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Remover etiqueta" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reserve as maiúsculas para títulos curtos. Estas dificultam a leitura e podem prejudicar pesquisas sensíveis a maiúsculas e minúsculas." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Repor senha" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Repor a sua senha" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotação" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Executar novamente" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "A gravação está a demorar mais do que o esperado. As suas alterações continuam abertas." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "A mesma linha repete-se em todas as páginas." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Este pedido de ligação é inválido ou expirou." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Desfazer" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Desfazer edição da folha de estilos" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "A verificar senha..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verificar o seu email é necessário ao repor a sua senha." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ro-RO.po b/apps/web/locales/ro-RO.po index edecbca17..938355080 100644 --- a/apps/web/locales/ro-RO.po +++ b/apps/web/locales/ro-RO.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} candidaturi urmărite" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Adăugați în flux" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Adăugați două sau trei rânduri în partea de sus, care descriu ce faceți." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Evitați efectele puternice de spațiere între litere, apoi exportați din nou." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Se verifică…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Închide" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Această conexiune nu a putut fi finalizată. Reia conectarea din client msgid "Could not generate the DOCX. Please try again." msgstr "Nu s-a putut genera fișierul DOCX. Vă rugăm să încercați din nou." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Secțiuni personalizate" msgid "Custom Styles" msgstr "Stiluri personalizate" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Cehă" @@ -2500,6 +2503,7 @@ msgstr "Diplomă" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Șterge" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Exportat pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japoneză" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Juridic" @@ -5525,6 +5550,10 @@ msgstr "se deschide într-o filă nouă" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Lipirea completează automat câmpurile." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Dreptunghi (lățime completă)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Refaceți editarea foii de stil" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Îți amintești parola? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Remote, hibrid, un oraș…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Elimină eticheta" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Rezervați majusculele pentru titluri scurte. Acestea încetinesc citirea și pot afecta căutările sensibile la majuscule și minuscule." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Resetați parola" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Resetați-vă parola" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotire" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Executați din nou" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Salvarea durează mai mult decât se aștepta. Modificările tale sunt încă deschise." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Același rând se repetă pe fiecare pagină." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Această cerere de conectare este invalidă sau a expirat." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Anula" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Anulează editarea foii de stil" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Se verifică parola..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verificarea e-mailului este necesară pentru resetarea parolei." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ru-RU.po b/apps/web/locales/ru-RU.po index 0dc95bdb5..6203b9527 100644 --- a/apps/web/locales/ru-RU.po +++ b/apps/web/locales/ru-RU.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} заявок отслеживается" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Добавить в воронку" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Добавьте две-три строки вверху с описанием того, чем вы занимаетесь." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Избегайте сильного межбуквенного интервала, затем экспортируйте заново." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Проверка…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Закрыть" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Не удалось завершить это соединение. Пе msgid "Could not generate the DOCX. Please try again." msgstr "Не удалось создать DOCX. Пожалуйста, попробуйте ещё раз." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Пользовательские разделы" msgid "Custom Styles" msgstr "Пользовательские стили" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Чешский" @@ -2500,6 +2503,7 @@ msgstr "Степень" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Удалить" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Файл pipeline-flow.png экспортирован" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Японский" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Правовая информация" @@ -5525,6 +5550,10 @@ msgstr "открывается в новой вкладке" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Вставка автоматически заполнит поля." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Прямоугольник (на всю ширину)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Повторить редактирование таблицы стилей" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Вспомнили пароль? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Удаленно, гибридно, город…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Удалить тег" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Используйте заглавные буквы только для коротких заголовков. Они замедляют чтение и могут мешать поиску с учётом регистра." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Сбросить пароль" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Сбросить пароль" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Поворот" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Запустить снова" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Экономия занимает больше времени, чем ожидалось. Ваши изменения все еще открыты." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Одна и та же строка повторяется на каждой странице." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Этот запрос на подключение недействите msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Отменить" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Отменить редактирование таблицы стилей" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Проверка пароля..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Подтверждение адреса электронной почты необходимо для сброса пароля." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/sk-SK.po b/apps/web/locales/sk-SK.po index 28ec38254..a30752317 100644 --- a/apps/web/locales/sk-SK.po +++ b/apps/web/locales/sk-SK.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} sledovaných žiadostí" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Pridať do procesu" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Pridajte na začiatok dva až tri riadky opisujúce, čím sa zaoberáte." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Vyhnite sa výrazným efektom preloženia písmen a potom exportujte znova." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Kontroluje sa…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Zavrieť" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Toto pripojenie sa nepodarilo dokončiť. Reštartujte pripojenie zo svo msgid "Could not generate the DOCX. Please try again." msgstr "Nepodarilo sa vytvoriť DOCX. Skúste to prosím znova." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Vlastné sekcie" msgid "Custom Styles" msgstr "Vlastné štýly" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Čeština" @@ -2500,6 +2503,7 @@ msgstr "Titul" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Vymazať" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Exportované pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japončina" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Právne informácie" @@ -5525,6 +5550,10 @@ msgstr "otvorí sa na novej karte" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Vložením sa polia vyplnia automaticky." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Obdĺžnik (plná šírka)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Znovu upraviť štýlový hárok" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Pamätáte si heslo? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Na diaľku, hybridne, mesto…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Odstrániť značku" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Veľké písmená vyhraďte pre krátke nadpisy. Spomaľujú čítanie a môžu znemožniť vyhľadávanie citlivé na veľkosť písmen." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Obnoviť heslo" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Obnov svoje heslo" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Otočenie" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Spustiť znova" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Ukladanie trvá dlhšie, ako sa očakávalo. Vaše zmeny sú stále otvorené." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Ten istý riadok sa opakuje na každej strane." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Táto žiadosť o pripojenie je neplatná alebo jej platnosť vypršala. msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Späť" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Vrátiť späť úpravu štýlového hárka" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Overujem heslo..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Pri obnovení hesla je potrebné overiť tvoj e‑mail." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/sl-SI.po b/apps/web/locales/sl-SI.po index 39128b18f..6523aa8e5 100644 --- a/apps/web/locales/sl-SI.po +++ b/apps/web/locales/sl-SI.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} spremljanih prijav" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Dodaj v postopek" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Na vrh dodajte dve ali tri vrstice, ki opisujejo, s čim se ukvarjate." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Izogibajte se močnim učinkom razmika med črkami, nato izvozite znova." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Preverjanje …" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Zapri" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Te povezave ni bilo mogoče dokončati. Znova zaženite povezavo iz odje msgid "Could not generate the DOCX. Please try again." msgstr "Datoteke DOCX ni bilo mogoče ustvariti. Poskusite znova." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Poljubni razdelki" msgid "Custom Styles" msgstr "Slogi po meri" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Češčina" @@ -2500,6 +2503,7 @@ msgstr "Stopnja" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Izbriši" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Izvožen pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonščina" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Pravno" @@ -5525,6 +5550,10 @@ msgstr "odpre se v novem zavihku" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Lepljenje samodejno izpolni polja." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Pravokotnik (polna širina)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Ponovi urejanje slogovne predloge" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Se spomnite svojega gesla? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Na daljavo, hibridno, mesto…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Odstrani oznako" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Velike črke pridržite za kratke naslove. Upočasnjujejo branje in lahko onemogočijo iskanje, občutljivo na velikost črk." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Ponastavi geslo" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Ponastavite svoje geslo" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotacija" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Zaženi znova" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Shranjevanje traja dlje, kot je bilo pričakovano. Vaše spremembe so še vedno odprte." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Ista vrstica se ponovi na vsaki strani." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Ta zahteva za povezavo je neveljavna ali je potekla." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Razveljavi" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Razveljavi urejanje slogovne predloge" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Preverjanje gesla..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Preverjanje vašega e-poštnega naslova je zahtevano pri ponastavitvi gesla." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/sq-AL.po b/apps/web/locales/sq-AL.po index 4d29f22a8..40c959455 100644 --- a/apps/web/locales/sq-AL.po +++ b/apps/web/locales/sq-AL.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} aplikime të ndjekura" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Shto në proces" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Shtoni dy ose tre rreshta në krye që përshkruajnë çfarë bëni." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Shmangni efektet e rënda të hapësirës mes shkronjave, pastaj eksportoni përsëri." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Duke kontrolluar…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Mbylle" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Kjo lidhje nuk mund të përfundonte. Rinisni lidhjen nga klienti juaj d msgid "Could not generate the DOCX. Please try again." msgstr "DOCX-ja nuk u gjenerua dot. Ju lutemi provoni përsëri." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Rubrika të personalizuara" msgid "Custom Styles" msgstr "Stilet e Personalizuara" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Çekisht" @@ -2500,6 +2503,7 @@ msgstr "Diploma" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Fshi" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png u eksportua" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonisht" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Ligjore" @@ -5525,6 +5550,10 @@ msgstr "hapet në skedë të re" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Ngjitja i plotëson fushat automatikisht." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Drejtkëndësh (gjerësi e plotë)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Ribëj ndryshimin e fletës së stilit" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Ju kujtohet fjalëkalimi? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Në distancë, hibrid, një qytet…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Hiq etiketën" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Rezervoni shkronjat e mëdha për titujt e shkurtër. Ato ngadalësojnë leximin dhe mund të prishin kërkimin që dallon shkronjat e mëdha nga të vogla." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Rivendos fjalëkalimin" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Rivendosni fjalëkalimin tuaj" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rrotullimi" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Ekzekutoni përsëri" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Ruajtja po zgjat më shumë se sa pritej. Ndryshimet tuaja janë ende të hapura." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "I njëjti rresht përsëritet në çdo faqe." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Kjo kërkesë për lidhje është e pavlefshme ose ka skaduar." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Anulo" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Anulo ndryshimin e fletës së stilit" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Po verifikohet fjalëkalimi..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verifikimi i emailit është i nevojshëm kur rivendosni fjalëkalimin tuaj." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/sr-SP.po b/apps/web/locales/sr-SP.po index e310c93e5..92f01d0b6 100644 --- a/apps/web/locales/sr-SP.po +++ b/apps/web/locales/sr-SP.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} праћених пријава" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Додајте у процес" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Додајте два или три реда на врху који описују чиме се бавите." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Избегавајте изражене ефекте размака између слова, па поново извезите." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Провера у току…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Затвори" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Није могуће довршити ову везу. Поново п msgid "Could not generate the DOCX. Please try again." msgstr "Није било могуће генерисати DOCX. Молимо покушајте поново." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Прилагођени одељци" msgid "Custom Styles" msgstr "Прилагођени стилови" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Чешки" @@ -2500,6 +2503,7 @@ msgstr "Степен" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Обриши" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Извезен pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Јапански" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Правне информације" @@ -5525,6 +5550,10 @@ msgstr "отвара се у новом језичку" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Лепљење аутоматски попуњава поља." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Правоугаоник (пуна ширина)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Понови измену стилског листа" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Сећате се лозинке? <0/>" msgid "Remote, Hybrid, a city…" msgstr "На даљину, хибридно, град…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Уклони ознаку" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Резервишите велика слова за кратке наслове. Она успоравају читање и могу да омету претрагу осетљиву на велика и мала слова." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Ресетуј лозинку" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Ресетујте своју лозинку" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Ротација" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Покрени поново" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Чување траје дуже него што се очекивало. Ваше промене су још увек отворене." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Исти ред се понавља на свакој страници." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Овај захтев за повезивање је неважећи и msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Поништи" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Поништи измену стилског листа" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Провера лозинке..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Верификација е-поште је обавезна при ресетовању лозинке." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/sv-SE.po b/apps/web/locales/sv-SE.po index 86e41944c..b81e7adf8 100644 --- a/apps/web/locales/sv-SE.po +++ b/apps/web/locales/sv-SE.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} ansökningar spårade" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Lägg till pipeline" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Lägg till två eller tre rader högst upp som beskriver vad du gör." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Undvik kraftiga bokstavsavståndseffekter, exportera sedan på nytt." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Kontrollerar…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Stäng" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Anslutningen kunde inte slutföras. Starta om anslutningen från din kli msgid "Could not generate the DOCX. Please try again." msgstr "Det gick inte att generera DOCX-filen. Försök igen." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Anpassade avsnitt" msgid "Custom Styles" msgstr "Anpassade stilar" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tjeckiska" @@ -2500,6 +2503,7 @@ msgstr "Examen" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Radera" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Exporterad pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japanska" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Juridik" @@ -5525,6 +5550,10 @@ msgstr "öppnas i ny flik" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Inklistring fyller i fälten automatiskt." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Rektangel (full bredd)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Gör om redigeringen av stilmall" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Kommer du ihåg ditt lösenord? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Distans, hybrid, en stad…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Ta bort tagg" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Reservera versaler för korta rubriker. De saktar ner läsningen och kan omintetgöra skiftlägeskänslig sökning." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Återställ lösenord" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Återställ ditt lösenord" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Rotation" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Kör igen" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Det tar längre tid än väntat att spara. Dina ändringar finns kvar." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Samma rad upprepas på varje sida." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Den här anslutningsbegäran är ogiltig eller har upphört att gälla." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Ångra" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Ångra redigering av stilark" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Verifierar lösenord..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Verifiering av din e-post krävs när du återställer ditt lösenord." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/ta-IN.po b/apps/web/locales/ta-IN.po index 7bf4826ac..b8b67774f 100644 --- a/apps/web/locales/ta-IN.po +++ b/apps/web/locales/ta-IN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} விண்ணப்பங்கள் கண்காணிக்கப்படுகின்றன" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "பைப்லைனில் சேர்க்கவும்" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "நீங்கள் என்ன செய்கிறீர்கள் என்பதை விவரிக்கும் இரண்டு அல்லது மூன்று வரிகளை மேலே சேர்க்கவும்." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "கனமான எழுத்திடைவெளி விளைவுகளைத் தவிர்த்து, மீண்டும் ஏற்றுமதி செய்யவும்." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "சரிபார்க்கிறது…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "மூடு" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "இந்த இணைப்பை முடிக்க முடிய msgid "Could not generate the DOCX. Please try again." msgstr "DOCX-ஐ உருவாக்க முடியவில்லை. மீண்டும் முயற்சிக்கவும்." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "தனிப்பயன் பகுதிகள்" msgid "Custom Styles" msgstr "தனிப்பயன் பாணிகள்" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "செக்" @@ -2500,6 +2503,7 @@ msgstr "பட்டம்" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "நீக்கு" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "ஏற்றுமதி செய்யப்பட்ட pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "ஜப்பானியம்" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "சட்டரீதியான" @@ -5525,6 +5550,10 @@ msgstr "புதிய தாவலில் திறக்கிறது" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "ஒட்டினால் புலங்கள் தானாகவ msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "சதுரம் (முழு அகலம்)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "ஸ்டைல்ஷீட் திருத்தத்தை மீண்டும் செய்" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "உங்கள் கடவுச்சொல் நினைவிர msgid "Remote, Hybrid, a city…" msgstr "தொலைநிலை, ஹைபிரிட், ஒரு நகரம்…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "குறிச்சொல்லை அகற்று" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "பெரிய எழுத்துக்களை குறுகிய தலைப்புகளுக்கு மட்டும் ஒதுக்கவும். அவை படிப்பதை மெதுவாக்குவதோடு, எழுத்து-உணர்திறன் தேடலைத் தோற்கடிக்கக்கூடும்." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "கடவுச்சொல்லை மீட்டமைக்கவும்" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "உங்கள் கடவுச்சொல்லை மீட்டமைக்கவும்" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "சுழற்சி" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "மீண்டும் இயக்கு" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "சேமிப்பு எதிர்பார்த்ததை விட அதிக நேரம் எடுகிறது. உங்கள் மாற்றங்கள் இன்னும் திறந்தே உள்ளன." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "ஒரே வரி ஒவ்வொரு பக்கத்திலும் மீண்டும் வருகிறது." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "இந்த இணைப்பு கோரிக்கை செல் msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "செயல்தவிர்" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "ஸ்டைல்ஷீட் திருத்தத்தை செயல்தவிர்க்கவும்" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "கடவுச்சொல்லை சரிபார்த்து கொண்டிருக்கிறது..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "கடவுச்சொல்லை மீட்டமைக்கும் போது உங்கள் மின்னஞ்சலை சரிபார்ப்பது அவசியம்." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/te-IN.po b/apps/web/locales/te-IN.po index 06acdd7d7..c0e9cc819 100644 --- a/apps/web/locales/te-IN.po +++ b/apps/web/locales/te-IN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} దరఖాస్తులు ట్రాక్ చేయబడ్డాయి" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "పైప్‌లైన్‌కు జోడించు" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "మీరు ఏమి చేస్తారో వివరిస్తూ పైభాగంలో రెండు లేదా మూడు లైన్లు జోడించండి." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "భారీ లెటర్-స్పేసింగ్ ఎఫెక్ట్‌లను నివారించి, తిరిగి ఎగుమతి చేయండి." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "చెక్ చేస్తోంది…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "మూసివేయి" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "ఈ కనెక్షన్‌ని పూర్తి చేయడం msgid "Could not generate the DOCX. Please try again." msgstr "DOCX ను రూపొందించలేకపోయాం. దయచేసి మళ్లీ ప్రయత్నించండి." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "కస్టమ్ విభాగాలు" msgid "Custom Styles" msgstr "కస్టమ్ స్టైల్స్" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "చెక్" @@ -2500,6 +2503,7 @@ msgstr "డిగ్రీ" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "తొలగించు" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png ఎగుమతి చేయబడింది" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "జపానీస్" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "చట్టపరమైనవి" @@ -5525,6 +5550,10 @@ msgstr "కొత్త ట్యాబ్‌లో తెరవబడుతు msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "అతికిస్తే ఫీల్డ్‌లు ఆటోమే msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "ఆయతం (పూర్తి వెడల్పు)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "స్టైల్‌షీట్ సవరణను మళ్లీ చేయండి" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "మీ పాస్‌వర్డ్ గుర్తుందా? <0/>" msgid "Remote, Hybrid, a city…" msgstr "రిమోట్, హైబ్రిడ్, ఒక నగరం…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "ట్యాగ్‌ను తీసివేయండి" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "పెద్ద అక్షరాలను చిన్న శీర్షికలకే రిజర్వ్ చేయండి. అవి చదవడాన్ని నెమ్మది చేస్తాయి మరియు కేస్-సెన్సిటివ్ శోధనను దెబ్బతీయగలవు." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "పాస్‌వర్డ్ రీసెట్ చేయండి" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "మీ పాస్‌వర్డ్‌ను రీసెట్ చేయండి" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "రోటేషన్" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "మళ్లీ నడపండి" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "ఆదా చేయడానికి ఊహించిన దాని కంటే ఎక్కువ సమయం పడుతోంది. మీ మార్పులు ఇప్పటికీ తెరిచి ఉన్నాయి." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "అదే లైన్ ప్రతి పేజీలో పునరావృతమవుతుంది." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "ఈ కనెక్షన్ అభ్యర్థన చెల్లన msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "రద్దు చేయి" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "స్టైల్‌షీట్ సవరణను రద్దు చేయండి" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "పాస్‌వర్డ్‌ను ధ్రువీకరిస్తోంది..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "మీ పాస్‌వర్డ్‌ను రీసెట్ చేయాలంటే మీ ఈమెయిల్ ధ్రువీకరణ అవసరం." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/th-TH.po b/apps/web/locales/th-TH.po index f3e8346a4..7d2e1d1fb 100644 --- a/apps/web/locales/th-TH.po +++ b/apps/web/locales/th-TH.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "ติดตามใบสมัคร {0} รายการ" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "เพิ่มไปยังไปป์ไลน์" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "เพิ่มสองถึงสามบรรทัดด้านบนเพื่ออธิบายสิ่งที่คุณทำ" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "หลีกเลี่ยงเอฟเฟกต์ระยะห่างตัวอักษรที่มากเกินไป แล้วส่งออกใหม่" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "กำลังตรวจสอบ…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "ปิด" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "ไม่สามารถทำการเชื่อมต่อน msgid "Could not generate the DOCX. Please try again." msgstr "ไม่สามารถสร้างไฟล์ DOCX ได้ กรุณาลองอีกครั้ง" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "ส่วนที่กำหนดเอง" msgid "Custom Styles" msgstr "สไตล์ที่กำหนดเอง" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "เช็ก" @@ -2500,6 +2503,7 @@ msgstr "ปริญญา" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "ลบ" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "ส่งออก pipeline-flow.png แล้ว" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "ญี่ปุ่น" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "ด้านกฎหมาย" @@ -5525,6 +5550,10 @@ msgstr "เปิดในแท็บใหม่" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "การวางจะกรอกข้อมูลในช่อง msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "สี่เหลี่ยมผืนผ้า (เต็มความกว้าง)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "แก้ไขสไตล์ชีตใหม่" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "จำรหัสผ่านได้? <0/>" msgid "Remote, Hybrid, a city…" msgstr "รีโมต, ไฮบริด, เมือง…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "ลบแท็ก" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "ใช้ตัวพิมพ์ใหญ่เฉพาะหัวข้อสั้น ๆ เพราะจะทำให้อ่านช้าลงและอาจทำให้การค้นหาที่สนใจตัวพิมพ์ใหญ่-เล็กล้มเหลว" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "รีเซ็ตรหัสผ่าน" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "รีเซ็ตรหัสผ่านของคุณ" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "การหมุน" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "รันอีกครั้ง" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "การออมใช้เวลานานกว่าที่คาดไว้ การเปลี่ยนแปลงของคุณยังคงเปิดอยู่" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "บรรทัดเดียวกันซ้ำในทุกหน้า" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "คำขอเชื่อมต่อนี้ไม่ถูกต้ msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "เลิกทำ" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "ยกเลิกการแก้ไขสไตล์ชีต" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "กำลังตรวจสอบรหัสผ่าน..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "ต้องยืนยันอีเมลของคุณเมื่อรีเซ็ตรหัสผ่านของคุณ." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/tr-TR.po b/apps/web/locales/tr-TR.po index 567fd23a5..c727bdda9 100644 --- a/apps/web/locales/tr-TR.po +++ b/apps/web/locales/tr-TR.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} başvuru takip ediliyor" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Hatta ekle" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Ne yaptığınızı anlatan iki üç satırı en üste ekleyin." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Yoğun harf aralığı efektlerinden kaçının, ardından yeniden dışa aktarın." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Kontrol ediliyor…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Kapat" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Bu bağlantı tamamlanamadı. Bağlantıyı istemcinizden yeniden başla msgid "Could not generate the DOCX. Please try again." msgstr "DOCX oluşturulamadı. Lütfen tekrar deneyin." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Özel Bölümler" msgid "Custom Styles" msgstr "Özel Stiller" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Çekçe" @@ -2500,6 +2503,7 @@ msgstr "Derece" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Sil" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png dışa aktarıldı" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Japonca" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Yasal" @@ -5525,6 +5550,10 @@ msgstr "yeni sekmede açılır" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Yapıştırmak alanları otomatik olarak doldurur." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Dikdörtgen (Tam Genişlik)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Stil sayfası düzenlemesini yeniden yap" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Şifrenizi hatırladınız mı? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Uzaktan, Hibrit, bir şehir…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Etiketi kaldır" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Büyük harfleri kısa başlıklar için saklayın. Okumayı yavaşlatır ve büyük/küçük harfe duyarlı aramayı engelleyebilir." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Şifreyi Sıfırla" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Şifrenizi sıfırlayın" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Döndürme" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Tekrar çalıştır" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Tasarruf beklenenden daha uzun sürüyor. Değişiklikleriniz hâlâ açık." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Aynı satır her sayfada tekrarlanıyor." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Bu bağlantı isteği geçersiz veya süresi dolmuş." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Geri al" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Stil sayfası düzenlemesini geri al" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Şifre doğrulanıyor..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Şifrenizi sıfırlarken e-postanızı doğrulamanız gereklidir." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/uk-UA.po b/apps/web/locales/uk-UA.po index ac1bd3c66..d95218ba0 100644 --- a/apps/web/locales/uk-UA.po +++ b/apps/web/locales/uk-UA.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "Відстежується {0} заявок" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Додати до воронки" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Додайте два-три рядки зверху з описом того, чим ви займаєтесь." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Уникайте сильних ефектів міжлітерного інтервалу, потім експортуйте знову." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Перевірка…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Закрити" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Не вдалося завершити це підключення. Пе msgid "Could not generate the DOCX. Please try again." msgstr "Не вдалося створити DOCX. Спробуйте ще раз." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Користувацькі розділи" msgid "Custom Styles" msgstr "Власні стилі" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Чеська" @@ -2500,6 +2503,7 @@ msgstr "Ступінь" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Видалити" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Експортовано pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Японська" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Правова інформація" @@ -5525,6 +5550,10 @@ msgstr "відкриється у новій вкладці" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Вставлення автоматично заповнює поля." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Прямокутник (на всю ширину)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Повторити редагування таблиці стилів" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Пригадали пароль? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Віддалено, гібридно, місто…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Видалити тег" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Залиште великі літери для коротких заголовків. Вони уповільнюють читання і можуть заважати пошуку з урахуванням регістру." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Скинути пароль" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Скинути пароль" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Обертання" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Запустити знову" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Збереження триває довше, ніж очікувалося. Ваші зміни все ще відкриті." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Один і той самий рядок повторюється на кожній сторінці." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Цей запит на підключення недійсний або msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Скасувати" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Скасувати редагування таблиці стилів" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Перевірка пароля..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Підтвердження вашої електронної пошти потрібне для скидання пароля." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/uz-UZ.po b/apps/web/locales/uz-UZ.po index 0b0b739c6..4d939f8ee 100644 --- a/apps/web/locales/uz-UZ.po +++ b/apps/web/locales/uz-UZ.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "{0} ta ariza kuzatilmoqda" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Pipeline'ga qo'shish" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Nima bilan shugʻullanishingizni tasvirlaydigan ikki-uch qatorni yuqoriga qoʻshing." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Kuchli harflar oraligʻi effektlaridan saqlaning, soʻng qayta eksport qiling." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Tekshirilmoqda…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Yopish" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Bu ulanish tugallanmadi. Mijozdan ulanishni qayta yoqing va qaytadan uri msgid "Could not generate the DOCX. Please try again." msgstr "DOCX faylini yaratib bo'lmadi. Iltimos, qayta urinib ko'ring." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Maxsus boʻlimlar" msgid "Custom Styles" msgstr "Maxsus uslublar" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Chex tili" @@ -2500,6 +2503,7 @@ msgstr "Daraja" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "O'chirish" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "pipeline-flow.png eksport qilindi" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Yapon tili" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Huquqiy" @@ -5525,6 +5550,10 @@ msgstr "yangi tabda ochiladi" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Joylashtirish maydonlarni avtomatik to'ldiradi." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Toʻgʻri burchakli (toʻliq kenglik)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Uslublar jadvalini tahrirlashni qayta bajarish" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Parolingizni eslaysizmi? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Masofaviy, gibrid, shahar…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Tegni olib tashlash" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Bosh harflarni qisqa sarlavhalar uchun saqlang. Ular oʻqishni sekinlashtiradi va registrga sezgir qidiruvni buzishi mumkin." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Parolni tiklash" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Parolingizni tiklang" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Aylantirish" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Qayta ishga tushirish" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Saqlash kutilganidan ko'proq vaqt talab qilmoqda. Oʻzgartirishlaringiz hali ham ochiq." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Bir xil qator har bir sahifada takrorlanadi." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Bu ulanish so‘rovi yaroqsiz yoki muddati tugagan." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Bekor qilish" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Uslublar jadvali tahririni bekor qilish" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Parol tekshirilmoqda..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Parolingizni tiklashda emailingizni tasdiqlash talab qilinadi." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/vi-VN.po b/apps/web/locales/vi-VN.po index 838df2c82..883698eca 100644 --- a/apps/web/locales/vi-VN.po +++ b/apps/web/locales/vi-VN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "Đang theo dõi {0} đơn ứng tuyển" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "Thêm vào quy trình" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "Thêm hai hoặc ba dòng ở đầu mô tả công việc bạn làm." @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "Tránh hiệu ứng giãn cách chữ quá mức, sau đó xuất lại." @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "Đang kiểm tra…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "Đóng" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "Không thể hoàn thành kết nối này. Khởi động lại kết n msgid "Could not generate the DOCX. Please try again." msgstr "Không thể tạo tệp DOCX. Vui lòng thử lại." +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "Các mục tùy chỉnh" msgid "Custom Styles" msgstr "Kiểu dáng tùy chỉnh" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "Tiếng Séc" @@ -2500,6 +2503,7 @@ msgstr "Bằng cấp" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "Xóa" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "Đã xuất pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "Tiếng Nhật" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "Pháp lý" @@ -5525,6 +5550,10 @@ msgstr "mở ở tab mới" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "Việc dán sẽ tự động điền các trường." msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "Hình chữ nhật (Toàn bộ chiều rộng)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "Chỉnh sửa lại bảng định kiểu" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "Nhớ mật khẩu? <0/>" msgid "Remote, Hybrid, a city…" msgstr "Từ xa, Kết hợp, một thành phố…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "Xóa thẻ" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "Chỉ dùng chữ hoa cho các tiêu đề ngắn. Chữ hoa làm chậm việc đọc và có thể khiến tìm kiếm phân biệt hoa thường thất bại." +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "Đặt mật khẩu mới" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "Đặt lại mật khẩu" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "Xoay" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "Chạy lại" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "Quá trình lưu mất nhiều thời gian hơn dự kiến. Những thay đổi của bạn vẫn mở." @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "Cùng một dòng lặp lại trên mọi trang." +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "Yêu cầu kết nối này không hợp lệ hoặc đã hết hạn." msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "Hoàn tác" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "Hoàn tác chỉnh sửa bảng định kiểu" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "Đang xác minh mật khẩu..." #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "Cần xác minh email của bạn khi đặt lại mật khẩu." +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/zh-CN.po b/apps/web/locales/zh-CN.po index 18e1340be..e715aeea1 100644 --- a/apps/web/locales/zh-CN.po +++ b/apps/web/locales/zh-CN.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "已跟踪 {0} 个申请" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "添加到流程" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "在顶部加两三行说明你是做什么的。" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "避免使用过大的字距效果,然后重新导出。" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "正在检查…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "关闭" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "无法完成此次连接。请从你的客户端重新发起连接后再 msgid "Could not generate the DOCX. Please try again." msgstr "无法生成 DOCX。请重试。" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "自定义章节" msgid "Custom Styles" msgstr "自定义样式" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "捷克语" @@ -2500,6 +2503,7 @@ msgstr "学位" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "删除" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "已导出 pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "日语" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "法律" @@ -5525,6 +5550,10 @@ msgstr "在新标签页中打开" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "粘贴后会自动填充各字段。" msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "矩形(全宽)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "重新编辑样式表" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "记得密码?<0/>" msgid "Remote, Hybrid, a city…" msgstr "远程、混合、一座城市…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "移除标签" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "全大写只用于简短的标题。它会拖慢阅读速度,还可能让区分大小写的搜索失效。" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "重置密码" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "重置密码" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "旋转" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "重新运行" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "保存用时比预期更长。你的更改仍然保留。" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "同一行文字在每一页都重复出现。" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "此连接请求无效或已过期。" msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "撤销" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "撤销样式表编辑" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "正在验证密码…" #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "重置密码时必须先验证你的电子邮箱。" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/zh-TW.po b/apps/web/locales/zh-TW.po index c08b87ba8..6b7ea9a26 100644 --- a/apps/web/locales/zh-TW.po +++ b/apps/web/locales/zh-TW.po @@ -167,8 +167,8 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" -msgstr "已追蹤 {0} 份申請" +msgid "{0} active applications" +msgstr "" #. placeholder {0}: insights.closed #: src/features/applications/components/insights-view.tsx @@ -924,11 +924,6 @@ msgstr "加入流程" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "在頂部加兩三行說明您是做什麼的。" @@ -1345,11 +1340,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "避免使用過大的字距效果,然後重新匯出。" @@ -1687,8 +1677,8 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" -msgstr "正在檢查…" +msgid "Checking… Copy is available after saving." +msgstr "" #: src/features/resume/editor/check/check-panel.tsx msgid "Checks by category" @@ -1787,6 +1777,7 @@ msgstr "關閉" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2050,6 +2041,14 @@ msgstr "無法完成這次連線。請從您的用戶端重新發起連線後再 msgid "Could not generate the DOCX. Please try again." msgstr "無法產生 DOCX。請再試一次。" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2414,6 +2413,10 @@ msgstr "自訂段落" msgid "Custom Styles" msgstr "自訂樣式" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "捷克語" @@ -2500,6 +2503,7 @@ msgstr "學位" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "刪除" @@ -2579,6 +2583,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2655,7 +2663,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2785,6 +2793,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3165,10 +3177,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3243,6 +3251,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "已匯出 pipeline-flow.png" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3918,6 +3930,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4069,6 +4082,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4101,6 +4118,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "日文" @@ -4371,6 +4392,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "法律資訊" @@ -5525,6 +5550,10 @@ msgstr "在新分頁中開啟" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5745,6 +5774,10 @@ msgstr "貼上後會自動填入各欄位。" msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6213,8 +6246,8 @@ msgid "Rectangle (Full Width)" msgstr "長方形(全幅寬)" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" -msgstr "重新編輯樣式表" +msgid "Redo resume change" +msgstr "" #: src/libs/resume/section-title.ts #: src/libs/resume/section.tsx @@ -6249,6 +6282,7 @@ msgstr "記得密碼?<0/>" msgid "Remote, Hybrid, a city…" msgstr "遠端、混合、一座城市…" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6293,7 +6327,16 @@ msgstr "移除標籤" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6359,15 +6402,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "全大寫只用於簡短的標題。它會拖慢閱讀速度,還可能讓區分大小寫的搜尋失效。" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "重設密碼" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "重設您的密碼" @@ -6479,6 +6522,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6533,6 +6580,10 @@ msgstr "" msgid "Rotation" msgstr "旋轉" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "重新執行" @@ -6622,6 +6673,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "儲存時間比預期更久。您的變更仍然保留。" @@ -7830,6 +7886,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "同一行文字在每一頁都重複出現。" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7907,6 +7967,10 @@ msgstr "此連線請求無效或已過期。" msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8171,7 +8235,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8287,8 +8351,8 @@ msgid "Undo" msgstr "撤銷" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" -msgstr "撤銷樣式表編輯" +msgid "Undo resume change" +msgstr "" #: src/features/homepage/check.tsx #: src/features/homepage/hero.tsx @@ -8424,12 +8488,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8470,10 +8534,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8558,8 +8618,8 @@ msgid "Verifying password..." msgstr "正在驗證密碼…" #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." -msgstr "重設密碼時必須先驗證您的電子郵件。" +msgid "Verifying your email confirms that you own this address." +msgstr "" #: src/features/applications/components/detail/sent-documents.tsx msgid "Version sent {date}" @@ -8922,6 +8982,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/locales/zu-ZA.po b/apps/web/locales/zu-ZA.po index 73d5f2283..15c6d14f1 100644 --- a/apps/web/locales/zu-ZA.po +++ b/apps/web/locales/zu-ZA.po @@ -162,7 +162,7 @@ msgstr "" #. placeholder {0}: insights.total #: src/features/applications/components/insights-view.tsx -msgid "{0} applications tracked" +msgid "{0} active applications" msgstr "" #. placeholder {0}: insights.closed @@ -919,11 +919,6 @@ msgstr "" msgid "Add to Skills" msgstr "" -#. placeholder {0}: skills.name -#: src/features/resume/editor/check/job-match.tsx -msgid "Add to Skills · {0}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Add two or three lines at the top describing what you do." msgstr "" @@ -1340,11 +1335,6 @@ msgstr "" msgid "Autosaves are grouped by session and kept for 90 days. Named versions are kept until you delete them. Restoring saves the current state first." msgstr "" -#. placeholder {0}: window.location.host -#: src/features/resume/share/link-tab.tsx -msgid "Available · {0}/{username}/{slug}" -msgstr "" - #: src/features/ats-checker/messages.ts msgid "Avoid heavy letter-spacing effects, then re-export." msgstr "" @@ -1682,7 +1672,7 @@ msgid "Checking the exported PDF…" msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Checking…" +msgid "Checking… Copy is available after saving." msgstr "" #: src/features/resume/editor/check/check-panel.tsx @@ -1782,6 +1772,7 @@ msgstr "" msgid "Close {title}" msgstr "" +#: src/features/applications/components/board.tsx #: src/features/applications/components/detail/close-dialog.tsx msgid "Close application" msgstr "" @@ -2045,6 +2036,14 @@ msgstr "" msgid "Could not generate the DOCX. Please try again." msgstr "" +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the JSON. Please try again." +msgstr "" + +#: src/features/resume/export/use-resume-export.ts +msgid "Could not generate the Markdown. Please try again." +msgstr "" + #: src/features/resume/export/use-resume-export.ts #: src/routes/builder/letter/-components/letter-bar.tsx msgid "Could not generate the PDF. Please try again." @@ -2409,6 +2408,10 @@ msgstr "" msgid "Custom Styles" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "Custom styles aren't applied. Fix these errors to apply them:" +msgstr "" + #: src/libs/locale.ts msgid "Czech" msgstr "" @@ -2495,6 +2498,7 @@ msgstr "" #: src/features/resume/editor/write/entry-card.tsx #: src/features/resume/share/history-tab.tsx #: src/features/settings/account/data.tsx +#: src/features/settings/ai/providers.tsx msgid "Delete" msgstr "" @@ -2574,6 +2578,10 @@ msgstr "" msgid "Delete this interview?" msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Delete this provider?" +msgstr "" + #: src/features/settings/account/data.tsx msgid "Delete your account?" msgstr "" @@ -2650,7 +2658,7 @@ msgid "Design groups" msgstr "" #: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Design reset to the template defaults" +msgid "Design reset to defaults" msgstr "" #: src/features/homepage/check.tsx @@ -2780,6 +2788,10 @@ msgstr "" msgid "Download them" msgstr "" +#: src/features/resume/share/link-tab.tsx +msgid "Download totals can include repeat clicks." +msgstr "" + #: src/features/resume/share/download-tab.tsx #: src/routes/builder/letter/-components/share-sheet.tsx msgid "Downloaded {file}" @@ -3160,10 +3172,6 @@ msgstr "" msgid "Everything" msgstr "" -#: src/features/resume/editor/write/write-panel.tsx -msgid "Everything was read clearly." -msgstr "" - #: src/features/homepage/hero.tsx msgid "Everything you’ve done, on one page." msgstr "" @@ -3238,6 +3246,10 @@ msgstr "" msgid "Exported pipeline-flow.png" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Extract this account archive, then import a JSON file from its resumes or letters folder." +msgstr "" + #: src/features/resume/editor/check/parser-view.tsx msgid "Extracted from the PDF on the page · reading order" msgstr "" @@ -3913,6 +3925,7 @@ msgstr "" msgid "Import your current resume and we'll lay out every section for you to refine. Or start fresh; it takes a minute to get your name on the page." msgstr "" +#: src/features/documents/new-document-dialog.tsx #: src/features/resume/share/format.ts msgid "Imported" msgstr "" @@ -4064,6 +4077,10 @@ msgstr "" msgid "It will be removed from the timeline and calendar. This can't be undone." msgstr "" +#: src/features/settings/account/security.tsx +msgid "It will no longer sign you in." +msgstr "" + #: src/features/applications/components/interview-dialog.tsx msgid "It will show on the application's timeline and on the calendar." msgstr "" @@ -4096,6 +4113,10 @@ msgstr "" msgid "Its own design ({summary})." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Its saved key is deleted. Conversations using it need another provider." +msgstr "" + #: src/libs/locale.ts msgid "Japanese" msgstr "" @@ -4366,6 +4387,10 @@ msgstr "" msgid "Left" msgstr "" +#: src/features/resume/import/read-file.ts +msgid "Legacy Word files aren't supported. Open the file in Word and save it as .docx first." +msgstr "" + #: src/features/homepage/footer.tsx msgid "Legal" msgstr "" @@ -5520,6 +5545,10 @@ msgstr "" msgid "Opens the editor on your name. Nothing else to fill in first." msgstr "" +#: src/features/settings/ai/providers.tsx +msgid "Optional for local Ollama" +msgstr "" + #: src/features/documents/documents-page.tsx #: src/features/documents/trash-page.tsx msgid "Options" @@ -5740,6 +5769,10 @@ msgstr "" msgid "Pause the list of languages" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "PDF styles support a subset of CSS. Rotation, dashed and dotted borders, and some layout properties are ignored." +msgstr "" + #: src/features/homepage/faq.tsx msgid "PDF, Word (DOCX), Markdown and JSON. The JSON export imports back into any Reactive Resume, including one you host yourself, so your data is never locked in." msgstr "" @@ -6208,7 +6241,7 @@ msgid "Rectangle (Full Width)" msgstr "" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Redo stylesheet edit" +msgid "Redo resume change" msgstr "" #: src/libs/resume/section-title.ts @@ -6244,6 +6277,7 @@ msgstr "" msgid "Remote, Hybrid, a city…" msgstr "" +#: src/features/resume/editor/write/picture-settings.tsx #: src/features/resume/share/link-tab.tsx #: src/features/settings/account/profile.tsx #: src/features/settings/account/security.tsx @@ -6288,7 +6322,16 @@ msgstr "" msgid "Remove the password?" msgstr "" +#: src/features/settings/account/security.tsx +msgid "Remove this passkey?" +msgstr "" + +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Remove this photo?" +msgstr "" + #: src/features/documents/document-actions.tsx +#: src/features/settings/account/security.tsx msgid "Rename" msgstr "" @@ -6354,15 +6397,15 @@ msgstr "" msgid "Reserve capitals for short headings. They slow reading and can defeat case-sensitive search." msgstr "" +#: src/routes/builder/$resumeId/-components/design-panel.tsx +msgid "Reset design defaults" +msgstr "" + #. Primary action button label on reset-password form #: src/features/auth/pages/reset-password.tsx msgid "Reset Password" msgstr "" -#: src/routes/builder/$resumeId/-components/design-panel.tsx -msgid "Reset to template defaults" -msgstr "" - #: src/features/auth/pages/reset-password.tsx msgid "Reset your password" msgstr "" @@ -6474,6 +6517,10 @@ msgstr "" msgid "Review" msgstr "" +#: src/features/resume/editor/write/write-panel.tsx +msgid "Review each section before using this resume." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Review writing" msgstr "" @@ -6528,6 +6575,10 @@ msgstr "" msgid "Rotation" msgstr "" +#: src/features/resume/editor/write/picture-settings.tsx +msgid "Rotation isn't supported by PDF rendering." +msgstr "" + #: src/features/resume/editor/check/writing-tab.tsx msgid "Run again" msgstr "" @@ -6617,6 +6668,11 @@ msgstr "" msgid "Saved as an application and linked" msgstr "" +#. placeholder {0}: window.location.host +#: src/features/resume/share/link-tab.tsx +msgid "Saving {0}/{username}/{slug}… Copy is available after saving." +msgstr "" + #: src/features/resume/builder/draft.ts msgid "Saving is taking longer than expected. Your changes are still open." msgstr "" @@ -7825,6 +7881,10 @@ msgstr "" msgid "The same line repeats on every page." msgstr "" +#: src/libs/error-message.ts +msgid "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer." +msgstr "" + #: src/features/resume/editor/check/check-panel.tsx msgid "The score counts how reliably software reads your resume. It doesn't predict whether you'll be shortlisted." msgstr "" @@ -7902,6 +7962,10 @@ msgstr "" msgid "This conversation couldn't be opened." msgstr "" +#: src/features/resume/editor/write/dates-field.tsx +msgid "This date hasn't been saved. Use a month and year, like Mar 2022, or just a year. The resume keeps the last valid date." +msgstr "" + #: src/features/assistant/assistant-panel.tsx msgid "This document" msgstr "" @@ -8166,7 +8230,7 @@ msgid "Turn on the link to choose an address." msgstr "" #: src/features/resume/share/link-tab.tsx -msgid "Turn on the public link to count views and downloads. Counts are anonymous and kept for 90 days." +msgid "Turn on the public link to count views and downloads. Counts are anonymous." msgstr "" #: src/features/resume/editor/design/template-group.tsx @@ -8282,7 +8346,7 @@ msgid "Undo" msgstr "" #: src/features/resume/stylesheet/toolbar.tsx -msgid "Undo stylesheet edit" +msgid "Undo resume change" msgstr "" #: src/features/homepage/check.tsx @@ -8419,12 +8483,12 @@ msgstr "" msgid "Use {url}" msgstr "" -#: src/features/resume/editor/design/style-groups.tsx -msgid "Use a darker shade" +#: src/features/settings/account/profile.tsx +msgid "Use 3 to 64 lowercase letters, numbers, dots, hyphens and underscores." msgstr "" -#: src/features/resume/editor/write/dates-field.tsx -msgid "Use a month and year, like Mar 2022, or just a year." +#: src/features/resume/editor/design/style-groups.tsx +msgid "Use a darker shade" msgstr "" #: src/features/ats-checker/messages.ts @@ -8465,10 +8529,6 @@ msgstr "" msgid "Use lowercase letters, numbers and single dashes." msgstr "" -#: src/features/settings/account/profile.tsx -msgid "Use lowercase letters, numbers, dots, hyphens and underscores." -msgstr "" - #: src/features/resume/editor/check/issues.ts msgid "Use one column" msgstr "" @@ -8553,7 +8613,7 @@ msgid "Verifying password..." msgstr "" #: src/features/auth/pages/register.tsx -msgid "Verifying your email is required when resetting your password." +msgid "Verifying your email confirms that you own this address." msgstr "" #: src/features/applications/components/detail/sent-documents.tsx @@ -8917,6 +8977,10 @@ msgstr "" msgid "You’ll own our <0>design systems, run <1>user research with customers and hold a high bar for <2>accessibility, working in a <3>cross-functional team." msgstr "" +#: src/features/resume/builder/draft.ts +msgid "You're offline. Reconnect to save your changes before leaving." +msgstr "" + #. Hero headline, line 2 of 4: “Everything / you’ve done, / on one / page.” #: src/features/homepage/hero.tsx msgid "you’ve done," diff --git a/apps/web/src/components/typography/combobox.test.tsx b/apps/web/src/components/typography/combobox.test.tsx index c018aaa99..e370aaa0d 100644 --- a/apps/web/src/components/typography/combobox.test.tsx +++ b/apps/web/src/components/typography/combobox.test.tsx @@ -3,6 +3,7 @@ import { render } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { FontWeightCombobox } from "./combobox"; +import { getNextWeights } from "./get-next-weights"; const comboboxMock = vi.hoisted(() => ({ props: undefined as { onValueChange?: (value: string[] | null) => void } | undefined, @@ -20,6 +21,16 @@ vi.mock("@/components/ui/combobox", () => ({ })); describe("FontWeightCombobox", () => { + it("replaces the previous heading weight with one selected weight", () => { + const onValueChange = vi.fn(); + render(); + comboboxMock.props?.onValueChange?.(["600", "700"]); + expect(onValueChange).toHaveBeenCalledWith(["700"]); + }); + it("selects regular and bold body weights, and one heading weight for a new family", () => { + expect(getNextWeights("Source Sans 3")).toEqual(["400", "700"]); + expect(getNextWeights("Source Sans 3", true)).toEqual(["600"]); + }); beforeEach(() => { comboboxMock.props = undefined; }); diff --git a/apps/web/src/components/typography/combobox.tsx b/apps/web/src/components/typography/combobox.tsx index 3ec0a5cb0..3549fd1b5 100644 --- a/apps/web/src/components/typography/combobox.tsx +++ b/apps/web/src/components/typography/combobox.tsx @@ -26,10 +26,14 @@ export function FontFamilyCombobox({ className, ...props }: FontFamilyComboboxPr return ; } -type FontWeightComboboxProps = Omit & { fontFamily: string }; +type FontWeightComboboxProps = Omit & { + fontFamily: string; + single?: boolean; +}; export function FontWeightCombobox({ fontFamily, + single = false, onValueChange, value, defaultValue, @@ -54,10 +58,15 @@ export function FontWeightCombobox({ })); }, [fontFamily]); - const sortedValue = value ? sortFontWeights(value) : value; - const sortedDefaultValue = defaultValue ? sortFontWeights(defaultValue) : defaultValue; + const sortedValue = value ? sortFontWeights(value).slice(single ? -1 : 0) : value; + const sortedDefaultValue = defaultValue ? sortFontWeights(defaultValue).slice(single ? -1 : 0) : defaultValue; const handleValueChange = (nextValue: string[] | null) => { + if (single && nextValue?.length) { + const selected = nextValue.find((weight) => !sortedValue?.includes(weight)) ?? nextValue.at(-1); + onValueChange?.(selected ? [selected] : []); + return; + } onValueChange?.(nextValue ? sortFontWeights(nextValue) : nextValue); }; diff --git a/apps/web/src/components/typography/get-next-weights.ts b/apps/web/src/components/typography/get-next-weights.ts index ac9bbbf69..d499d24c3 100644 --- a/apps/web/src/components/typography/get-next-weights.ts +++ b/apps/web/src/components/typography/get-next-weights.ts @@ -2,17 +2,18 @@ import { getFont } from "@reactive-resume/fonts"; type Weight = "100" | "200" | "300" | "400" | "500" | "600" | "700" | "800" | "900"; -export function getNextWeights(fontFamily: string): Weight[] | null { +export function getNextWeights(fontFamily: string, single = false): Weight[] | null { const fontData = getFont(fontFamily); if (!fontData || !Array.isArray(fontData.weights) || fontData.weights.length === 0) return null; const uniqueWeights = [...new Set(fontData.weights)] as Weight[]; - // Try to pick 400 and 600 if available + if (single) return [uniqueWeights.includes("600") ? "600" : (uniqueWeights.at(-1) ?? "400")]; + // Body text uses a regular weight and a bold weight. const weights: Weight[] = []; if (uniqueWeights.includes("400")) weights.push("400"); - if (uniqueWeights.includes("600")) weights.push("600"); + if (uniqueWeights.includes("700")) weights.push("700"); const selectedWeights = new Set(weights); diff --git a/apps/web/src/dialogs/auth/change-password.tsx b/apps/web/src/dialogs/auth/change-password.tsx index f7f41f252..9bc71347f 100644 --- a/apps/web/src/dialogs/auth/change-password.tsx +++ b/apps/web/src/dialogs/auth/change-password.tsx @@ -24,7 +24,7 @@ import { useDialogStore } from "../store"; const formSchema = z .object({ currentPassword: z.string().min(6).max(64), - newPassword: z.string().min(6).max(64), + newPassword: z.string().min(8).max(64), }) .refine((data) => data.newPassword !== data.currentPassword, { message: "New password cannot be the same as the current password.", @@ -127,7 +127,7 @@ export function ChangePasswordDialog(_: DialogProps<"auth.change-password">) { ({ enable: vi.fn(), verify: vi.fn(), close: vi.fn() })); +vi.mock("@/libs/auth/client", () => ({ + authClient: { twoFactor: { enable: mocks.enable, verifyTotp: mocks.verify } }, +})); +vi.mock("@tanstack/react-query", () => ({ useQueryClient: () => ({ invalidateQueries: vi.fn(async () => {}) }) })); +vi.mock("@tanstack/react-router", () => ({ useRouter: () => ({ invalidate: vi.fn() }) })); +vi.mock("@/hooks/use-form-blocker", () => ({ useFormBlocker: () => ({ requestClose: mocks.close }) })); +vi.mock("@reactive-resume/ui/components/toast", () => ({ toast: { add: vi.fn(), close: vi.fn() } })); +vi.mock("../store", () => ({ + useDialogStore: (select: (state: unknown) => unknown) => select({ closeDialog: mocks.close }), +})); + +import { EnableTwoFactorDialog } from "./enable-two-factor"; + +beforeEach(() => { + vi.clearAllMocks(); + i18n.loadAndActivate({ locale: "en-US", messages: {} }); + mocks.enable.mockResolvedValue({ + data: { method: "totp", totpURI: "otpauth://totp/Resume?secret=ABC", backupCodes: ["82cNK-qaOiN"] }, + error: null, + }); +}); +afterEach(cleanup); + +it("shows recoverable backup codes before the TOTP verification that activates two-factor authentication", async () => { + render( + + + + + , + ); + const password = screen.getByLabelText("Password"); + fireEvent.change(password, { target: { value: "password123" } }); + fireEvent.click(screen.getByRole("button", { name: "Continue" })); + await waitFor(() => expect(screen.getByText("82cNK-qaOiN")).toBeDefined()); + expect(mocks.verify).not.toHaveBeenCalled(); + expect(mocks.close).not.toHaveBeenCalled(); + fireEvent.click(screen.getByRole("button", { name: "Continue" })); + await waitFor(() => expect(screen.getByText(/6 digit code/)).toBeDefined()); + expect(mocks.verify).not.toHaveBeenCalled(); +}); diff --git a/apps/web/src/dialogs/auth/enable-two-factor.tsx b/apps/web/src/dialogs/auth/enable-two-factor.tsx index 524fef2e4..945ca78bb 100644 --- a/apps/web/src/dialogs/auth/enable-two-factor.tsx +++ b/apps/web/src/dialogs/auth/enable-two-factor.tsx @@ -87,7 +87,7 @@ export function EnableTwoFactorDialog(_: DialogProps<"auth.two-factor.enable">) if (data.method === "totp") { setTotpUri(data.totpURI); setBackupCodes(data.backupCodes); - setStep("verify"); + setStep("backup"); toast.close(toastId); } else { toast.add({ type: "error", description: t`Could not set up two-factor authentication.`, id: toastId }); @@ -119,7 +119,10 @@ export function EnableTwoFactorDialog(_: DialogProps<"auth.two-factor.enable">) } toast.close(toastId); - setStep("backup"); + toast.add({ type: "success", description: t`Two-factor authentication is now enabled.` }); + void queryClient.invalidateQueries({ queryKey: sessionQueryKey }).then(() => router.invalidate()); + closeDialog(); + onReset(); }, }); @@ -137,10 +140,7 @@ export function EnableTwoFactorDialog(_: DialogProps<"auth.two-factor.enable">) }); const onConfirmBackup = () => { - toast.add({ type: "success", description: t`Two-factor authentication is now enabled.` }); - void queryClient.invalidateQueries({ queryKey: sessionQueryKey }).then(() => router.invalidate()); - closeDialog(); - onReset(); + setStep("verify"); }; const onReset = () => { diff --git a/apps/web/src/features/applications/components/application-detail-sheet.tsx b/apps/web/src/features/applications/components/application-detail-sheet.tsx index 0ddc9120e..1097db389 100644 --- a/apps/web/src/features/applications/components/application-detail-sheet.tsx +++ b/apps/web/src/features/applications/components/application-detail-sheet.tsx @@ -541,13 +541,13 @@ function PrepareButton({ application }: { application: Application }) { void navigate({ to: "/builder/$resumeId", params: { resumeId: target.id }, - search: { assistant: "prepare" }, + search: { assistant: "prepare", applicationId: application.id }, }); else if (target) void navigate({ to: "/builder/letter/$coverLetterId", params: { coverLetterId: target.id }, - search: { assistant: "prepare" }, + search: { assistant: "prepare", applicationId: application.id }, }); }} > diff --git a/apps/web/src/features/applications/components/board.tsx b/apps/web/src/features/applications/components/board.tsx index 7830b628c..7cf784818 100644 --- a/apps/web/src/features/applications/components/board.tsx +++ b/apps/web/src/features/applications/components/board.tsx @@ -13,11 +13,20 @@ import { useSensors, } from "@dnd-kit/core"; import { t } from "@lingui/core/macro"; +import { Trans } from "@lingui/react/macro"; import { useReducedMotion } from "motion/react"; import { useState } from "react"; +import { Button } from "@reactive-resume/ui/components/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@reactive-resume/ui/components/dialog"; import { cn } from "@reactive-resume/utils/style"; import { DRAG_SETTLE } from "@/libs/motion"; -import { getStageColor, getStageLabel, PIPELINE } from "../stages"; +import { CLOSED_REASONS, getClosedReasonLabel, getStageColor, getStageLabel, PIPELINE } from "../stages"; import { useApplicationActions } from "../use-application-actions"; import { ApplicationCard } from "./application-card"; @@ -38,9 +47,10 @@ const dropSideEffects = defaultDropAnimationSideEffects({ * other ways to change stage; each card's menu has Move to… for the keyboard. Desktop and tablet only. */ export function ApplicationBoard({ applications, showClosed, onOpen }: BoardProps) { - const { moveTo } = useApplicationActions(); + const { moveTo, close } = useApplicationActions(); const reduceMotion = useReducedMotion(); const [activeId, setActiveId] = useState(null); + const [closing, setClosing] = useState(null); // The list query publishes the optimistic move a task after the drop (TanStack Query notifies on a timeout), so // until it does the board shows the dropped card in its new column itself. Otherwise the card blinks back to its // old column for a frame, and the drop animation would fly there. @@ -74,6 +84,10 @@ export function ApplicationBoard({ applications, showClosed, onOpen }: BoardProp const target = event.over?.id as ApplicationStatus | undefined; const application = applications.find((item) => item.id === event.active.id); if (!target || !application || application.status === target) return; + if (target === "closed") { + setClosing(application); + return; + } // Same batched render as setActiveId(null): the card is already in its new column when the drop animation measures it. setPendingMove({ id: application.id, from: application.status, to: target }); moveTo(application, target); @@ -91,6 +105,34 @@ export function ApplicationBoard({ applications, showClosed, onOpen }: BoardProp {active ? : null} + !open && setClosing(null)}> + + + + Close application + + + {closing?.role} · {closing?.company} + + +
+ {CLOSED_REASONS.map((reason) => ( + + ))} +
+
+
); } diff --git a/apps/web/src/features/applications/components/detail/next-step-card.test.tsx b/apps/web/src/features/applications/components/detail/next-step-card.test.tsx new file mode 100644 index 000000000..eb3d3acbb --- /dev/null +++ b/apps/web/src/features/applications/components/detail/next-step-card.test.tsx @@ -0,0 +1,52 @@ +// @vitest-environment happy-dom + +import type { Application } from "../../types"; +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { expect, it, vi } from "vitest"; +import { i18n } from "@lingui/core"; +import { I18nProvider } from "@lingui/react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +const update = vi.hoisted(() => vi.fn().mockResolvedValue({})); +vi.mock("@/libs/orpc/client", () => ({ + orpc: { applications: { update: { mutationOptions: () => ({ mutationFn: update }) } } }, +})); +vi.mock("../../use-application-actions", () => ({ useInvalidateApplications: () => vi.fn() })); + +const { NextStepCard } = await import("./next-step-card"); + +it("opens the follow-up with its saved date and note, then saves the edited note", async () => { + i18n.loadAndActivate({ locale: "en", messages: {} }); + const application = { + id: "application-1", + role: "Engineer", + company: "Orbital", + status: "applied", + activity: [], + followUpAt: new Date(2026, 9, 15, 9), + followUpNote: "Ask the recruiter", + } as unknown as Application; + render( + + + + + , + ); + fireEvent.click(screen.getByRole("button", { name: "Edit" })); + fireEvent.click(await screen.findByRole("menuitem", { name: "Change the follow-up…" })); + expect((screen.getByLabelText("Date") as HTMLInputElement).value).toBe("2026-10-15"); + expect((screen.getByLabelText("What to do") as HTMLInputElement).value).toBe("Ask the recruiter"); + fireEvent.change(screen.getByLabelText("What to do"), { target: { value: "Email the recruiter" } }); + fireEvent.click(screen.getByRole("button", { name: "Save" })); + await waitFor(() => + expect(update).toHaveBeenCalledWith( + { + id: application.id, + followUpAt: application.followUpAt, + followUpNote: "Email the recruiter", + }, + expect.anything(), + ), + ); +}); diff --git a/apps/web/src/features/applications/components/detail/next-step-card.tsx b/apps/web/src/features/applications/components/detail/next-step-card.tsx index 4c83153de..b53ecebac 100644 --- a/apps/web/src/features/applications/components/detail/next-step-card.tsx +++ b/apps/web/src/features/applications/components/detail/next-step-card.tsx @@ -125,6 +125,14 @@ function FollowUpDialog({ application, open, onOpenChange }: FollowUpDialogProps const invalidate = useInvalidateApplications(); const [date, setDate] = useState(""); const [note, setNote] = useState(""); + const [wasOpen, setWasOpen] = useState(false); + if (open !== wasOpen) { + setWasOpen(open); + if (open) { + setDate(application.followUpAt ? dayKey(new Date(application.followUpAt)) : ""); + setNote(application.followUpNote ?? ""); + } + } const update = useMutation({ ...orpc.applications.update.mutationOptions(), onSuccess: () => { @@ -135,16 +143,7 @@ function FollowUpDialog({ application, open, onOpenChange }: FollowUpDialogProps }); return ( - { - if (next) { - setDate(application.followUpAt ? dayKey(new Date(application.followUpAt)) : ""); - setNote(application.followUpNote ?? ""); - } - onOpenChange(next); - }} - > + diff --git a/apps/web/src/features/applications/components/insights-view.tsx b/apps/web/src/features/applications/components/insights-view.tsx index 19ac234fa..462274cf9 100644 --- a/apps/web/src/features/applications/components/insights-view.tsx +++ b/apps/web/src/features/applications/components/insights-view.tsx @@ -1,4 +1,3 @@ -import type { ApplicationTimelineEntry } from "@reactive-resume/schema/applications/data"; import type { Application } from "../types"; import { t } from "@lingui/core/macro"; import { Plural, Trans } from "@lingui/react/macro"; @@ -13,13 +12,6 @@ import { orpc } from "@/libs/orpc/client"; import { computeInsights, computeOutcomes, computeTimeline } from "../insights"; import { getStageColor, getStageLabel } from "../stages"; -const byNewest = (a: ApplicationTimelineEntry, b: ApplicationTimelineEntry) => - new Date(b.at).getTime() - new Date(a.at).getTime(); - -const appliedDate = (app: Application) => - [...app.activity].sort(byNewest).find((entry) => entry.type === "stage" && entry.stage === "applied")?.at ?? - app.appliedAt; - /** The page's shape while stats load: the funnel, the two figures, then the charts. */ export function InsightsSkeleton() { return ( @@ -46,10 +38,8 @@ export function ApplicationInsights({ applications }: { applications: Applicatio Boolean(application.resumeId && madeFor.get(application.resumeId) === (application as Application).id), ); - // Weekly application velocity — derived from the already-loaded list, closed ones excluded. - const timeline = computeTimeline( - applications.filter((app) => app.status !== "closed").map((app) => new Date(appliedDate(app))), - ); + // Sending history includes applications that later closed, and excludes jobs never sent. + const timeline = computeTimeline(applications); const maxWeek = Math.max(1, ...timeline.map((bucket) => bucket.count)); if (!data) return ; @@ -352,7 +342,7 @@ function PipelineFlow({ insights }: { insights: ReturnType - {t`${insights.total} applications tracked`} + {t`${insights.total} active applications`} {insights.closed > 0 && ( diff --git a/apps/web/src/features/applications/insights.test.ts b/apps/web/src/features/applications/insights.test.ts index 03fab9064..374cba301 100644 --- a/apps/web/src/features/applications/insights.test.ts +++ b/apps/web/src/features/applications/insights.test.ts @@ -1,6 +1,6 @@ import type { StageCount } from "./insights"; import { describe, expect, it } from "vitest"; -import { computeOutcomes } from "./insights"; +import { computeInsights, computeOutcomes, computeTimeline } from "./insights"; describe("computeOutcomes", () => { const at = (day: number) => new Date(Date.UTC(2026, 8, day, 12)); @@ -56,4 +56,25 @@ describe("computeOutcomes", () => { expect(outcomes.heardBack).toBe(2); expect(outcomes.medianDaysToReply).toBe(7); // 4 and 10 days }); + + it("counts sent applications in weekly activity after closing, excluding never-sent jobs", () => { + const now = new Date(); + const current = applications.map((application) => ({ + ...application, + appliedAt: now, + activity: application.activity.map((entry) => ({ ...entry, at: now })), + })); + expect(computeTimeline(current, 1)[0]?.count).toBe(3); + }); +}); + +it("labels the pipeline total and percentages using active applications", () => { + const insights = computeInsights([ + { status: "saved", count: 1 }, + { status: "applied", count: 2 }, + { status: "closed", count: 4 }, + ]); + expect(insights.total).toBe(3); + expect(insights.closed).toBe(4); + expect(insights.funnel[0]?.pct).toBe(100); }); diff --git a/apps/web/src/features/applications/insights.ts b/apps/web/src/features/applications/insights.ts index e39c523c4..27c73c5b5 100644 --- a/apps/web/src/features/applications/insights.ts +++ b/apps/web/src/features/applications/insights.ts @@ -21,8 +21,8 @@ export type Insights = { export function computeInsights(byStage: StageCount[]): Insights { const counts = new Map(byStage.map((row) => [row.status, row.count])); const at = (status: ApplicationStatus) => counts.get(status) ?? 0; - const total = byStage.reduce((sum, row) => sum + row.count, 0); const closed = at("closed"); + const total = byStage.reduce((sum, row) => sum + row.count, 0) - closed; // reached[i] = active apps that got at least as far as FORWARD[i]. const reached = FORWARD.map((_, i) => FORWARD.slice(i).reduce((sum, s) => sum + at(s), 0)); @@ -61,7 +61,7 @@ export type TimelineBucket = { label: string; count: number }; // Bucket application dates into the last `weeks` calendar weeks (Sunday-started) so the Insights // view can show application velocity over time — a dimension the funnel/tiles don't capture. -export function computeTimeline(dates: Date[], weeks = 8): TimelineBucket[] { +export function computeTimeline(applications: readonly OutcomeSource[], weeks = 8): TimelineBucket[] { const msWeek = 7 * 86_400_000; const startOfWeek = new Date(); startOfWeek.setHours(0, 0, 0, 0); @@ -73,8 +73,9 @@ export function computeTimeline(dates: Date[], weeks = 8): TimelineBucket[] { }); const first = buckets[0]?.start ?? 0; - for (const date of dates) { - const time = date.getTime(); + for (const application of applications) { + if (furthestStage(application) < PIPELINE.indexOf("applied")) continue; + const time = sentAt(application).getTime(); if (time < first) continue; const index = Math.min(weeks - 1, Math.floor((time - first) / msWeek)); const bucket = buckets[index]; diff --git a/apps/web/src/features/assistant/assistant-panel.test.tsx b/apps/web/src/features/assistant/assistant-panel.test.tsx new file mode 100644 index 000000000..9b5709f58 --- /dev/null +++ b/apps/web/src/features/assistant/assistant-panel.test.tsx @@ -0,0 +1,101 @@ +// @vitest-environment happy-dom +import type { AssistantDocument } from "./document"; +import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { afterEach, beforeEach, expect, it, vi } from "vitest"; +import { i18n } from "@lingui/core"; +import { I18nProvider } from "@lingui/react"; + +const mocks = vi.hoisted(() => ({ + selected: null as string | null, + threads: [] as unknown[], + start: vi.fn(), + attach: vi.fn(), + setSelected: vi.fn(), + setPrompt: vi.fn(), + invalidate: vi.fn(), +})); +vi.mock("@tanstack/react-query", async (importOriginal) => ({ + ...(await importOriginal()), + useQuery: (options: { queryKey: string[] }) => + options.queryKey[0] === "threads" ? { data: mocks.threads, isPending: false } : {}, + useQueryClient: () => ({ invalidateQueries: mocks.invalidate }), +})); +vi.mock("@tanstack/react-router", () => ({ useNavigate: () => vi.fn(), Link: () => null })); +vi.mock("@/features/resume/editor/store", () => ({ + useEditorStore: Object.assign( + (select: (state: unknown) => unknown) => + select({ + assistantThread: mocks.selected, + setAssistantThread: mocks.setSelected, + assistantPrompt: null, + setAssistantPrompt: mocks.setPrompt, + }), + { getState: () => ({ setAssistantSuggestions: vi.fn() }) }, + ), +})); +vi.mock("@/features/settings/integrations/hooks/use-has-usable-ai-provider", () => ({ + useHasUsableAiProvider: () => ({ usableProviders: [{ id: "provider-1", label: "Local" }], hasUsableProvider: true }), +})); +vi.mock("@/libs/orpc/client", () => ({ + client: { agent: { threads: { start: mocks.start }, attachments: { create: mocks.attach } } }, + orpc: { + agent: { + threads: { + list: { key: () => ["threads"], queryOptions: () => ({ queryKey: ["threads"] }) }, + get: { queryOptions: () => ({ queryKey: ["thread"] }) }, + }, + }, + }, +})); +vi.mock("@reactive-resume/ui/components/toast", () => ({ toast: { add: vi.fn() } })); +vi.mock("./chat", () => ({ fileToBase64: async () => "Zm9v" })); + +import { AssistantPanel } from "./assistant-panel"; + +const document: AssistantDocument = { + kind: "resume", + id: "resume-1", + name: "Resume", + locked: false, + posting: null, + stateOf: () => "pending", + accept: () => {}, + locationOf: () => undefined, +}; +beforeEach(() => { + vi.clearAllMocks(); + mocks.selected = null; + mocks.threads = []; + mocks.setSelected.mockImplementation((selected: string) => { + mocks.selected = selected; + }); + mocks.start.mockResolvedValue({ id: "draft-thread" }); + mocks.attach.mockResolvedValue({ id: "file-1", filename: "posting.txt", mediaType: "text/plain" }); + i18n.loadAndActivate({ locale: "en-US", messages: {} }); +}); +afterEach(cleanup); + +it("keeps first-message text and attachments when the draft appears in a background thread-list refetch", async () => { + const panel = ( + + {}} /> + + ); + const { container, rerender } = render(panel); + fireEvent.change(screen.getByRole("textbox"), { target: { value: "Keep my first message" } }); + const input = container.querySelector('input[type="file"]'); + if (!input) throw new Error("First-message attachment picker missing"); + fireEvent.change(input, { target: { files: [new File(["foo"], "posting.txt", { type: "text/plain" })] } }); + await waitFor(() => expect(screen.getByText("posting.txt")).toBeDefined()); + mocks.threads = [ + { id: "draft-thread", workingResumeId: "resume-1", coverLetterId: null, aiProviderId: "provider-1" }, + ]; + rerender( + + {}} /> + , + ); + expect((screen.getByRole("textbox") as HTMLTextAreaElement).value).toBe("Keep my first message"); + expect(screen.getByText("posting.txt")).toBeDefined(); + expect(mocks.setSelected).toHaveBeenCalledWith("new"); +}); diff --git a/apps/web/src/features/assistant/assistant-panel.tsx b/apps/web/src/features/assistant/assistant-panel.tsx index 93e427d55..75ffb7e55 100644 --- a/apps/web/src/features/assistant/assistant-panel.tsx +++ b/apps/web/src/features/assistant/assistant-panel.tsx @@ -1,6 +1,7 @@ import type { IconName } from "@reactive-resume/ui/components/icon"; import type { ReactNode } from "react"; import type { RouterOutput } from "@/libs/orpc/client"; +import type { ChatAttachment, MessageContext } from "./chat"; import type { AssistantDocument } from "./document"; import { t } from "@lingui/core/macro"; import { useLingui } from "@lingui/react"; @@ -60,6 +61,11 @@ export function AssistantPanel({ document, onClose }: AssistantPanelProps) { const [providerId, setProviderId] = useState(null); const [modelMenuOpen, setModelMenuOpen] = useState(false); const [starting, setStarting] = useState(false); + const [context, setContext] = useState({ document: true, posting: true }); + const [promptAttachments, setPromptAttachments] = useState([]); + const [draftKey, setDraftKey] = useState(0); + const draftThread = useRef(null); + const creatingThread = useRef | null>(null); const mine = (threads.data ?? []).filter((thread) => belongsTo(thread, document)); // Opens the document's latest conversation unless a new one (or another) was asked for. @@ -72,17 +78,36 @@ export function AssistantPanel({ document, onClose }: AssistantPanelProps) { (threadId ? undefined : usable[0]); const providerLabel = provider?.label ?? summary?.providerLabel ?? t`your provider`; - const start = async (text: string) => { - if (starting) return; - setStarting(true); + const ensureThread = async (): Promise => { + if (draftThread.current) return draftThread.current; + if (creatingThread.current) return creatingThread.current; + // A list refetch must not auto-open this empty draft while its composer still holds unsent files. + setSelected("new"); const input = { ...(document.kind === "letter" ? { coverLetterId: document.id } : { resumeId: document.id }), ...(provider ? { aiProviderId: provider.id } : {}), }; + const creating = client.agent.threads.start(input).then((created) => { + if (creatingThread.current === creating) draftThread.current = created.id; + return created.id; + }); + creatingThread.current = creating; try { - const created = await client.agent.threads.start(input); + return await creating; + } finally { + if (creatingThread.current === creating) creatingThread.current = null; + } + }; + + const start = async (text: string, attachments: ChatAttachment[] = []) => { + if (starting) return; + setStarting(true); + try { + const id = await ensureThread(); setPrompt(text); - setSelected(created.id); + setPromptAttachments(attachments); + setSelected(id); + draftThread.current = null; useEditorStore.getState().setAssistantSuggestions(null); setView("thread"); void queryClient.invalidateQueries({ queryKey: orpc.agent.threads.list.key() }); @@ -104,9 +129,11 @@ export function AssistantPanel({ document, onClose }: AssistantPanelProps) { }); const chooseProvider = async (id: string) => { - if (!threadId) return setProviderId(id); + if (!threadId) setProviderId(id); + const targetThreadId = threadId ?? draftThread.current; + if (!targetThreadId) return; try { - await client.agent.threads.update({ id: threadId, aiProviderId: id }); + await client.agent.threads.update({ id: targetThreadId, aiProviderId: id }); await queryClient.invalidateQueries({ queryKey: orpc.agent.threads.list.key() }); } catch (error) { toast.add({ type: "error", description: getOrpcErrorMessage(error, { fallback: t`Couldn't switch models.` }) }); @@ -140,6 +167,11 @@ export function AssistantPanel({ document, onClose }: AssistantPanelProps) { label={t`New conversation`} className="text-ink-2" onClick={() => { + draftThread.current = null; + creatingThread.current = null; + setDraftKey((key) => key + 1); + setContext({ document: true, posting: true }); + setPromptAttachments([]); setSelected("new"); setView("thread"); }} @@ -192,21 +224,28 @@ export function AssistantPanel({ document, onClose }: AssistantPanelProps) { document={document} providerLabel={providerLabel} prompt={selected === threadId ? prompt : null} - onPromptSent={() => setPrompt(null)} + promptAttachments={promptAttachments} + initialContext={{ ...context, ...(document.posting ? { applicationId: document.posting.id } : {}) }} + onPromptSent={() => { + setPrompt(null); + setPromptAttachments([]); + }} onSwitchModel={() => setModelMenuOpen(true)} /> ) : ( <> void start(text)} /> undefined} + context={context} + onContextChange={setContext} providerLabel={providerLabel} streaming={starting} disabled={document.locked} threadId={null} - onSend={(text) => void start(text)} + ensureThread={ensureThread} + onSend={(text, attachments) => void start(text, attachments)} onStop={() => undefined} /> @@ -220,6 +259,8 @@ type ConversationLoaderProps = { document: AssistantDocument; providerLabel: string; prompt: string | null; + promptAttachments: ChatAttachment[]; + initialContext: MessageContext; onPromptSent: () => void; onSwitchModel: () => void; }; diff --git a/apps/web/src/features/assistant/chat.ts b/apps/web/src/features/assistant/chat.ts index 52d0a1c7c..1be08a454 100644 --- a/apps/web/src/features/assistant/chat.ts +++ b/apps/web/src/features/assistant/chat.ts @@ -8,7 +8,7 @@ import { agentMessageMetadataSchema } from "@reactive-resume/ai/tools/agent-tool import { streamClient } from "@/libs/orpc/client"; /** What a message shares with the model; each context chip turns one off. */ -export type MessageContext = { document: boolean; posting: boolean }; +export type MessageContext = { document: boolean; posting: boolean; applicationId?: string }; export type ChatAttachment = { id: string; filename: string; mediaType: string }; diff --git a/apps/web/src/features/assistant/conversation.test.tsx b/apps/web/src/features/assistant/conversation.test.tsx new file mode 100644 index 000000000..558356e10 --- /dev/null +++ b/apps/web/src/features/assistant/conversation.test.tsx @@ -0,0 +1,113 @@ +// @vitest-environment happy-dom +import type { AssistantDocument } from "./document"; +import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { afterEach, beforeEach, expect, it, vi } from "vitest"; +import { i18n } from "@lingui/core"; +import { I18nProvider } from "@lingui/react"; + +const mocks = vi.hoisted(() => ({ chat: vi.fn(), send: vi.fn(), attach: vi.fn(), publish: vi.fn() })); +vi.mock("@tanstack/react-query", () => ({ useQueryClient: () => ({ invalidateQueries: vi.fn() }) })); +vi.mock("@/features/resume/editor/store", () => ({ + useEditorStore: (select: (state: unknown) => unknown) => select({ setAssistantProposals: mocks.publish }), +})); +vi.mock("@/libs/orpc/client", () => ({ + client: { agent: { attachments: { create: mocks.attach } } }, + orpc: { agent: { threads: { list: { key: () => ["threads"] } } } }, +})); +vi.mock("@reactive-resume/ui/components/toast", () => ({ toast: { add: vi.fn() } })); +vi.mock("./chat", () => ({ + useAssistantChat: mocks.chat, + fileToBase64: async () => "Zm9v", + attachmentPart: (file: { id: string; filename: string; mediaType: string }) => ({ + type: "file", + url: `agent-attachment:${file.id}`, + filename: file.filename, + mediaType: file.mediaType, + }), + transcriptOf: () => "", +})); + +import { Composer, Conversation } from "./conversation"; + +const document: AssistantDocument = { + kind: "resume", + id: "resume-1", + name: "Resume", + locked: false, + posting: { id: "application-2", company: "Selected Company", role: "Engineer" }, + stateOf: () => "pending", + accept: () => {}, + locationOf: () => undefined, +}; +beforeEach(() => { + vi.clearAllMocks(); + i18n.loadAndActivate({ locale: "en-US", messages: {} }); + mocks.chat.mockReturnValue({ messages: [], sendMessage: mocks.send, status: "ready", clearError: vi.fn() }); + mocks.attach.mockResolvedValue({ id: "file-1", filename: "posting.txt", mediaType: "text/plain" }); +}); +afterEach(cleanup); + +it("uploads a file in the initial composer before sending its first message", async () => { + const ensureThread = vi.fn(async () => "draft-thread"); + const send = vi.fn(); + const { container } = render( + + {}} + providerLabel="Local" + streaming={false} + disabled={false} + threadId={null} + ensureThread={ensureThread} + onSend={send} + onStop={() => {}} + /> + , + ); + expect(screen.getByRole("button", { name: "Attach a file" })).toBeDefined(); + const input = container.querySelector('input[type="file"]'); + if (!input) throw new Error("File picker missing"); + fireEvent.change(input, { target: { files: [new File(["foo"], "posting.txt", { type: "text/plain" })] } }); + await waitFor(() => expect(screen.getByText("posting.txt")).toBeDefined()); + expect(mocks.attach).toHaveBeenCalledWith({ + threadId: "draft-thread", + filename: "posting.txt", + mediaType: "text/plain", + data: "Zm9v", + }); + fireEvent.change(screen.getByRole("textbox"), { target: { value: "Review this posting" } }); + fireEvent.click(screen.getByRole("button", { name: "Send" })); + expect(send).toHaveBeenCalledWith("Review this posting", [ + { id: "file-1", filename: "posting.txt", mediaType: "text/plain" }, + ]); +}); + +it("preserves first-message context exclusions, selected application and attachment IDs", async () => { + const context = { document: false, posting: true, applicationId: "application-2" }; + render( + + {}} + onSwitchModel={() => {}} + /> + , + ); + await waitFor(() => + expect(mocks.send).toHaveBeenCalledWith( + { text: "Prepare", files: [expect.objectContaining({ url: "agent-attachment:file-1" })] }, + { body: { attachmentIds: ["file-1"] } }, + ), + ); + expect(mocks.chat.mock.calls[0]?.[0].context).toEqual(context); +}); diff --git a/apps/web/src/features/assistant/conversation.tsx b/apps/web/src/features/assistant/conversation.tsx index c43d8b6b3..ccb610287 100644 --- a/apps/web/src/features/assistant/conversation.tsx +++ b/apps/web/src/features/assistant/conversation.tsx @@ -39,6 +39,8 @@ type ConversationProps = { providerLabel: string; /** A message to send as soon as the conversation opens (the first message, ⌘K Ask). */ prompt: string | null; + promptAttachments: ChatAttachment[]; + initialContext: MessageContext; onPromptSent: () => void; onSwitchModel: () => void; }; @@ -48,7 +50,7 @@ export function Conversation(props: ConversationProps) { const { threadId, document, readOnly } = props; const queryClient = useQueryClient(); const setAssistantProposals = useEditorStore((state) => state.setAssistantProposals); - const [context, setContext] = useState({ document: true, posting: true }); + const [context, setContext] = useState(props.initialContext); const [statuses, setStatuses] = useState>(new Map()); const [stopped, setStopped] = useState(false); const scroller = useRef(null); @@ -76,14 +78,17 @@ export function Conversation(props: ConversationProps) { }; // The first message (or ⌘K's question) goes out once the conversation is open. - const { prompt, onPromptSent } = props; + const { prompt, promptAttachments, onPromptSent } = props; const sentPrompt = useRef(false); useEffect(() => { if (!prompt || sentPrompt.current) return; sentPrompt.current = true; onPromptSent(); - sendMessage({ text: prompt }); - }, [prompt, onPromptSent, sendMessage]); + const files = promptAttachments.map(attachmentPart); + sendMessage(files.length > 0 ? { text: prompt, files } : { text: prompt }, { + body: { attachmentIds: promptAttachments.map((attachment) => attachment.id) }, + }); + }, [prompt, promptAttachments, onPromptSent, sendMessage]); // A failed continuation (after an answer) is sent again as it was; regenerating would drop the answer. const retry = () => { @@ -529,6 +534,8 @@ type ComposerProps = { disabled: boolean; /** Attachments need a conversation to belong to. */ threadId: string | null; + /** Creates a draft conversation lazily for the first attachment. */ + ensureThread?: () => Promise; onSend: (text: string, attachments?: ChatAttachment[]) => void; onStop: () => void; }; @@ -547,17 +554,18 @@ export function Composer(props: ComposerProps) { const hasText = text.trim().length > 0; const submit = () => { - if (!hasText || streaming || disabled) return; + if (!hasText || streaming || disabled || uploading) return; props.onSend(text.trim(), attachments); setText(""); setAttachments([]); }; const upload = async (files: FileList | null) => { - const { threadId } = props; - if (!files?.length || !threadId) return; + if (!files?.length) return; setUploading(true); try { + const threadId = props.threadId ?? (await props.ensureThread?.()); + if (!threadId) return; const uploaded = await Promise.all( Array.from(files).map(async (file) => { const attachment = await client.agent.attachments.create({ @@ -575,9 +583,10 @@ export function Composer(props: ComposerProps) { type: "error", description: getOrpcErrorMessage(error, { fallback: t`Couldn't attach the file.` }), }); + } finally { + setUploading(false); + if (fileInput.current) fileInput.current.value = ""; } - setUploading(false); - if (fileInput.current) fileInput.current.value = ""; }; const chips = [ @@ -655,7 +664,7 @@ export function Composer(props: ComposerProps) { }} className="field-sizing-content max-h-40 min-h-[44px] flex-1 resize-none bg-transparent px-1.5 py-1 text-sm outline-none placeholder:text-ink-3" /> - {props.threadId && ( + {(props.threadId || props.ensureThread) && ( <> ProposalState; /** Applies proposals as one undo step, with Undo in the toast. */ @@ -44,11 +45,13 @@ function locate(passages: readonly { html: string; location: string }[], before: export function useResumeAssistantDocument(): AssistantDocument { const resume = useCurrentResume(); + const { applicationId } = useSearch({ strict: false }); const { data: applications } = useQuery(applicationsListQueryOptions()); // The application it was made for, otherwise the latest one it's linked to (as the server reads it). - const application = - applications?.find((item) => item.id === resume.applicationId) ?? - applications?.find((item) => item.resumeId === resume.id); + const application = applicationId + ? applications?.find((item) => item.id === applicationId) + : (applications?.find((item) => item.id === resume.applicationId) ?? + applications?.find((item) => item.resumeId === resume.id)); return useMemo(() => { const passages = collectPassages(resume.data, { @@ -64,7 +67,7 @@ export function useResumeAssistantDocument(): AssistantDocument { id: resume.id, name: resume.name, locked: resume.isLocked, - posting: application ? { company: application.company, role: application.role } : null, + posting: application ? { id: application.id, company: application.company, role: application.role } : null, stateOf: (proposal) => getProposalState(resume.data, proposal), accept: acceptResumeProposals, locationOf: (proposal) => locate(passages, proposal.before), @@ -74,8 +77,9 @@ export function useResumeAssistantDocument(): AssistantDocument { export function useLetterAssistantDocument(): AssistantDocument | null { const letter = useLetterEditorStore((state) => state.letter); + const { applicationId } = useSearch({ strict: false }); const { data: applications } = useQuery(applicationsListQueryOptions()); - const application = applications?.find((item) => item.id === letter?.sourceApplicationId); + const application = applications?.find((item) => item.id === (applicationId ?? letter?.sourceApplicationId)); return useMemo(() => { if (!letter) return null; @@ -86,7 +90,7 @@ export function useLetterAssistantDocument(): AssistantDocument | null { id: letter.id, name: letter.name, locked: letter.isLocked, - posting: application ? { company: application.company, role: application.role } : null, + posting: application ? { id: application.id, company: application.company, role: application.role } : null, stateOf: (proposal) => getStateIn(letter.content, proposal), accept: (proposals) => { const { letter: current, edit } = useLetterEditorStore.getState(); diff --git a/apps/web/src/features/ats-checker/checker.tsx b/apps/web/src/features/ats-checker/checker.tsx index d05559709..b500ac7c5 100644 --- a/apps/web/src/features/ats-checker/checker.tsx +++ b/apps/web/src/features/ats-checker/checker.tsx @@ -324,7 +324,7 @@ type Row = { key: string; title: string; count: string; tone: "danger" | "warn" /** One row per category with something to fix, worst first, plus the posting's terms when one was pasted. */ function issueRows(report: PdfAtsReport): Row[] { const byCategory = new Map(); - for (const finding of report.findings) + for (const finding of [...report.findings, ...report.tips]) byCategory.set(finding.category, [...(byCategory.get(finding.category) ?? []), finding]); const rows: Row[] = [...byCategory.entries()] @@ -332,7 +332,11 @@ function issueRows(report: PdfAtsReport): Row[] { key: category, title: getPdfCategoryLabel(category), count: String(findings.length), - tone: findings.some((finding) => finding.severity === "blocker") ? ("danger" as const) : ("warn" as const), + tone: findings.some((finding) => finding.severity === "blocker") + ? ("danger" as const) + : findings.every((finding) => finding.severity === "tip") + ? ("accent" as const) + : ("warn" as const), body: (
    {findings.map((finding) => { @@ -429,7 +433,15 @@ function Result({ result, file, onFix, onReset }: ResultProps) { className="flex h-12 w-full items-center gap-2.5 px-3.5 text-start font-medium text-sm transition-colors duration-quick hover:bg-hover" > { }); describe("OAuth callback after two-factor verification", () => { + it.each(["82cNKqaOiN", "82cNK-qaOiN"])("submits a complete backup code entered as %s", async (code) => { + const { container } = render( + + + , + ); + const input = container.querySelector('input[name="code"]'); + const form = container.querySelector("form"); + if (!input || !form) throw new Error("Verification form is missing"); + expect(input.maxLength).toBeGreaterThanOrEqual(code.length); + fireEvent.change(input, { target: { value: code } }); + fireEvent.submit(form); + await waitFor(() => + expect(mocks.verifyBackupCode).toHaveBeenCalledWith(expect.objectContaining({ code: "82cNK-qaOiN" })), + ); + }); it.each([false, true])("resumes the callback after verifying a code (backup: %s)", async (backup) => { const { container } = render( {backup ? : }, @@ -170,6 +186,28 @@ describe("OAuth callback after two-factor verification", () => { }); describe("OAuth account creation", () => { + it("rejects a seven-character new password before contacting auth", async () => { + const { container } = render( + + + , + ); + for (const [name, value] of Object.entries({ + name: "New User", + username: "newuser", + email: "new@example.com", + password: "1234567", + })) { + const input = container.querySelector(`input[name="${name}"]`); + if (!input) throw new Error(`Missing ${name} field`); + fireEvent.change(input, { target: { value } }); + } + const form = container.querySelector("form"); + if (!form) throw new Error("Missing registration form"); + fireEvent.submit(form); + await waitFor(() => expect(screen.getByText(/>=8/)).toBeDefined()); + expect(mocks.signup).not.toHaveBeenCalled(); + }); it("continues a create prompt only after successful signup", async () => { mocks.callbackURL += "&prompt=create"; mocks.signup.mockResolvedValueOnce({ data: { token: "session" }, error: null }); diff --git a/apps/web/src/features/auth/pages/register.tsx b/apps/web/src/features/auth/pages/register.tsx index e2d43b02e..7e4166e0d 100644 --- a/apps/web/src/features/auth/pages/register.tsx +++ b/apps/web/src/features/auth/pages/register.tsx @@ -31,7 +31,7 @@ const formSchema = z.object({ message: "Username can only contain lowercase letters, numbers, dots, hyphens and underscores.", }), email: z.email().toLowerCase(), - password: z.string().min(6).max(64), + password: z.string().min(8).max(64), }); type Props = { @@ -217,7 +217,7 @@ export function RegisterPage({ disableEmailAuth }: Props) { This step is optional, but recommended. - Verifying your email is required when resetting your password. + Verifying your email confirms that you own this address. diff --git a/apps/web/src/features/auth/pages/reset-password.tsx b/apps/web/src/features/auth/pages/reset-password.tsx index 0e9762d31..751af8edf 100644 --- a/apps/web/src/features/auth/pages/reset-password.tsx +++ b/apps/web/src/features/auth/pages/reset-password.tsx @@ -10,7 +10,7 @@ import { authClient } from "@/libs/auth/client"; import { useAppForm } from "@/libs/tanstack-form"; const formSchema = z.object({ - password: z.string().min(6).max(64), + password: z.string().min(8).max(64), }); type Props = { @@ -81,7 +81,7 @@ export function ResetPasswordPage({ token }: Props) { { // Only handle if the command palette is open if (!open) return; diff --git a/apps/web/src/features/documents/document-card.tsx b/apps/web/src/features/documents/document-card.tsx index 84397b1d4..c5164713c 100644 --- a/apps/web/src/features/documents/document-card.tsx +++ b/apps/web/src/features/documents/document-card.tsx @@ -45,6 +45,7 @@ function OpenLink({ label?: string; }) { const markOpened = useNewDocumentsStore((state) => state.markOpened); + if (document.trashedAt) return {children}; const common = { "aria-label": label, className, onClick: () => markOpened(document.id) }; return document.type === "resume" ? ( diff --git a/apps/web/src/features/documents/new-document-dialog.tsx b/apps/web/src/features/documents/new-document-dialog.tsx index 41886769f..038269be2 100644 --- a/apps/web/src/features/documents/new-document-dialog.tsx +++ b/apps/web/src/features/documents/new-document-dialog.tsx @@ -44,7 +44,7 @@ type Step = type OpenResumeOptions = { withAssistant?: boolean; importedFrom?: string }; -const ACCEPT = ".pdf,.doc,.docx,.json,.zip,application/pdf,application/json,application/zip"; +const ACCEPT = ".pdf,.docx,.json,.zip,application/pdf,application/json,application/zip"; const formatSize = (bytes: number) => bytes < 1024 * 1024 ? `${Math.max(1, Math.round(bytes / 1024))} KB` : `${(bytes / (1024 * 1024)).toFixed(1)} MB`; @@ -306,11 +306,20 @@ function ImportStep({ step, creating, onCancel, onStartBlank, onChooseFile, onCl
    - {step.name === "failed" ? Couldn't import : Importing} + {step.name === "failed" ? ( + Couldn't import + ) : step.name === "imported" ? ( + Imported + ) : ( + Importing + )}
    - + {step.file.name} {formatSize(step.file.size)} diff --git a/apps/web/src/features/resume/builder/draft.test.ts b/apps/web/src/features/resume/builder/draft.test.ts index 48d4decb7..d80978ab7 100644 --- a/apps/web/src/features/resume/builder/draft.test.ts +++ b/apps/web/src/features/resume/builder/draft.test.ts @@ -9,6 +9,7 @@ import { sortSectionItemsByPeriod } from "@reactive-resume/resume/section-sort"; import { defaultResumeData } from "@reactive-resume/schema/resume/default"; import { readUnsavedResumeData, + savePendingChanges, useBuilderResumeUpdateSubscription, useResumeCleanup, useResumeStore, @@ -344,6 +345,11 @@ describe("builder resume autosave", () => { expect(useResumeStore.getState().saveStatus).toBe("offline"); expect(readUnsavedResumeData("resume-offline")?.basics.name).toBe("Written offline"); + orpcMocks.updateResume.mockRejectedValueOnce(new TypeError("Failed to fetch")); + expect(await savePendingChanges("resume-offline")).toBe(false); + expect(toastMocks.add).toHaveBeenCalledWith( + expect.objectContaining({ id: "resume-offline-navigation", description: expect.stringContaining("Reconnect") }), + ); onLine.mockReturnValue(true); orpcMocks.updateResume.mockImplementation((input: { id: string; data: ResumeData }) => diff --git a/apps/web/src/features/resume/builder/draft.ts b/apps/web/src/features/resume/builder/draft.ts index 26faef59f..1527939fe 100644 --- a/apps/web/src/features/resume/builder/draft.ts +++ b/apps/web/src/features/resume/builder/draft.ts @@ -803,6 +803,13 @@ export function savePendingChanges(id: string): boolean | Promise { const finish = (saved: boolean) => { clearTimeout(timeout); unsubscribe(); + if (!saved && isBrowserOffline()) { + toast.add({ + type: "info", + description: t`You're offline. Reconnect to save your changes before leaving.`, + id: "resume-offline-navigation", + }); + } resolve(saved); }; const unsubscribe = useResumeStore.subscribe((state) => { diff --git a/apps/web/src/features/resume/editor/check/job-match.tsx b/apps/web/src/features/resume/editor/check/job-match.tsx index cda8ce15b..58f813556 100644 --- a/apps/web/src/features/resume/editor/check/job-match.tsx +++ b/apps/web/src/features/resume/editor/check/job-match.tsx @@ -94,7 +94,7 @@ function termAsWritten(forms: readonly string[], posting: string): string | unde type JobMatchTabProps = { match: JobMatch; data: ResumeData }; -export function JobMatchTab({ match, data }: JobMatchTabProps) { +export function JobMatchTab({ match }: JobMatchTabProps) { const { application, posting, result, hiddenTerms } = match; const [openTerm, setOpenTerm] = useState(null); const highlightTerm = useEditorStore((state) => state.highlightTerm); @@ -104,14 +104,11 @@ export function JobMatchTab({ match, data }: JobMatchTabProps) { if (!posting) return ; const open = result?.missing.find((term) => term.term === openTerm); - const skills = data.sections.skills.items.find((item) => !item.hidden); const addToSkills = (term: MatchedTerm) => { const written = term.label; editWithUndo((draft) => { - const target = draft.sections.skills.items.find((item) => item.id === skills?.id); - if (target) target.keywords.push(written); - else draft.sections.skills.items.push(newSkill(written)); + draft.sections.skills.items.push(newSkill(written)); }, t`“${written}” added to Skills`); setOpenTerm(null); setHighlightTerm(term.term); @@ -205,7 +202,7 @@ export function JobMatchTab({ match, data }: JobMatchTabProps) {
    diff --git a/apps/web/src/features/resume/editor/page-overlay.tsx b/apps/web/src/features/resume/editor/page-overlay.tsx index d4b334a61..4bb532b4b 100644 --- a/apps/web/src/features/resume/editor/page-overlay.tsx +++ b/apps/web/src/features/resume/editor/page-overlay.tsx @@ -82,7 +82,7 @@ export function PageOverlay({ pageIndex, pageMap, onSelect }: PageOverlayProps) }} > {selected && ( - + Editing )} diff --git a/apps/web/src/features/resume/editor/write/basics-card.tsx b/apps/web/src/features/resume/editor/write/basics-card.tsx index cc6eb8314..72b71b759 100644 --- a/apps/web/src/features/resume/editor/write/basics-card.tsx +++ b/apps/web/src/features/resume/editor/write/basics-card.tsx @@ -112,7 +112,7 @@ export function BasicsCard({ locked }: { locked: boolean }) { }) } /> - + @@ -159,7 +159,8 @@ function PhotoRow({ locked }: { locked: boolean }) { } /** Extra contact details (icon, text and an optional link), as "Add field" under Website. */ -function CustomFields({ fields }: { fields: CustomField[] }) { +type CustomFieldsProps = { fields: CustomField[]; locked: boolean }; +function CustomFields({ fields, locked }: CustomFieldsProps) { const updateResumeData = useUpdateResumeData(); const edit = (key: string, mutate: (list: CustomField[]) => void) => @@ -170,6 +171,7 @@ function CustomFields({ fields }: { fields: CustomField[] }) { {fields.map((field, index) => (
    @@ -180,6 +182,7 @@ function CustomFields({ fields }: { fields: CustomField[] }) { } /> @@ -193,6 +196,7 @@ function CustomFields({ fields }: { fields: CustomField[] }) { edit(`${field.id}.move`, (list) => list.splice(index - 1, 0, ...list.splice(index, 1)))} /> edit(`${field.id}.remove`, (list) => list.splice(index, 1))} /> @@ -231,7 +237,8 @@ function CustomFields({ fields }: { fields: CustomField[] }) { ))} diff --git a/apps/web/src/features/resume/editor/write/write-panel.tsx b/apps/web/src/features/resume/editor/write/write-panel.tsx index 4ccb7db01..ac759ca20 100644 --- a/apps/web/src/features/resume/editor/write/write-panel.tsx +++ b/apps/web/src/features/resume/editor/write/write-panel.tsx @@ -97,7 +97,7 @@ function ImportedNote() { {toCheck > 0 ? ( ) : ( - Everything was read clearly. + Review each section before using this resume. )} diff --git a/apps/web/src/libs/error-message.ts b/apps/web/src/libs/error-message.ts index 1e9442b76..3b98bdc8a 100644 --- a/apps/web/src/libs/error-message.ts +++ b/apps/web/src/libs/error-message.ts @@ -1,3 +1,4 @@ +import { t } from "@lingui/core/macro"; import { ORPCError } from "@orpc/client"; export function getReadableErrorMessage(error: unknown, fallback: string): string { @@ -36,6 +37,8 @@ export function getOrpcErrorMessage( }, ): string { if (!(error instanceof ORPCError)) return getReadableErrorMessage(error, options.fallback); + if (error.code === "AI_CREDENTIAL_DECRYPTION_FAILED") + return t`The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer.`; const mappedMessage = options.byCode?.[error.code]; if (mappedMessage) return mappedMessage; diff --git a/apps/web/src/libs/resume/move-item-round-trip.test.ts b/apps/web/src/libs/resume/move-item-round-trip.test.ts index 720dc3d84..3f7887b6e 100644 --- a/apps/web/src/libs/resume/move-item-round-trip.test.ts +++ b/apps/web/src/libs/resume/move-item-round-trip.test.ts @@ -1,7 +1,8 @@ import { describe, expect, it } from "vitest"; +import { i18n } from "@lingui/core"; import { produce } from "immer"; import { defaultResumeData } from "@reactive-resume/schema/resume/default"; -import { moveItem } from "./move-item"; +import { getCompatibleMoveTargets, getSourceSectionTitle, moveItem } from "./move-item"; const company = (id: string) => ({ id, @@ -25,6 +26,18 @@ const split = () => }); describe("moving the last custom-section item (#3180)", () => { + it("labels blank custom move destinations with their section type", () => { + i18n.load("en", {}); + i18n.activate("en"); + const moved = produce(split(), (draft) => { + const section = draft.customSections[0]; + if (!section) throw new Error("Missing custom section fixture"); + section.title = " "; + }); + const targets = getCompatibleMoveTargets(moved, "experience", undefined); + expect(targets.find((page) => page.pageIndex === 1)?.sections[0]?.sectionTitle).toBe("Experience"); + expect(getSourceSectionTitle(moved, "experience", moved.customSections[0]?.id)).toBe("Experience"); + }); it("restores the original JSON after moving an experience item to a new page and back", () => { const initial = base(); const moved = split(); diff --git a/apps/web/src/libs/resume/move-item.ts b/apps/web/src/libs/resume/move-item.ts index a05cde333..2c1e596d4 100644 --- a/apps/web/src/libs/resume/move-item.ts +++ b/apps/web/src/libs/resume/move-item.ts @@ -57,7 +57,7 @@ export function getSourceSectionTitle( ): string { if (customSectionId) { const customSection = resumeData.customSections.find((s) => s.id === customSectionId); - return customSection?.title ?? getDefaultSectionTitle(type); + return customSection?.title.trim() || getDefaultSectionTitle(type); } return getDefaultSectionTitle(type); @@ -107,7 +107,7 @@ export function getCompatibleMoveTargets( if (customSection && customSection.type === sourceType) { compatibleSections.push({ sectionId: customSection.id, - sectionTitle: customSection.title, + sectionTitle: customSection.title.trim() || getDefaultSectionTitle(customSection.type), isStandard: false, }); } diff --git a/apps/web/src/routes/builder/$resumeId/-components/design-panel.tsx b/apps/web/src/routes/builder/$resumeId/-components/design-panel.tsx index 8cb488806..1f923e4ca 100644 --- a/apps/web/src/routes/builder/$resumeId/-components/design-panel.tsx +++ b/apps/web/src/routes/builder/$resumeId/-components/design-panel.tsx @@ -194,7 +194,7 @@ const EXACT_SECTIONS = [ ["styles", CustomStylesSectionBuilder], ] as const; -/** Every exact value, the date format, custom CSS and Reset to template defaults, collapsed until asked for. */ +/** Every exact value, the date format, custom CSS and Reset design defaults, collapsed until asked for. */ // Controlled so the nav and Type's Custom row can open it. type AdvancedGroupProps = { open: boolean; onOpenChange: (open: boolean) => void }; @@ -224,7 +224,7 @@ function AdvancedGroup({ open, onOpenChange }: AdvancedGroupProps) { { newStep: true }, ); toast.add({ - description: t`Design reset to the template defaults`, + description: t`Design reset to defaults`, actionProps: { children: t`Undo`, onClick: () => useResumeStore.getState().undo() }, }); }; @@ -281,7 +281,7 @@ function AdvancedGroup({ open, onOpenChange }: AdvancedGroupProps) {
    diff --git a/apps/web/src/routes/builder/$resumeId/-components/use-editor-hotkeys.ts b/apps/web/src/routes/builder/$resumeId/-components/use-editor-hotkeys.ts index 8c302a107..4deb34d01 100644 --- a/apps/web/src/routes/builder/$resumeId/-components/use-editor-hotkeys.ts +++ b/apps/web/src/routes/builder/$resumeId/-components/use-editor-hotkeys.ts @@ -37,9 +37,13 @@ export function useEditorHotkeys(setMode: (mode: EditorMode) => void) { useHotkey("Mod+P", () => { if (isOnline()) void onDownloadPDF(); }); - useHotkey("Mod+Shift+S", () => { - if (isOnline()) useEditorStore.getState().setShareTab("link"); - }); + useHotkey( + "Mod+Shift+S", + () => { + if (isOnline()) useEditorStore.getState().setShareTab("link"); + }, + { ignoreInputs: true }, + ); useHotkey("Mod+Shift+E", () => { if (isOnline()) useEditorStore.getState().setShareTab("download"); }); @@ -47,7 +51,15 @@ export function useEditorHotkeys(setMode: (mode: EditorMode) => void) { const { assistantOpen, setAssistantOpen } = useEditorStore.getState(); setAssistantOpen(!assistantOpen, true); }); - useHotkey("Escape", () => useEditorStore.getState().select(null), { preventDefault: false, stopPropagation: false }); + useHotkey( + "Escape", + () => { + if (!useEditorStore.getState().selection) return; + if (isEditableElementFocused() && document.activeElement instanceof HTMLElement) document.activeElement.blur(); + useEditorStore.getState().select(null); + }, + { preventDefault: false, stopPropagation: false }, + ); useHotkey("Mod+S", () => { toast.add({ type: "info", description: t`Your changes are saved automatically.`, id: "auto-save" }); diff --git a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/notes.tsx b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/notes.tsx index 47cd54a3e..4feb3251e 100644 --- a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/notes.tsx +++ b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/notes.tsx @@ -29,7 +29,7 @@ function NotesSectionForm() { Keep private notes about this resume here. Nobody else can see them.

    - +

    For example, note which companies you sent this resume to, or links to the job descriptions. diff --git a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx index 8f4bd13e5..3ab859468 100644 --- a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx +++ b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx @@ -136,7 +136,7 @@ function TypographyGroupFields({ form, prefix, handleAutoSave }: TypographyGroup onValueChange={(value: string | null) => { if (value === null) return; field.handleChange(value); - const nextWeights = getNextWeights(value); + const nextWeights = getNextWeights(value, prefix === "heading"); if (nextWeights) form.setFieldValue(`${prefix}.fontWeights`, nextWeights); handleAutoSave(); }} @@ -158,6 +158,7 @@ function TypographyGroupFields({ form, prefix, handleAutoSave }: TypographyGroup { diff --git a/apps/web/src/routes/builder/$resumeId/route.tsx b/apps/web/src/routes/builder/$resumeId/route.tsx index e11919c85..d8dc9ae7c 100644 --- a/apps/web/src/routes/builder/$resumeId/route.tsx +++ b/apps/web/src/routes/builder/$resumeId/route.tsx @@ -16,6 +16,8 @@ const searchSchema = z.object({ // Opens the assistant on a conversation ("new" for a fresh one), or on a question to send (⌘K Ask). assistant: z.string().optional().catch(undefined), ask: z.string().max(2_000).optional().catch(undefined), + // Prepare for next step keeps the application clicked, even when a base resume serves several jobs. + applicationId: z.string().optional().catch(undefined), // The file a resume was just imported from; Write says what came in until it's dismissed. imported: z.string().max(255).optional().catch(undefined), }); diff --git a/apps/web/src/routes/builder/letter/$coverLetterId.tsx b/apps/web/src/routes/builder/letter/$coverLetterId.tsx index 839ea2dc9..d39f8d58a 100644 --- a/apps/web/src/routes/builder/letter/$coverLetterId.tsx +++ b/apps/web/src/routes/builder/letter/$coverLetterId.tsx @@ -15,6 +15,7 @@ const searchSchema = z.object({ // Opens the assistant on a conversation ("new" for a fresh one), or on a question to send (⌘K Ask). assistant: z.string().optional().catch(undefined), ask: z.string().max(2_000).optional().catch(undefined), + applicationId: z.string().optional().catch(undefined), }); export const Route = createFileRoute("/builder/letter/$coverLetterId")({ diff --git a/apps/web/src/routes/dashboard/applications/index.tsx b/apps/web/src/routes/dashboard/applications/index.tsx index 5f0688ced..6d51b7c28 100644 --- a/apps/web/src/routes/dashboard/applications/index.tsx +++ b/apps/web/src/routes/dashboard/applications/index.tsx @@ -268,7 +268,7 @@ function RouteComponent() { open={exporting} onOpenChange={setExporting} applications={applications ?? []} - filtered={filtered} + filtered={filtered.filter((application) => closed || application.status !== "closed")} /> { - if (window.matchMedia("(min-width: 640px)").matches) - throw redirect({ to: "/dashboard/settings/account", replace: true }); - }, - component: SettingsRoot, + component: RouteComponent, }); + +function RouteComponent() { + return useBreakpoint() === "mobile" ? : ; +} diff --git a/docs/applying-custom-styles.mdx b/docs/applying-custom-styles.mdx index 54b3ee4b9..811e01567 100644 --- a/docs/applying-custom-styles.mdx +++ b/docs/applying-custom-styles.mdx @@ -14,8 +14,8 @@ working when you switch templates. Reach for custom styles when you want somethi ## Before you start - Custom styles are per resume. Each resume has its own stylesheet. -- Nothing checks your CSS as you type. A rule the PDF can't use is skipped without a warning, and the rest still - applies. If you see no change on the page, the rule didn't apply. See [When a rule has no effect](#when-a-rule-has-no-effect). +- The editor reports fatal stylesheet limits. Unsupported declarations or selectors may still be skipped; the + engine limitations are listed beside the editor. If you see no change on the page, check those limits. See [When a rule has no effect](#when-a-rule-has-no-effect). - Custom styles can't add content, load fonts or images, or change what a section contains. They only restyle what's already on the page. @@ -31,7 +31,7 @@ working when you switch templates. Reach for custom styles when you want somethi view. - Scroll to **Custom Styles**, near the end of the Advanced group, just above **Reset to template defaults**. + Scroll to **Custom Styles**, near the end of the Advanced group, just above **Reset design defaults**. @@ -43,7 +43,7 @@ On a phone, Design opens as a sheet over the page. Select the **Page** tab, then settings. - **Reset to template defaults** doesn't touch your custom styles. It resets the look (fonts, colors, spacing) and + **Reset design defaults** doesn't touch your custom styles. It resets the look (fonts, colors, spacing) and keeps your stylesheet, paper size, language, date format and section layout. @@ -110,20 +110,20 @@ A few more editor helpers: | Button | What it does | | --- | --- | -| **Undo stylesheet edit** / **Redo stylesheet edit** | Steps back or forward through your resume's changes. | +| **Undo resume change** / **Redo resume change** | Steps back or forward through your resume's changes. | | **Copy stylesheet** | Copies the whole stylesheet to your clipboard. | | **Format stylesheet** | Tidies indentation and spacing. | | **Open focus mode** | Opens the editor in a larger side panel titled **Semantic CSS stylesheet**. Select **Exit focus mode** or close the panel to go back. | -Undo and redo in the stylesheet editor, including ⌘ Z and ⌘ Shift -Z while you type in it, use your resume's shared undo history. If your last change was somewhere else, such -as a template switch, undo reverses that first. See [Undoing changes and version history](/guides/undoing-changes-and-version-history). +While typing in the stylesheet editor, ⌘ Z and ⌘ Shift +Z use the editor's local text history. The toolbar buttons use your resume's shared history, so they can +also reverse a template switch or another resume change. See [Undoing changes and version history](/guides/undoing-changes-and-version-history). Your stylesheet saves automatically with the rest of the resume, and it's part of every saved version in **History**. ## When a rule has no effect -There's no error list or validity checker. The PDF engine applies what it understands and skips the rest: an +Fatal stylesheet errors appear above the editor. For individual rules, the PDF engine applies what it understands and skips the rest: an unsupported declaration is skipped on its own, and a rule with an invalid selector is skipped as a whole. If a change doesn't show: @@ -134,7 +134,7 @@ doesn't show: [engine limits](#engine-limits) below. For example, `background-color` works on containers such as `section` and `header`, but not on text elements such as `field`. 3. **Simplify.** Reduce the rule to one selector and one declaration, confirm it works, then add more. -4. **Check the size.** A stylesheet larger than 128 KB, or with more than 1,024 rules, is ignored completely. +4. **Check the limit message.** More than 128 KB, 1,024 rules, 8,192 declarations, 64 selectors in one rule or four nested media blocks makes the whole stylesheet unusable; the editor reports this. Check the downloaded PDF before you send or share a resume with custom styles. Page breaks and template-specific @@ -145,7 +145,7 @@ doesn't show: The PDF engine accepts these without an error but doesn't draw them: -- Rotation (`transform: rotate(...)`). The picture's rotation setting has no effect for the same reason. +- Rotation (`transform: rotate(...)`). The picture's Rotation control is disabled while the PDF engine lacks support. - Dashed and dotted borders. They draw as solid lines. - Percentages for padding, margin, gaps and font sizes. Percentages work only for `width`, `height`, their `min-` and `max-` forms, `flex-basis`, `left` and `right`. diff --git a/docs/guides/arranging-the-layout.mdx b/docs/guides/arranging-the-layout.mdx index 699789c98..6830e2d92 100644 --- a/docs/guides/arranging-the-layout.mdx +++ b/docs/guides/arranging-the-layout.mdx @@ -24,9 +24,9 @@ On a two-column template, a **Sidebar** panel appears under the template gallery - **Left** / **Right** puts the sidebar on that side, whatever the template's usual side is. -- **Width** sets the sidebar's share of the page, from 26% to 42%. +- **Width** sets the sidebar's share of the page, from 10% to 50%. -For a width outside that range, use **Sidebar Width** in **Advanced → Layout**, which goes from 10% to 50%. +**Sidebar Width** in **Advanced → Layout** uses the same 10% to 50% range. ## Reorder sections and move them between columns diff --git a/docs/guides/choosing-a-template.mdx b/docs/guides/choosing-a-template.mdx index 029a8926f..26a54acc1 100644 --- a/docs/guides/choosing-a-template.mdx +++ b/docs/guides/choosing-a-template.mdx @@ -140,9 +140,9 @@ In a one-column template, sections you placed in the sidebar print after the mai ## Reset the design settings -If you have changed a lot of design settings and want a clean slate, open **Advanced** at the bottom of the Design panel and select **Reset to template defaults**. This resets fonts, text size, line height, colors, level style, sidebar width, margins, spacing and the icon and underline switches. Your template, paper size, language, date format, section placement and custom CSS stay as they are. A message offers **Undo**. +If you have changed a lot of design settings and want a clean slate, open **Advanced** at the bottom of the Design panel and select **Reset design defaults**. This resets fonts, text size, line height, colors, level style, sidebar width, margins, spacing and the icon and underline switches. Your template, paper size, language, date format, section placement and custom CSS stay as they are. A message offers **Undo**. -Despite the name, the reset doesn't depend on the template: every template goes back to the same standard settings (IBM Plex Serif at 10 pt, a red accent, circle levels and hidden section icons). Pick a font pairing and accent color again afterwards if you want a different starting point. +The reset doesn't depend on the template: every template goes back to the same standard settings (IBM Plex Serif at 10 pt, a red accent, circle levels and hidden section icons). Pick a font pairing and accent color again afterwards if you want a different starting point. If Design's controls are greyed out, the resume is locked. Open the document name menu at the top left and select **Unlock editing**. diff --git a/docs/guides/customizing-typography.mdx b/docs/guides/customizing-typography.mdx index 0212b3437..3415f8ed0 100644 --- a/docs/guides/customizing-typography.mdx +++ b/docs/guides/customizing-typography.mdx @@ -82,7 +82,7 @@ The list contains Google Fonts plus the PDF standard fonts Helvetica, Courier an | Field | What it does | | --- | --- | -| **Font Family** | The font, from the full list. Choosing a new family also picks two of its weights, usually 400 and 600. Adjust them in the weights field if you want real bold (700). | +| **Font Family** | The font, from the full list. Choosing a new family picks regular and bold body weights, preferably 400 and 700 when available, or one heading weight, preferably 600. | | **Font Weights** (body) / **Font Weight** (heading) | Which weights to use, from those the font offers. Body text can use several (for example 400 for regular and 700 for bold). | | **Font Size** | Any size from 6 to 24 pt, in steps of 0.1 pt. | | **Line Height** | A multiple of the font size, from 0.5 to 4. | diff --git a/docs/guides/editing-entries.mdx b/docs/guides/editing-entries.mdx index d68f14e23..6f68f3df0 100644 --- a/docs/guides/editing-entries.mdx +++ b/docs/guides/editing-entries.mdx @@ -149,8 +149,8 @@ The page prints the company and the entry's own details first, then each role wi Some things to know about roles: -- Once an entry has at least one role, the entry's own **Description** field is replaced by the role descriptions. Text you wrote there earlier is kept but doesn't print; remove all roles to see it again. -- The entry's own **Position** and **Dates** still print above the roles. Leave the entry's Position empty and use its Dates for the whole time at the company, as in the example above. +- The entry's own **Description** remains editable and prints alongside the role descriptions. +- The entry's own **Dates** can cover the whole time at the company. Its **Position** prints above the roles unless it repeats a role's Position; repeated text is shown once. - A role without a Position doesn't print. ## On a phone diff --git a/docs/guides/editing-on-mobile.mdx b/docs/guides/editing-on-mobile.mdx index dc1ca7a4c..fe5fae9a2 100644 --- a/docs/guides/editing-on-mobile.mdx +++ b/docs/guides/editing-on-mobile.mdx @@ -41,7 +41,7 @@ There's no **History** button on a phone. Open **Share** and use the **History** Scroll to the part of the resume you want to change. - The block is outlined with an **Editing** tag, and an **Edit entry** button appears. + The block is outlined, and an **Edit entry** button appears. The Editing tag is hidden on phones to keep nearby headings readable. The editor switches to **Write** and opens that entry. diff --git a/docs/guides/entering-dates.mdx b/docs/guides/entering-dates.mdx index 05f844824..da5993146 100644 --- a/docs/guides/entering-dates.mdx +++ b/docs/guides/entering-dates.mdx @@ -63,13 +63,13 @@ Month names and the word "Present" follow the resume's language, which you set i | **03/2022** | Month number and year | | **2022-03** | Year and month number (ISO) | -Resumes brought over from an earlier version of Reactive Resume start with whichever of these formats is closest to how their dates were typed. **Reset to template defaults** in the same panel doesn't change your date format. +Resumes brought over from an earlier version of Reactive Resume start with whichever of these formats is closest to how their dates were typed. **Reset design defaults** in the same panel doesn't change your date format. ## Fix dates that need a look The Dates field tells you when something is off. -- **"Use a month and year, like Mar 2022, or just a year."** The text you typed can't be read. The entry keeps the last date that could be read until you correct it. +- **"This date has not been saved."** The text you typed cannot be read. Correct it using a month and year, such as Mar 2022, or only a year. The page keeps the last readable date until then. - **"The end is before the start."** The two dates are the wrong way round. Swap them, or the entry sorts to the end when you use **Sort by date**. diff --git a/docs/guides/exporting-resume-to-markdown.mdx b/docs/guides/exporting-resume-to-markdown.mdx index 059f4e26c..f2355bc9d 100644 --- a/docs/guides/exporting-resume-to-markdown.mdx +++ b/docs/guides/exporting-resume-to-markdown.mdx @@ -69,7 +69,7 @@ The file keeps: - your name, headline and contact details; - every visible section and entry, with section titles in your resume's language; -- paragraphs, lists, links, and **bold** and _italic_ text. Numbered lists become bullet points. +- paragraphs, numbered and nested lists, links, **bold**, _italic_ and strikethrough text. Underline is kept as HTML `` markup where the Markdown viewer supports it. It leaves out: diff --git a/docs/guides/exporting-your-data.mdx b/docs/guides/exporting-your-data.mdx index 44704c89f..e22e4485a 100644 --- a/docs/guides/exporting-your-data.mdx +++ b/docs/guides/exporting-your-data.mdx @@ -35,7 +35,7 @@ Each resume and letter file is named after the document plus a unique ID, so two The archive doesn't include your password, passkeys, two-step verification codes, API keys or AI provider keys. Uploaded images, such as resume photos, are listed by their address rather than included as files. - To move one resume into another account or another Reactive Resume site, download it as **JSON** from the **Share** sheet's **Download** tab and import that file. The resume files in this archive wrap the content with extra details, so they aren't meant for **Import**. See [Exporting your resume](/guides/exporting-your-resume). + To restore a resume or letter, extract the archive and import its individual JSON file from `resumes/` or `letters/`. Resume content and design are restored as a new document; account settings, document sharing settings and application links are not restored. The whole zip is an account backup, not a bulk-import file. You can also download one resume as **JSON** from the **Share** sheet. See [Importing resumes](/guides/importing-resumes). ## Related guides diff --git a/docs/guides/filling-in-your-details.mdx b/docs/guides/filling-in-your-details.mdx index 785a28fbe..ad804d34a 100644 --- a/docs/guides/filling-in-your-details.mdx +++ b/docs/guides/filling-in-your-details.mdx @@ -96,7 +96,7 @@ Whether to include a photo depends on where you're applying. Many applicant trac | Eye icon next to **URL** | Hides the photo from the page without deleting it (**Hide picture** / **Show picture**). The photo row then says "Photo hidden from the page." | | **Fit** | **Cover** fills the frame and trims the edges. **Contain** shows the whole image inside the frame. | | **Size** | The photo's width on the page, from 32 to 512 pt. | -| **Rotation** | Turns the photo, from 0 to 360°. | +| **Rotation** | Disabled because the PDF engine does not support rotation. | | **Aspect Ratio** | Width divided by height, from 0.5 to 2.5. The three buttons set square (1), landscape (1.5) or portrait (0.5). | | **Border Radius** | Rounds the corners, from 0 to 100 pt. The buttons set square corners, slightly rounded, or a circle. | | **Border Width** and color | Draws a border around the photo. Select the color circle to pick its color. | @@ -112,7 +112,7 @@ Whether to include a photo depends on where you're applying. Many applicant trac To remove the photo, open the photo settings and select the photo preview (**Delete picture**). - The photo is deleted as soon as you select the preview, without asking first, and every photo setting goes back to its default. To take the photo off the page but keep it, use the eye icon instead. + Confirm **Delete picture** to remove the image. Your size, fit, border and other photo settings are kept. To take the photo off the page but keep it, use the eye icon instead. diff --git a/docs/guides/formatting-text.mdx b/docs/guides/formatting-text.mdx index b934a8de4..6d58f497b 100644 --- a/docs/guides/formatting-text.mdx +++ b/docs/guides/formatting-text.mdx @@ -43,7 +43,7 @@ You can format without the toolbar: Press Enter for a new bullet, and Enter twice to end the list. -Inside a text field, ⌘ Z (Ctrl Z) undoes your typing in that field. Click outside the field to undo changes across the whole resume. +Inside a text field, ⌘ Z (Ctrl Z) undoes your typing in that field. Click outside the field, or press Escape, to undo changes across the whole resume. ## Add a link @@ -100,7 +100,7 @@ Improve needs an AI provider. If you haven't connected one, selecting **Improve* ## On a phone -On screens narrower than 768 pixels, such as phones and small tablets held upright, the toolbar docks to the bottom of the screen, just above the keyboard, with larger buttons. To close the keyboard, select **Done** at the right end of the toolbar, or tap outside the text box. +On screens narrower than 768 pixels, such as phones and small tablets held upright, the toolbar docks to the bottom of the screen, just above the keyboard, with larger buttons. Swipe the formatting buttons sideways to reach every action. **Done** stays visible at the right; select it to close the keyboard, or tap outside the text box. - The Importing dialog for David-Kowalski-Resume.pdf with all three steps checked, 9 sections and 58 entries found, and Stay here and Open in editor buttons + The Imported dialog for David-Kowalski-Resume.pdf with all three steps checked, 9 sections and 58 entries found, and Stay here and Open in editor buttons @@ -65,7 +65,7 @@ Go through every section before you send the resume. PDF and Word files don't st - Download it from another resume with **Download** and the JSON format (see [Exporting your resume](/guides/exporting-your-resume)). Custom styles written for the older styling system come in converted to the current one. If a version 5 resume contained cover letters, each one becomes its own letter in Documents, linked to the imported resume. + Download it from another resume with **Download** and the JSON format, or extract an individual resume JSON file from **Export everything** (see [Exporting your resume](/guides/exporting-your-resume)). Custom styles written for the older styling system come in converted to the current one. If a version 5 resume contained cover letters, each one becomes its own letter in Documents, linked to the imported resume. In LinkedIn's settings, request a copy of your data and download the archive when LinkedIn emails you. Import the `.zip` file as it is; don't unzip it. Reactive Resume reads `Profile.csv`, `Positions.csv`, `Education.csv`, `Skills.csv`, `Languages.csv` and `Certifications.csv` and ignores everything else, such as messages. The file never leaves your browser. @@ -74,7 +74,7 @@ Go through every section before you send the resume. PDF and Word files don't st With an AI provider set up, the PDF (up to 10 MB) is sent to that provider, which returns the resume's sections. Without one, Reactive Resume reads the PDF's text in your browser and sorts it into sections itself. This works best for simple, one-column resumes. A scanned PDF (a picture of a page) has no text to read and can't be imported this way. - Word files are always read by your AI provider, so set one up first. Use the modern `.docx` format; if you have an older `.doc` file, open it in Word and save it as `.docx`. Files can be up to 10 MB. + Word files are always read by your AI provider, so set one up first. Use the modern `.docx` format; older `.doc` files are rejected before parsing. Open them in Word and save as `.docx`. Files can be up to 10 MB. diff --git a/docs/guides/linking-social-accounts.mdx b/docs/guides/linking-social-accounts.mdx index da413b6e7..df373f15e 100644 --- a/docs/guides/linking-social-accounts.mdx +++ b/docs/guides/linking-social-accounts.mdx @@ -32,7 +32,7 @@ Social sign-in only works when the site has set it up. On [rxresu.me](https://rx From now on, select that provider's button on the sign-in page to get in. - If you sign in with Google, GitHub or LinkedIn using the same email address as your existing account, Reactive Resume links the provider to that account for you. + If you sign in with Google, GitHub or LinkedIn using the same email address as your existing account, Reactive Resume links the provider to that account when its email is verified in Reactive Resume. If it isn't verified, sign in to your existing account and select **Connect** in settings, or verify its email before trying the provider again. ## Disconnect a provider diff --git a/docs/guides/setting-up-passkeys.mdx b/docs/guides/setting-up-passkeys.mdx index 23e64ab24..9f2db1d4c 100644 --- a/docs/guides/setting-up-passkeys.mdx +++ b/docs/guides/setting-up-passkeys.mdx @@ -41,11 +41,11 @@ On the sign-in page, select **Passkey** under **or continue with** and confirm o ## Remove a passkey -Select **Remove** next to the passkey. It is deleted straight away, without a confirmation, and can no longer sign you in. To finish the cleanup, also delete it from your device or password manager. +Select **Remove** next to the passkey, then confirm **Remove**. It can no longer sign you in. To finish the cleanup, also delete it from your device or password manager. - - Passkeys can't be renamed after you save them. To change a name, remove the passkey and add it again. - +## Rename a passkey + +Select **Rename** next to the passkey, enter its new name in **Name this passkey**, and select **Save**. ## Related guides diff --git a/docs/guides/setting-up-two-factor-authentication.mdx b/docs/guides/setting-up-two-factor-authentication.mdx index cedfc4dea..70d3ac1cc 100644 --- a/docs/guides/setting-up-two-factor-authentication.mdx +++ b/docs/guides/setting-up-two-factor-authentication.mdx @@ -25,6 +25,14 @@ Two-step verification adds a second check when you sign in: after your password, + + **Copy Backup Codes** shows 10 one-time codes. Select **Download** to save them as a text file, or **Copy** to paste them somewhere safe, such as your password manager. Then select **Continue**. + + + The Copy Backup Codes dialog listing ten codes in two columns, with Download, Copy and Continue buttons + + + In **Setup Authenticator App**, scan the QR code with your app. If you can't scan it, select the copy button next to the secret key above the code and paste the key into your app. @@ -34,15 +42,7 @@ Two-step verification adds a second check when you sign in: after your password, - Type the code your app shows for Reactive Resume. The dialog moves on as soon as the code is complete, or you can select **Continue**. - - - - **Copy Backup Codes** shows 10 one-time codes. Select **Download** to save them as a text file, or **Copy** to paste them somewhere safe, such as your password manager. Then select **Continue**. - - - The Copy Backup Codes dialog listing ten codes in two columns, with Download, Copy and Continue buttons - + Type the code your app shows for Reactive Resume. The dialog verifies it as soon as the code is complete, or you can select **Continue**. An accepted code turns on two-step verification and closes the dialog. @@ -53,7 +53,7 @@ The switch now shows two-step verification is on. From your next sign-in, Reacti - Two-step verification is on as soon as your code is accepted, even if you close the dialog before saving the backup codes. The codes are shown only once. If you lose your authenticator app and have no backup codes, you can't sign in with your password. + Save the backup codes before continuing to the authenticator step. They are shown only once. Two-step verification stays off until your authenticator code is accepted. If you later lose your authenticator app and have no backup codes, you can't sign in with your password. ## Sign in with a code diff --git a/docs/guides/sharing-your-resume-publicly.mdx b/docs/guides/sharing-your-resume-publicly.mdx index b8efffd1f..e27070442 100644 --- a/docs/guides/sharing-your-resume-publicly.mdx +++ b/docs/guides/sharing-your-resume-publicly.mdx @@ -65,6 +65,8 @@ The last part of the address is yours to choose. It starts out based on the resu If another of your resumes already uses that address, the message names it and suggests a free one. Select **Try** followed by the suggestion to use it. +While an address change is saving, Copy is unavailable to avoid copying an outdated link. Wait for the saved address before copying. + After a change, the old address still leads to your resume for 30 days, so links you already sent keep working while you update them. Changing your username is different: every public address changes at once, and old links stop working. ## Require a password @@ -95,7 +97,7 @@ Visitors open your resume on a clean page with no Reactive Resume menus. - **On a computer**, your name, headline and location sit at the top with **Copy link** and **Download PDF**. Below is the resume, exactly as it prints. - **On a phone**, the resume reflows into readable text in the same order as the pages, with **Download PDF** and a share button pinned to the bottom of the screen. -- **With a password**, visitors first see **This resume is password protected** and enter the password you shared, then select **Unlock**. The page stays unlocked for about 10 minutes; after that, they enter it again. You see this screen too when you open your own link. +- **With a password**, visitors first see **This resume is password protected** and enter the password you shared, then select **Unlock**. The page stays unlocked for about 10 minutes; after that, they enter it again. While signed in as the owner, you can open your own link without entering its password. - **When the link is off**, or the resume is in Trash, visitors see **This resume isn't shared right now.** The page gives nothing away about you. @@ -125,7 +127,7 @@ The bottom of the **Link** tab shows **Views and downloads**. Only you see these A bar chart under the numbers shows views for each of the last 30 days. - Your own visits and downloads don't count while you're signed in. -- Repeat visits from the same visitor within an hour count once. +- Repeat visits from the same visitor within an hour count once. Each completed PDF download counts, including repeat downloads. - Counts are anonymous. Reactive Resume doesn't record who viewed your resume. - Counting starts only once the link is on. diff --git a/docs/guides/signing-in.mdx b/docs/guides/signing-in.mdx index 1d74dc9b8..80e239a44 100644 --- a/docs/guides/signing-in.mdx +++ b/docs/guides/signing-in.mdx @@ -75,7 +75,7 @@ After your password, the **Two-Factor Authentication** page asks for the 6-digit If you don't have your authenticator app, select **Lost access to your authenticator?**, enter one of the backup codes you saved when you turned on two-step verification, and select **Verify**. -Each backup code works once. Type it without the hyphen: the field holds 10 characters, and the codes are shown as two groups of five (`82cNK-qaOiN` becomes `82cNKqaOiN`). +Each backup code works once. You can paste it as shown, including the hyphen, or type the two groups together (`82cNK-qaOiN` or `82cNKqaOiN`). The Verify with a Backup Code page with a single text field, a Go Back button and a Verify button diff --git a/docs/guides/tracking-job-applications.mdx b/docs/guides/tracking-job-applications.mdx index 282847a05..38d6656b4 100644 --- a/docs/guides/tracking-job-applications.mdx +++ b/docs/guides/tracking-job-applications.mdx @@ -45,7 +45,7 @@ Use the tabs above the list to switch views. Your choice is kept in the page add - Select a row to open its details. - One column per stage, with a card for each application. Drag a card to another column to move it to that stage. Each card also has a **⋯** menu with **Move to…**, **Close…** and **Delete…**, which is handy if you prefer the keyboard. When **Show closed** is on, a **Closed** column appears too. Dragging a card there closes it without a reason, so use **Close…** if you want Insights to know why. + One column per stage, with a card for each application. Drag a card to another column to move it to that stage. Each card also has a **⋯** menu with **Move to…**, **Close…** and **Delete…**, which is handy if you prefer the keyboard. When **Show closed** is on, a **Closed** column appears too. Dragging a card there asks why it ended before closing it, so Insights can use the outcome. Board view with Saved, Applied, Screening and Interview columns, each card showing the role, company and next step diff --git a/docs/guides/using-ai.mdx b/docs/guides/using-ai.mdx index 743ce3808..495fa5fc7 100644 --- a/docs/guides/using-ai.mdx +++ b/docs/guides/using-ai.mdx @@ -7,7 +7,7 @@ Reactive Resume doesn't include an AI model of its own. To use the assistant, AI ## Before you start -- Get an API key from your provider's dashboard. You pay the provider directly for what you use. +- Get an API key from your provider's dashboard. You pay the provider directly for what you use. A local Ollama server can connect without a key. - Know which model you want to use, such as `gpt-4.1` or `claude-3-5-sonnet-latest`. Reactive Resume suggests a default for each provider, but your account may not have access to every model. ## Add a provider @@ -38,7 +38,7 @@ If the test fails, the dialog shows the provider's own error message, such as an | Field | What to enter | | --- | --- | | **Provider** | The company or service that runs the model. | -| **API key** | The key from your provider's dashboard. Required. | +| **API key** | The key from your provider's dashboard. Required except for Ollama, where you can leave it empty for a local server that doesn't require authentication. | | **Model** | The model name exactly as your provider writes it. Required. | | **Name** | A label you'll recognize, such as "Work OpenAI". If you leave it empty, the provider's name is used. | | **Base URL** | The address requests go to. Leave the default unless you use a gateway, a proxy or an OpenAI-compatible service. | @@ -61,7 +61,7 @@ If the test fails, the dialog shows the provider's own error message, such as an | Fireworks | `accounts/fireworks/models/llama-v3p3-70b-instruct` | `https://api.fireworks.ai/inference/v1` | | Cerebras | `llama3.3-70b` | `https://api.cerebras.ai/v1` | | Perplexity | `sonar-pro` | `https://api.perplexity.ai` | -| Ollama Cloud | `llama3.1` | `https://ollama.com/api` | +| Ollama | `llama3.1` | `https://ollama.com/api` | | OpenAI-compatible | none, enter your own | none, enter your own | Choose **OpenAI-compatible** for any other service that speaks the OpenAI API, such as a company gateway or LiteLLM. It needs both a model and a base URL. @@ -88,7 +88,7 @@ Select **Edit** on a provider's row. - **Change the key, model, name or base URL**, then select **Save and test**. Leave **API key** empty to keep the saved key. Changing the key, model or base URL turns the provider off until the new test passes. - **Turn it on or off** with **Use this provider**. Only a provider that passed its test can be turned on. A provider that is off stays saved but isn't offered anywhere in the app. -- **Delete it** with **Delete provider**. The provider and its stored key are removed right away, without a confirmation step. +- **Delete it** with **Delete provider**, then confirm. The provider and its stored key are removed. Deleting a provider can't be undone. Assistant conversations that used it become read-only until you pick another model in the conversation. Documents and edits you already accepted aren't affected. @@ -98,9 +98,9 @@ Select **Edit** on a provider's row. You can save several providers, for example one per account or one per model. -- The **assistant** starts new conversations with the provider you used most recently. You can switch models from the model menu in the assistant's header at any time. See [Using the assistant](/guides/using-the-assistant). +- AI features default to the enabled provider you used most recently. If you haven't used one yet, they choose the oldest enabled provider you added. +- The **assistant** lets you switch models from the model menu in its header at any time. See [Using the assistant](/guides/using-the-assistant). - **Check → Writing** lets you pick the provider for each review. -- Other AI features (reading Word and PDF files on import, **Improve selected line**, drafting a letter, and reading a pasted job posting) use the oldest provider you added that is turned on. ## Connect from the assistant instead @@ -114,7 +114,7 @@ If no provider is connected yet, opening the assistant in the editor shows **Con Your API key is encrypted on the Reactive Resume server with AES-256-GCM before it's saved, and it's never shown again. Settings only ever show the last four characters. When a feature needs the key, the server decrypts it just long enough to call your provider. -Self-hosted instances encrypt keys with the `ENCRYPTION_SECRET` environment variable. Until it's set, **AI & developer** shows "AI providers aren't available on this server until ENCRYPTION_SECRET is set." If the secret changes later, saved keys can no longer be decrypted and have to be entered again. +Self-hosted instances encrypt keys with the `ENCRYPTION_SECRET` environment variable. Until it's set, **AI & developer** shows "AI providers aren't available on this server until ENCRYPTION_SECRET is set." If the secret changes later, saved keys can no longer be decrypted. The error asks you to enter the key again: open **Settings → AI & developer**, select **Edit** on the provider, paste the key, and select **Save and test**. ## What is sent to your provider diff --git a/docs/guides/using-the-api.mdx b/docs/guides/using-the-api.mdx index 5ec89344c..e6740fbec 100644 --- a/docs/guides/using-the-api.mdx +++ b/docs/guides/using-the-api.mdx @@ -171,6 +171,7 @@ If you built against the v5 API, check these changes: - **Structured dates.** Dated entries have a `dates` object (`start`, `end`, `present`). The text fields `period` and `date` are still returned, but the server rewrites them from `dates` on every save, so writing only the text has no effect. See [Using the patch API](/guides/using-the-patch-api#dates). - **Cover letters are their own documents.** Resumes no longer hold cover letters. Use the `/cover-letters` endpoints. If you send a resume that still contains a cover-letter section (for example an old export), the server saves each letter as a separate cover letter and removes the section from the resume. +- **Application link.** `GET /resumes/{id}` includes `applicationId` for a tailored resume. Trash and automatic naming remain managed through the documents API. - **No cover-letter PDF from resumes.** `GET /resumes/{id}/pdf` only accepts `target=resume` (or no target). Old signed download links that ask for a cover letter return `404`. - **Delete moves to Trash.** `DELETE /resumes/{id}` and `DELETE /cover-letters/{id}` move the document to Trash for 30 days. Use the `/documents/restore` and `/documents/purge` endpoints to bring it back or delete it at once. - **Application stages.** The `rejected` stage and the `archived` flag are gone. Close an application with the `closed` stage and a `closedReason` (`not-selected`, `withdrew`, `accepted-other` or `no-response`). diff --git a/docs/guides/using-the-assistant.mdx b/docs/guides/using-the-assistant.mdx index 4cdae76dc..8fffd0852 100644 --- a/docs/guides/using-the-assistant.mdx +++ b/docs/guides/using-the-assistant.mdx @@ -73,11 +73,13 @@ When the assistant needs a fact or a choice from you, it shows a blue question c ## Choose what's shared with each message -Above the message box, chips show what goes with your next message: the document, and the job posting when the document is linked to an application. Once a conversation has started, select the **×** on a chip to leave it out of your next messages. Without the document, the assistant can't read or edit it for that message. The line under the box always says what will be sent and to which provider, and nothing is sent until you press send. +Above the message box, chips show what goes with your next message: the document, and the job posting when the document is linked to an application. Select the **×** on a chip to leave it out, including before your first message. Without the document, the assistant can't read or edit it for that message. The line under the box always says what will be sent and to which provider, and nothing is sent until you press send. + +When you select **Prepare** from an application's detail panel, the assistant uses that application's posting, even when several applications share the same resume. ## Attach files -Once a conversation has started, select the paperclip in the message box to attach files, such as a job description PDF or your notes. Each file shows as a chip; select its **×** to remove it before sending. +Select the paperclip in the message box to attach files, such as a job description PDF or your notes. You can attach them before your first message or later in the conversation. Each file shows as a chip; select its **×** to remove it before sending. - Plain text, Markdown and JSON files are read as text (up to the first 40,000 characters). - Images, PDFs and MP3 or WAV audio are passed to the model directly. Whether the model can use them depends on your provider. @@ -85,7 +87,8 @@ Once a conversation has started, select the paperclip in the message box to atta - You can attach up to 10 files per message, each up to 25 MB, and 100 MB per conversation. - On self-hosted instances, attachments need S3-compatible or Vercel Blob storage. Local file storage can't hold them. + Attachments work with local, S3-compatible or Vercel Blob storage and stay private. If you use a reverse proxy, + allow request bodies of at least 50 MB: files travel base64-encoded, which makes them about a third larger. ## Search the web diff --git a/docs/guides/using-the-ats-checker.mdx b/docs/guides/using-the-ats-checker.mdx index 83b03b8f7..6cacd023f 100644 --- a/docs/guides/using-the-ats-checker.mdx +++ b/docs/guides/using-the-ats-checker.mdx @@ -59,7 +59,7 @@ The five scored categories are: | **Contact details** | Whether a recruiter can reach you: name, email, phone and links survive intact. | | **Dates** | Whether your timeline can be reconstructed from the dates. | -The checker's start page also lists **Writing**: advice for the person reading your resume, such as numbers that show impact, first-person pronouns and long bullets. It never affects the score, and the results page doesn't show it. To see that advice, import the file (see below) and use **Also check the exported PDF** in [Check](/guides/checking-your-resume#check-the-exported-pdf). +**Writing** gives advice for the person reading your resume, such as numbers that show impact, first-person pronouns and long bullets. These tips appear in the results alongside the scored findings and never affect the score. Only the first 30 pages of a long file are checked; the report says so when that happens. diff --git a/docs/guides/using-the-patch-api.mdx b/docs/guides/using-the-patch-api.mdx index 9366bcc2d..480f1b382 100644 --- a/docs/guides/using-the-patch-api.mdx +++ b/docs/guides/using-the-patch-api.mdx @@ -217,10 +217,10 @@ If the resume has moved on, you get `409` with the code `RESUME_VERSION_CONFLICT | `401` | `UNAUTHORIZED` | The API key is missing, revoked or expired. | | `404` | `NOT_FOUND` | The resume doesn't exist or belongs to someone else. | | `409` | `RESUME_VERSION_CONFLICT` | The resume changed after `expectedUpdatedAt`. | -| — | `RESUME_LOCKED` | The resume is locked. Unlock it with `POST /resumes/{id}/lock` and `{ "isLocked": false }`, or in the app. | +| `403` | `RESUME_LOCKED` | The resume is locked. Unlock it with `POST /resumes/{id}/lock` and `{ "isLocked": false }`, or in the app. | - A locked resume currently answers with HTTP status `500` rather than a `4xx` status. Check the `code` field for `RESUME_LOCKED` instead of relying on the status. + Locked resume writes return HTTP `403` with code `RESUME_LOCKED`. Unlock the resume before retrying. ## Related guides diff --git a/docs/guides/viewing-application-insights.mdx b/docs/guides/viewing-application-insights.mdx index 263b363dd..572666607 100644 --- a/docs/guides/viewing-application-insights.mdx +++ b/docs/guides/viewing-application-insights.mdx @@ -24,7 +24,7 @@ To open it, go to **Applications** and select the **Insights** tab. Insights cou ## The pipeline picture -**Where your applications went** draws your pipeline as a flow from **Saved** to **Offer**. The number above each bar is how many of your current, not-closed applications are at that stage or beyond, and the percentage under it is how many made it on from the stage before. The top line shows how many applications you're tracking in total, and how many are closed. +**Where your applications went** draws your pipeline as a flow from **Saved** to **Offer**. The number above each bar is how many of your current, not-closed applications are at that stage or beyond, and the percentage under it is how many made it on from the stage before. The top line shows how many applications are active, with closed applications counted separately. Where your applications went panel with an Export PNG button and a dark Job search pipeline chart showing bars for Saved, Applied, Screening, Interview and Offer with conversion percentages and 2 closed @@ -42,7 +42,7 @@ Select **Export PNG** to download the picture as `pipeline-flow.png`, a high-res Applications over time bar chart for the last 8 weeks, and a Where applications come from chart with LinkedIn 5, Indeed 3, Company website 2 and Referral 1 -- **Applications over time**: How many applications you applied for each week over the last 8 weeks. Saved applications count in the week you added them, and closed applications aren't included. +- **Applications over time**: How many applications you sent each week over the last 8 weeks, dated by their first move to **Applied** or later. Applications that later closed still count; jobs that never reached **Applied** don't. - **Where applications come from**: How many applications have each **Source**, such as LinkedIn or Referral. Fill in the source on each application to make this useful. Applications without a source aren't shown. ## Related guides diff --git a/docs/guides/writing-a-cover-letter.mdx b/docs/guides/writing-a-cover-letter.mdx index 646f3baaf..f55c4d033 100644 --- a/docs/guides/writing-a-cover-letter.mdx +++ b/docs/guides/writing-a-cover-letter.mdx @@ -132,6 +132,8 @@ By default, a letter linked to a resume uses the resume's template, type and col Turn **Match** back on at any time to follow the resume again. A letter with no resume chosen under **From** always has its own design. +When updating a letter through the API, setting `template` or `metadata` gives it its own design and turns matching off. Set `designLinked: true` in a later update to resume matching. + ## Download the letter Select **Download PDF** in the editor bar, or press ⌘ P (Ctrl P). The PDF includes the header with your name and contact details, and is named after you, for example `David-Kowalski-Cover-Letter.pdf`. diff --git a/docs/self-hosting/environment-variables.mdx b/docs/self-hosting/environment-variables.mdx index 3fda26c1f..fe45cb032 100644 --- a/docs/self-hosting/environment-variables.mdx +++ b/docs/self-hosting/environment-variables.mdx @@ -125,8 +125,8 @@ backends. | `DEPLOYMENT_NAMESPACE` | `default` | Prefix for Redis keys and Blob paths, so several instances can share one Redis or Blob store without mixing data. Letters, numbers, `.`, `_` and `-` only. On Vercel it is `production`, or the branch address on previews. | - Local storage keeps only public uploads. Files people attach in the Assistant are private and need S3-compatible - storage or Vercel Blob; on local storage, attaching a file fails. + Assistant attachments stay private with every backend. Local storage writes them in a separate namespace that + public upload routes never serve. General file uploads allow 10 MB; Assistant attachments allow 25 MB per file. Switching backends does not move files that are already stored. Copy them yourself before you switch. @@ -155,6 +155,8 @@ Redis is optional on a single server. Without it, everything works, with these l Set `REDIS_URL` when you run more than one server process, or when you want replies to survive a reload. When Redis is configured, the [health endpoint](/self-hosting/docker#check-the-health-endpoint) also checks it. +Saved AI providers and Assistant conversations are kept in PostgreSQL, so they remain available without Redis. + ## Feature flags All flags default to `false`. @@ -164,7 +166,7 @@ All flags default to `false`. | `FLAG_DISABLE_SIGNUPS` | No new accounts can be created, by email or by social sign-in. Existing accounts keep working. Create your own account first. | | `FLAG_DISABLE_EMAIL_AUTH` | Turns off email and password sign-in and sign-up, along with forgot password and reset password. People sign in with social or custom OAuth providers only, so configure at least one first. | | `FLAG_DISABLE_IMAGE_PROCESSING` | Stores uploaded pictures as they are. Normally pictures are resized to fit 800 × 800 pixels and saved as JPEG. Useful on low-powered hardware such as a Raspberry Pi. | -| `FLAG_DISABLE_API_RATE_LIMIT` | Turns off rate limiting on sign-in, sign-up, the OAuth endpoints and requests made with API keys. Other limits, such as PDF export and AI requests, stay on. Intended for test installations. | +| `FLAG_DISABLE_API_RATE_LIMIT` | Turns off API and authentication rate limiting, including sign-in, sign-up, OAuth, requests made with API keys, PDF export and AI requests. Intended for test installations. | | `FLAG_ALLOW_UNSAFE_AI_BASE_URL` | Lets AI providers use `http://` addresses and private or local network addresses, such as an Ollama server on your network. Without it, a provider's base URL must be public `https://`. | | `FLAG_ALLOW_UNSAFE_OAUTH_REDIRECT_URI` | Lets MCP and OAuth clients that register themselves use any redirect address, including custom schemes and private hosts. By default a redirect must go to your instance's own address, an `http://` loopback address (`localhost`, `127.0.0.1`, `::1`) or a public `https://` address. | diff --git a/docs/self-hosting/examples.mdx b/docs/self-hosting/examples.mdx index 1e0132ba0..132be1120 100644 --- a/docs/self-hosting/examples.mdx +++ b/docs/self-hosting/examples.mdx @@ -14,11 +14,10 @@ Whatever proxy you use, configure it so that: - **The whole site goes to the app.** The app serves pages, the API (`/api/`), the MCP server (`/mcp`), uploads and assets from one address. Don't split or rewrite paths. - **`APP_URL` is the public address**, for example `APP_URL="https://resume.example.com"`. -- **The client's IP address is passed on, and clients can't fake it.** Rate limits (sign-in attempts, public resume - passwords) are counted per IP address. The app uses the first of these headers it finds, as sent: `CF-Connecting-IP`, - `CF-Connecting-IPv6`, `True-Client-IP`, `X-Forwarded-For` (its first entry), then `X-Real-IP`. Set - `X-Forwarded-For` to the address the proxy sees, replacing any value the client sent, and remove the other three - headers unless a CDN in front of your proxy sets them. The examples below do both. +- **Client-supplied IP headers are replaced or removed.** The Node server uses its connection's remote address for + IP-based limits, such as sign-in attempts and public resume passwords, and ignores forwarded IP headers. Behind a + reverse proxy, users share the proxy's IP-based limit. Vercel uses the client address supplied by its deployment + adapter. The examples below also replace `X-Forwarded-For` and remove alternate IP headers at the proxy. - **Streaming responses aren't buffered**, and idle reads are allowed for at least 5 minutes. Assistant replies and live updates stream from the server, and a single Assistant reply can take up to 4 minutes. - **Request bodies of at least 50 MB are accepted.** People can attach files of up to 25 MB to the Assistant, and @@ -26,7 +25,7 @@ Whatever proxy you use, configure it so that: Once a proxy is in front, don't publish the app's port `3000` on a public - interface, or clients can bypass the proxy and fake their IP address to get around rate limits. Remove the `ports` + interface, or clients can bypass the proxy's HTTPS and access controls. Remove the `ports` entry, or bind it to `127.0.0.1:3000:3000`. @@ -361,10 +360,10 @@ accepts public `https://` provider addresses, so you turn on a flag that allows - Open **Settings**, then **AI & developer**, and select **Add provider**. Choose **Ollama Cloud** as the provider and + Open **Settings**, then **AI & developer**, and select **Add provider**. Choose **Ollama** as the provider and fill in: - - **API key**: any text, for example `ollama`. A local Ollama server ignores it. + - **API key**: leave empty for a local Ollama server that doesn't require authentication. - **Model**: the model you pulled, for example `llama3.1`. - **Base URL**: `http://ollama:11434/api` diff --git a/docs/self-hosting/migration.mdx b/docs/self-hosting/migration.mdx index be7efc34a..6543256df 100644 --- a/docs/self-hosting/migration.mdx +++ b/docs/self-hosting/migration.mdx @@ -99,6 +99,10 @@ The script: It ends with a summary of users created, accounts created, and users skipped. + + Migrated two-factor authentication is disabled. Before switching traffic, tell affected users to enable it again on the new installation. Treat the transition as a change to account security. + + ### Migrate resumes ```bash @@ -117,6 +121,10 @@ It ends with a summary of resumes created, resumes skipped, and errors. Each script deletes its progress file when it finishes. Keep `user-id-map.json` as the record of which v4 user became which new user. Don't re-run the scripts against a populated target to "fix" a problem; review the source backup, the map, and the target first. + + These historical scripts register cleanup on normal exit, not on `SIGINT`. Prefer letting a batch finish before stopping it. After an interruption, retain the progress and ID-map files and verify the last batch before resuming. + + ### Start the current version Point a current Reactive Resume installation at the target database and start it. On startup it applies every migration since `v5.0.20`, which also fills in the new columns for the migrated users. Watch the logs for `Database migrations completed`. diff --git a/docs/self-hosting/sso.mdx b/docs/self-hosting/sso.mdx index 6f7e94e1a..ee8de7b77 100644 --- a/docs/self-hosting/sso.mdx +++ b/docs/self-hosting/sso.mdx @@ -73,9 +73,9 @@ Set the client credentials and one way of finding the provider's endpoints, then All URLs must use `http` or `https`. On Docker, restart the container after changing `.env`; on Vercel, add the variables to the project and redeploy. - - The sign-in button appears as soon as `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET` are set, but sign-in works only when `OAUTH_DISCOVERY_URL` or all three manual URLs are also set. If the button shows and does nothing useful, check the endpoint variables. - + + The sign-in button appears only when `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET` are set together with `OAUTH_DISCOVERY_URL` or all three manual endpoint URLs. If it is missing, check that configuration and restart the server. + ## Check that it works @@ -96,7 +96,7 @@ When someone signs in for the first time, Reactive Resume creates their account | Username | `preferred_username`, then the part of the email before `@`. A number is added if it's taken. | | Picture | `image`, then `picture`, then `avatar_url` | -If the email already belongs to an account, the sign-in is linked to that account, which keeps its name and username. This works only when that account's email address is verified in Reactive Resume. If it isn't (common on installations without SMTP, where verification emails never arrive), the sign-in stops with an "account not linked" error. +If the email already belongs to an account, the sign-in is linked to that account, which keeps its name and username. This works only when that account's email address is verified in Reactive Resume, protecting an existing account from an unverified email match. If it isn't (common on installations without SMTP, where verification emails never arrive), the sign-in stops with an "account not linked" error. Verify the existing account's email before trying SSO again, or sign in to that account and connect the provider in **Settings → Account**. ## Make SSO the only way in diff --git a/docs/self-hosting/upgrading-to-v6.mdx b/docs/self-hosting/upgrading-to-v6.mdx index 3e43471c8..ffe4c10b2 100644 --- a/docs/self-hosting/upgrading-to-v6.mdx +++ b/docs/self-hosting/upgrading-to-v6.mdx @@ -111,6 +111,14 @@ Each run ends with a summary per table: On Kubernetes, run the same commands with `kubectl exec deploy/ -- node apps/server/dist/migrate-legacy-styles.mjs ...`. On Vercel there's no container: from a checkout of the same release, put the production variables in the root `.env` (for example with `vercel env pull .env --environment production`), set `DATABASE_URL` to the direct, unpooled connection, run `pnpm install` and `pnpm build --filter=server`, and then run the script with `node`. +## Check legacy PostgreSQL volumes + +Some v5 Compose examples mounted PostgreSQL 17 at `/var/lib/postgresql`. Unless you explicitly changed `PGDATA`, PostgreSQL 17 stores its database at `/var/lib/postgresql/data`, so Docker created an anonymous volume there instead of using the parent mount. See the [official PostgreSQL image volume guidance](https://github.com/docker-library/docs/blob/master/postgres/README.md#pgdata). + +Before recreating that container, inspect its mounts and make a logical database backup from the running instance. Keep the old container and its volumes until you have restored and checked the backup. Do not run `docker compose down -v` or delete anonymous volumes during the upgrade. + +PostgreSQL 18 changes the default data layout. Changing the image tag alone does not migrate a PostgreSQL 17 database; restore the logical backup into a fresh PostgreSQL 18 volume, or follow PostgreSQL's supported major-version upgrade procedure. + ## What the migrations change Every migration runs once, in order, under an advisory lock. Three of them ship a `rollback.sql` next to `migration.sql` in the repository's `migrations/` folder. diff --git a/docs/spec.json b/docs/spec.json index f599c22d3..83ae96750 100644 --- a/docs/spec.json +++ b/docs/spec.json @@ -1190,8 +1190,7 @@ "type": "string" }, "apiKey": { - "type": "string", - "minLength": 1 + "type": "string" } }, "required": [ @@ -1401,8 +1400,7 @@ "type": "string" }, "apiKey": { - "type": "string", - "minLength": 1 + "type": "string" }, "enabled": { "type": "boolean" @@ -2220,6 +2218,11 @@ "posting": { "type": "boolean", "description": "Share the job posting it's for (on by default)." + }, + "applicationId": { + "type": "string", + "minLength": 1, + "maxLength": 255 } } } @@ -18604,28 +18607,6 @@ } } }, - "/resume/getRoot": { - "post": { - "operationId": "resume.getRoot", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "anyOf": [ - {}, - { - "not": {} - } - ] - } - } - } - } - } - } - }, "/resumes/tags": { "get": { "operationId": "listResumeTags", @@ -18890,14 +18871,19 @@ "name": "tags", "in": "query", "schema": { - "type": "array", - "items": { - "type": "string" - }, + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], "default": [] }, - "style": "deepObject", - "explode": true, "allowEmptyValue": true, "allowReserved": true }, @@ -27864,6 +27850,66 @@ } } } + }, + "403": { + "description": "403", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "properties": { + "defined": { + "const": true + }, + "code": { + "const": "RESUME_LOCKED" + }, + "status": { + "const": 403 + }, + "message": { + "type": "string", + "default": "Unlock the resume first." + }, + "data": {} + }, + "required": [ + "defined", + "code", + "status", + "message" + ] + }, + { + "type": "object", + "properties": { + "defined": { + "const": false + }, + "code": { + "type": "string" + }, + "status": { + "type": "number" + }, + "message": { + "type": "string" + }, + "data": {} + }, + "required": [ + "defined", + "code", + "status", + "message" + ] + } + ] + } + } + } } } }, @@ -32374,6 +32420,66 @@ } } }, + "403": { + "description": "403", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "properties": { + "defined": { + "const": true + }, + "code": { + "const": "RESUME_LOCKED" + }, + "status": { + "const": 403 + }, + "message": { + "type": "string", + "default": "Unlock the resume first." + }, + "data": {} + }, + "required": [ + "defined", + "code", + "status", + "message" + ] + }, + { + "type": "object", + "properties": { + "defined": { + "const": false + }, + "code": { + "type": "string" + }, + "status": { + "type": "number" + }, + "message": { + "type": "string" + }, + "data": {} + }, + "required": [ + "defined", + "code", + "status", + "message" + ] + } + ] + } + } + } + }, "409": { "description": "409", "content": { @@ -32471,6 +32577,66 @@ } } } + }, + "403": { + "description": "403", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "properties": { + "defined": { + "const": true + }, + "code": { + "const": "RESUME_LOCKED" + }, + "status": { + "const": 403 + }, + "message": { + "type": "string", + "default": "Unlock the resume first." + }, + "data": {} + }, + "required": [ + "defined", + "code", + "status", + "message" + ] + }, + { + "type": "object", + "properties": { + "defined": { + "const": false + }, + "code": { + "type": "string" + }, + "status": { + "type": "number" + }, + "message": { + "type": "string" + }, + "data": {} + }, + "required": [ + "defined", + "code", + "status", + "message" + ] + } + ] + } + } + } } } } @@ -37192,7 +37358,7 @@ } ], "requestBody": { - "required": true, + "required": false, "content": { "application/json": { "schema": { @@ -37215,11 +37381,7 @@ "minLength": 1, "description": "The slug of the copy. Generated from the name, and made unique, when omitted." } - }, - "required": [ - "name", - "tags" - ] + } } } } diff --git a/packages/api/src/context.test.ts b/packages/api/src/context.test.ts index 78174e7c5..992a7339c 100644 --- a/packages/api/src/context.test.ts +++ b/packages/api/src/context.test.ts @@ -40,6 +40,17 @@ const reset = () => { }; describe("resolveUserFromRequestHeaders", () => { + it("falls back to a valid bearer token when an API key is invalid", async () => { + reset(); + authMock.api.verifyApiKey.mockResolvedValueOnce({ valid: false }); + verifyOAuthTokenMock.mockResolvedValueOnce({ sub: "bearer-user" }); + setupDbResolves({ id: "bearer-user" }); + const user = await resolveUserFromRequestHeaders( + new Headers({ "x-api-key": "expired-key", authorization: "Bearer valid-token" }), + ); + expect(user).toMatchObject({ id: "bearer-user" }); + expect(verifyOAuthTokenMock).toHaveBeenCalledWith("valid-token"); + }); it("returns the user resolved from a valid x-api-key", async () => { reset(); authMock.api.verifyApiKey.mockResolvedValueOnce({ valid: true, key: { referenceId: "user-1" } }); diff --git a/packages/api/src/context.ts b/packages/api/src/context.ts index d0a3169f4..c3b3ff707 100644 --- a/packages/api/src/context.ts +++ b/packages/api/src/context.ts @@ -68,10 +68,9 @@ export async function resolveUserFromRequestHeaders(headers: Headers): Promise { + it.each([ + ["design", ["design"]], + [ + ["design", "remote"], + ["design", "remote"], + ], + ])("accepts a single or repeated tag query: %j", (tags, expected) => { + expect(resumeDto.list.input.parse({ tags }).tags).toEqual(expected); + }); + + it("duplicates with only an ID, leaving name, tags and address to the original and service", () => { + expect(resumeDto.duplicate.input.parse({ id: "r1" })).toEqual({ id: "r1" }); + }); it("normalizes ordinary PUT data without losing compatible custom-section overlap", () => { const parsed = resumeDto.update.input.parse({ id: "resume-id", diff --git a/packages/api/src/dto/resume.ts b/packages/api/src/dto/resume.ts index 1d288a9e6..f58fbc5e7 100644 --- a/packages/api/src/dto/resume.ts +++ b/packages/api/src/dto/resume.ts @@ -19,8 +19,8 @@ const resumeSchema = createSelectSchema(schema.resume, { createdAt: z.date().describe("The date and time the resume was created."), updatedAt: z.date().describe("The date and time the resume was last updated."), }) - // Document-library columns (Trash, the application a copy was made for, automatic naming) stay internal to - // the documents API. + // Trash and automatic naming stay internal to the documents API. getById exposes the application link + // explicitly because the editor uses it to select the application a tailored copy belongs to. .omit({ applicationId: true, trashedAt: true, autoName: true }); const versionSchema = z.object({ @@ -38,7 +38,10 @@ export const resumeDto = { list: { input: z .object({ - tags: z.array(z.string()).optional().default([]), + tags: z + .union([z.string().transform((tag) => [tag]), z.array(z.string())]) + .optional() + .default([]), sort: z.enum(["lastUpdatedAt", "createdAt", "name"]).optional().default("lastUpdatedAt"), }) .optional() @@ -149,7 +152,9 @@ export const resumeDto = { }, duplicate: { - input: resumeSchema.pick({ id: true, name: true, tags: true }).extend({ + input: resumeSchema.pick({ id: true }).extend({ + name: resumeSchema.shape.name.optional(), + tags: resumeSchema.shape.tags.optional(), slug: resumeSchema.shape.slug .optional() .describe("The slug of the copy. Generated from the name, and made unique, when omitted."), diff --git a/packages/api/src/features/agent/document.test.ts b/packages/api/src/features/agent/document.test.ts index 92e36a0be..c4f7fdb5d 100644 --- a/packages/api/src/features/agent/document.test.ts +++ b/packages/api/src/features/agent/document.test.ts @@ -1,12 +1,15 @@ +import type { SQL } from "drizzle-orm"; import { describe, expect, it, vi } from "vitest"; +import { PgDialect } from "drizzle-orm/pg-core"; import { collectPassages, readTarget } from "@reactive-resume/resume/proposals"; import { defaultResumeData } from "@reactive-resume/schema/resume/default"; -vi.mock("@reactive-resume/db/client", () => ({ db: {} })); +const dbMock = vi.hoisted(() => ({ select: vi.fn() })); +vi.mock("@reactive-resume/db/client", () => ({ db: dbMock })); vi.mock("../resume/service", () => ({ resumeService: {} })); vi.mock("../cover-letters/service", () => ({ coverLetterService: {} })); -const { resolveEdits } = await import("./document"); +const { findPosting, resolveEdits } = await import("./document"); function makeDocument() { const data = structuredClone(defaultResumeData); @@ -49,6 +52,18 @@ function makeDocument() { } describe("agent documents", () => { + it("reads the explicitly chosen application through an owner-scoped query", async () => { + const where = vi.fn((_predicate: SQL) => ({ orderBy: () => ({ limit: () => Promise.resolve([]) }) })); + dbMock.select.mockReturnValue({ from: () => ({ where }) }); + await findPosting("alice", "base", { kind: "resume", applicationId: "other-job" }, "clicked-job"); + const predicate = where.mock.calls[0]?.[0]; + if (!predicate) throw new Error("Expected application query"); + const query = new PgDialect().sqlToQuery(predicate); + expect(query.sql).toContain('"application"."user_id"'); + expect(query.sql).toContain('"application"."id"'); + expect(query.params).toEqual(["alice", "clicked-job"]); + }); + it("places rewrites, additions and an empty summary, and skips edits on text that changed", () => { const { document, passages } = makeDocument(); const [summary, first, second] = passages; diff --git a/packages/api/src/features/agent/document.ts b/packages/api/src/features/agent/document.ts index a182b5cdf..f72cfd64c 100644 --- a/packages/api/src/features/agent/document.ts +++ b/packages/api/src/features/agent/document.ts @@ -136,9 +136,11 @@ export async function findPosting( userId: string, documentId: string, loaded: Pick, + applicationId?: string, ) { // A resume made for an application says so; otherwise, the latest application it's linked to. - if (!loaded.applicationId && loaded.kind === "letter") return null; + const selectedId = applicationId ?? loaded.applicationId; + if (!selectedId && loaded.kind === "letter") return null; const table = schema.application; const [application] = await db .select({ @@ -149,12 +151,7 @@ export async function findPosting( notes: table.notes, }) .from(table) - .where( - and( - eq(table.userId, userId), - loaded.applicationId ? eq(table.id, loaded.applicationId) : eq(table.resumeId, documentId), - ), - ) + .where(and(eq(table.userId, userId), selectedId ? eq(table.id, selectedId) : eq(table.resumeId, documentId))) .orderBy(desc(table.updatedAt)) .limit(1); if (!application) return null; diff --git a/packages/api/src/features/agent/messages.ts b/packages/api/src/features/agent/messages.ts index 4f6b1d345..25aae1545 100644 --- a/packages/api/src/features/agent/messages.ts +++ b/packages/api/src/features/agent/messages.ts @@ -24,6 +24,7 @@ export const messagesRouter = { .object({ document: z.boolean().optional().describe("Share the open document (on by default)."), posting: z.boolean().optional().describe("Share the job posting it's for (on by default)."), + applicationId: z.string().trim().min(1).max(255).optional(), }) .optional(), }), diff --git a/packages/api/src/features/agent/service.ts b/packages/api/src/features/agent/service.ts index fc25f4eee..a33d8764a 100644 --- a/packages/api/src/features/agent/service.ts +++ b/packages/api/src/features/agent/service.ts @@ -88,7 +88,11 @@ type StartThreadInput = { }; /** What a message shares with the model: the open document and the posting it's for. Both on by default. */ -type MessageContext = { document?: boolean | undefined; posting?: boolean | undefined }; +type MessageContext = { + document?: boolean | undefined; + posting?: boolean | undefined; + applicationId?: string | undefined; +}; type SendMessageInput = { userId: string; @@ -970,7 +974,10 @@ export const agentService = { const loaded = await loadDocument(input.userId, document); if (loaded.locked) throw new ORPCError("BAD_REQUEST", { message: "Unlock the document to change it." }); - const posting = input.context?.posting === false ? null : await findPosting(input.userId, document.id, loaded); + const posting = + input.context?.posting === false + ? null + : await findPosting(input.userId, document.id, loaded, input.context?.applicationId); const [runnableProvider, attachments] = await Promise.all([ aiProvidersService.getRunnableById({ @@ -1290,7 +1297,7 @@ export const agentService = { const mediaType = input.mediaType || inferContentType(input.filename); const id = generateId(); - const key = `uploads/${input.userId}/agent/${input.threadId}/${id}-${input.filename}`; + const key = `uploads/${input.userId}/agent/${input.threadId}/${id}`; const storage = getStorageService(); let storageAttempted = false; try { diff --git a/packages/api/src/features/ai-providers/inputs.ts b/packages/api/src/features/ai-providers/inputs.ts index ceb800fd5..8ca1f34c8 100644 --- a/packages/api/src/features/ai-providers/inputs.ts +++ b/packages/api/src/features/ai-providers/inputs.ts @@ -1,17 +1,26 @@ import z from "zod"; import { aiProviderSchema } from "@reactive-resume/ai/types"; -export const providerInput = z.object({ +const providerFields = z.object({ label: z.string().trim().min(1), provider: aiProviderSchema, model: z.string().trim().min(1), baseURL: z.string().trim().optional(), - apiKey: z.string().trim().min(1), + apiKey: z.string().trim(), }); -export const updateProviderInput = providerInput +export const providerInput = providerFields.refine((input) => input.provider === "ollama" || input.apiKey.length > 0, { + message: "An API key is required for this provider.", + path: ["apiKey"], +}); + +export const updateProviderInput = providerFields .partial() .extend({ id: z.string(), enabled: z.boolean().optional() }) + .refine((input) => input.apiKey === undefined || input.apiKey.length > 0 || input.provider === "ollama", { + message: "An API key is required for this provider.", + path: ["apiKey"], + }) .refine((input) => Object.keys(input).some((key) => key !== "id"), { message: "At least one field must be provided.", }); diff --git a/packages/api/src/features/ai-providers/router.test.ts b/packages/api/src/features/ai-providers/router.test.ts index 00c4b554d..b049080b8 100644 --- a/packages/api/src/features/ai-providers/router.test.ts +++ b/packages/api/src/features/ai-providers/router.test.ts @@ -1,7 +1,18 @@ import { describe, expect, it } from "vitest"; -import { updateProviderInput } from "./inputs"; +import { providerInput, updateProviderInput } from "./inputs"; describe("AI provider router input", () => { + it("allows a keyless Ollama provider while requiring other providers' keys", () => { + const input = { + label: "Local", + provider: "ollama", + model: "llama3.2", + apiKey: "", + baseURL: "http://localhost:11434/v1", + }; + expect(providerInput.safeParse(input).success).toBe(true); + expect(providerInput.safeParse({ ...input, provider: "openai" }).success).toBe(false); + }); it("does not default baseURL on switch-only updates", () => { expect(updateProviderInput.parse({ id: "provider-1", enabled: false })).not.toHaveProperty("baseURL"); }); diff --git a/packages/api/src/features/ai-providers/service.test.ts b/packages/api/src/features/ai-providers/service.test.ts index 2b4baf594..43b2f920b 100644 --- a/packages/api/src/features/ai-providers/service.test.ts +++ b/packages/api/src/features/ai-providers/service.test.ts @@ -96,7 +96,7 @@ describe("aiProvidersService", () => { queryState.orderByArgs = []; }); - it("gets the first enabled and tested provider by creation order", async () => { + it("prefers the most recently used enabled and tested provider, then creation order", async () => { queryState.rows = [providerRow({ id: "first-created" })]; await expect(aiProvidersService.getDefaultRunnable({ userId: "user-1" })).resolves.toMatchObject({ @@ -112,7 +112,17 @@ describe("aiProvidersService", () => { { type: "eq", left: "ai_provider.test_status", right: "success" }, ], }); - expect(queryState.orderByArgs).toEqual([{ type: "asc", value: "ai_provider.created_at" }]); + expect(queryState.orderByArgs).toEqual([ + { + type: "desc", + value: { + type: "sql", + strings: ["coalesce(", ", '1970-01-01T00:00:00.000Z'::timestamptz)"], + values: ["ai_provider.last_used_at"], + }, + }, + { type: "asc", value: "ai_provider.created_at" }, + ]); expect(queryMock.limit).toHaveBeenCalledWith(1); }); }); diff --git a/packages/api/src/features/ai-providers/service.ts b/packages/api/src/features/ai-providers/service.ts index ec0979b39..e65979395 100644 --- a/packages/api/src/features/ai-providers/service.ts +++ b/packages/api/src/features/ai-providers/service.ts @@ -132,7 +132,10 @@ export const aiProvidersService = { eq(schema.aiProvider.testStatus, "success"), ), ) - .orderBy(asc(schema.aiProvider.createdAt)) + .orderBy( + desc(sql`coalesce(${schema.aiProvider.lastUsedAt}, '1970-01-01T00:00:00.000Z'::timestamptz)`), + asc(schema.aiProvider.createdAt), + ) .limit(1); return provider diff --git a/packages/api/src/features/ai/credentials.test.ts b/packages/api/src/features/ai/credentials.test.ts index 319a6911e..af4e745b0 100644 --- a/packages/api/src/features/ai/credentials.test.ts +++ b/packages/api/src/features/ai/credentials.test.ts @@ -9,6 +9,25 @@ vi.mock("@reactive-resume/env/server", () => ({ env: envMock })); const { decryptCredential, encryptCredential } = await import("./credentials"); describe("AI credential encryption", () => { + it("round-trips an empty key for a local Ollama provider", () => { + expect(decryptCredential(encryptCredential("").encryptedApiKey)).toBe(""); + }); + it("explains how to recover a key encrypted under a different secret", () => { + const encrypted = encryptCredential("sk-original"); + const previous = envMock.ENCRYPTION_SECRET; + try { + envMock.ENCRYPTION_SECRET = "changed-secret-with-enough-entropy"; + expect(() => decryptCredential(encrypted.encryptedApiKey)).toThrow( + expect.objectContaining({ + code: "AI_CREDENTIAL_DECRYPTION_FAILED", + status: 412, + message: expect.stringContaining("again"), + }), + ); + } finally { + envMock.ENCRYPTION_SECRET = previous; + } + }); it("encrypts and decrypts provider API keys without storing plaintext", () => { const encrypted = encryptCredential("sk-test-secret"); diff --git a/packages/api/src/features/ai/credentials.ts b/packages/api/src/features/ai/credentials.ts index af54fc90c..f80fe14f4 100644 --- a/packages/api/src/features/ai/credentials.ts +++ b/packages/api/src/features/ai/credentials.ts @@ -1,4 +1,5 @@ import { createCipheriv, createDecipheriv, createHash, randomBytes } from "node:crypto"; +import { ORPCError } from "@orpc/client"; import { env } from "@reactive-resume/env/server"; const CIPHER = "aes-256-gcm"; @@ -62,14 +63,21 @@ export function encryptCredential(apiKey: string): StoredCredentialFields { export function decryptCredential(payload: string) { const [version, encodedIv, encodedAuthTag, encodedCiphertext] = payload.split("."); - if (version !== CREDENTIAL_VERSION || !encodedIv || !encodedAuthTag || !encodedCiphertext) { + if (version !== CREDENTIAL_VERSION || !encodedIv || !encodedAuthTag || encodedCiphertext === undefined) { throw new Error("INVALID_ENCRYPTED_CREDENTIAL"); } - const decipher = createDecipheriv(CIPHER, getEncryptionKey(), decode(encodedIv)); - decipher.setAuthTag(decode(encodedAuthTag)); - - return Buffer.concat([decipher.update(decode(encodedCiphertext)), decipher.final()]).toString("utf8"); + const key = getEncryptionKey(); + try { + const decipher = createDecipheriv(CIPHER, key, decode(encodedIv)); + decipher.setAuthTag(decode(encodedAuthTag)); + return Buffer.concat([decipher.update(decode(encodedCiphertext)), decipher.final()]).toString("utf8"); + } catch { + throw new ORPCError("AI_CREDENTIAL_DECRYPTION_FAILED", { + status: 412, + message: "The saved provider key can't be decrypted. Enter the key again in Settings → AI & developer.", + }); + } } function isCredentialEncryptionConfigured() { diff --git a/packages/api/src/features/applications/service.test.ts b/packages/api/src/features/applications/service.test.ts index 3e7a07360..d1916ccde 100644 --- a/packages/api/src/features/applications/service.test.ts +++ b/packages/api/src/features/applications/service.test.ts @@ -161,23 +161,30 @@ describe("applicationService.update", () => { describe("applicationService sent resume", () => { const sentRow = { ...existing, status: "applied" as const, resumeId: "resume-1", sentResumeVersionId: null }; - it("saves the linked resume as a sent version with its Check score once the application is sent", async () => { - const data = structuredClone((await import("@reactive-resume/schema/resume/default")).defaultResumeData); - resumeGetByIdMock.mockResolvedValue({ id: "resume-1", data }); - const setSent = vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([{ ...sentRow }]) }) })); - dbMock.update.mockReturnValueOnce({ - set: vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([sentRow]) }) })), - }); - dbMock.update.mockReturnValueOnce({ set: setSent }); + it.each(["stage", "resume"] as const)( + "saves the sent version and score when the %s is linked at Applied", + async (field) => { + const data = structuredClone((await import("@reactive-resume/schema/resume/default")).defaultResumeData); + resumeGetByIdMock.mockResolvedValue({ id: "resume-1", data }); + const setSent = vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([{ ...sentRow }]) }) })); + dbMock.update.mockReturnValueOnce({ + set: vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([sentRow]) }) })), + }); + dbMock.update.mockReturnValueOnce({ set: setSent }); - await applicationService.update({ id: "app-1", userId: "user-1", status: "applied" }); + await applicationService.update({ + id: "app-1", + userId: "user-1", + ...(field === "stage" ? { status: "applied" as const } : { resumeId: "resume-1" }), + }); - expect(writeVersionMock).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ resumeId: "resume-1", kind: "sent", name: "Stripe", data }), - ); - expect(setSent).toHaveBeenCalledWith({ sentResumeVersionId: "version-1", sentCheckScore: expect.any(Number) }); - }); + expect(writeVersionMock).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ resumeId: "resume-1", kind: "sent", name: "Stripe", data }), + ); + expect(setSent).toHaveBeenCalledWith({ sentResumeVersionId: "version-1", sentCheckScore: expect.any(Number) }); + }, + ); it("saves it once, and not before the application is sent", async () => { setSelectResults([existing], [existing]); diff --git a/packages/api/src/features/auth/export.test.ts b/packages/api/src/features/auth/export.test.ts index 69c1bbb3d..90fba7e4a 100644 --- a/packages/api/src/features/auth/export.test.ts +++ b/packages/api/src/features/auth/export.test.ts @@ -12,6 +12,7 @@ vi.mock("@reactive-resume/db/schema", () => ({ })); vi.mock("drizzle-orm", () => ({ eq: (column: unknown, value: unknown) => ({ column, value }) })); vi.mock("@reactive-resume/env/server", () => ({ env: {} })); +vi.mock("@reactive-resume/auth/config", () => ({ isCustomOAuthProviderEnabled: () => false })); vi.mock("../storage/service", () => ({ getStorageService: vi.fn() })); const { authService } = await import("./service"); diff --git a/packages/api/src/features/auth/service.ts b/packages/api/src/features/auth/service.ts index d66158496..a0bbf7c5d 100644 --- a/packages/api/src/features/auth/service.ts +++ b/packages/api/src/features/auth/service.ts @@ -1,6 +1,7 @@ import type { AuthProvider } from "@reactive-resume/auth/types"; import { ORPCError } from "@orpc/client"; import { eq } from "drizzle-orm"; +import { isCustomOAuthProviderEnabled } from "@reactive-resume/auth/config"; import { db } from "@reactive-resume/db/client"; import * as schema from "@reactive-resume/db/schema"; import { env } from "@reactive-resume/env/server"; @@ -16,7 +17,7 @@ const providers = { if (env.GOOGLE_CLIENT_ID && env.GOOGLE_CLIENT_SECRET) providers.google = "Google"; if (env.GITHUB_CLIENT_ID && env.GITHUB_CLIENT_SECRET) providers.github = "GitHub"; if (env.LINKEDIN_CLIENT_ID && env.LINKEDIN_CLIENT_SECRET) providers.linkedin = "LinkedIn"; - if (env.OAUTH_CLIENT_ID && env.OAUTH_CLIENT_SECRET) providers.custom = env.OAUTH_PROVIDER_NAME ?? "Custom OAuth"; + if (isCustomOAuthProviderEnabled()) providers.custom = env.OAUTH_PROVIDER_NAME ?? "Custom OAuth"; return providers; }, diff --git a/packages/api/src/features/documents/service.test.ts b/packages/api/src/features/documents/service.test.ts index 7dac762f3..3163f8d4f 100644 --- a/packages/api/src/features/documents/service.test.ts +++ b/packages/api/src/features/documents/service.test.ts @@ -7,9 +7,11 @@ const resumeServiceMock = vi.hoisted(() => ({ delete: vi.fn(), setLocked: vi.fn(), })); +const applicationServiceMock = vi.hoisted(() => ({ update: vi.fn() })); vi.mock("@reactive-resume/db/client", () => ({ db: dbMock })); vi.mock("../resume/service", () => ({ resumeService: resumeServiceMock })); vi.mock("../cover-letters/service", () => ({ linkLetterApplication: vi.fn() })); +vi.mock("../applications/service", () => ({ applicationService: applicationServiceMock })); const { documentsService } = await import("./service"); @@ -25,7 +27,12 @@ const updates = () => { }; beforeEach(() => { - for (const mock of [...Object.values(dbMock), ...Object.values(resumeServiceMock)]) mock.mockReset(); + for (const mock of [ + ...Object.values(dbMock), + ...Object.values(resumeServiceMock), + ...Object.values(applicationServiceMock), + ]) + mock.mockReset(); }); describe("Trash", () => { @@ -34,6 +41,7 @@ describe("Trash", () => { await expect(documentsService.trash({ userId: "u1", type: "resume", id: "r1" })).rejects.toMatchObject({ code: "RESUME_LOCKED", + status: 403, }); expect(dbMock.update).not.toHaveBeenCalled(); }); @@ -70,7 +78,7 @@ describe("copyForJob", () => { expect.objectContaining({ name: "Product Designer — Orbital", tags: ["design"] }), ); expect(set).toHaveBeenCalledWith({ applicationId: "a1" }); - expect(set).toHaveBeenCalledWith({ resumeId: "copy" }); + expect(applicationServiceMock.update).toHaveBeenCalledWith({ userId: "u1", id: "a1", resumeId: "copy" }); }); it("leaves an application's existing resume alone", async () => { @@ -83,5 +91,6 @@ describe("copyForJob", () => { expect(resumeServiceMock.create).toHaveBeenCalledWith(expect.objectContaining({ name: "Mine" })); expect(set).toHaveBeenCalledTimes(1); + expect(applicationServiceMock.update).not.toHaveBeenCalled(); }); }); diff --git a/packages/api/src/features/documents/service.ts b/packages/api/src/features/documents/service.ts index 0e0a588e0..ad8af1378 100644 --- a/packages/api/src/features/documents/service.ts +++ b/packages/api/src/features/documents/service.ts @@ -3,6 +3,7 @@ import { ORPCError } from "@orpc/client"; import { and, count, eq, isNotNull, isNull, lt, sql } from "drizzle-orm"; import { db } from "@reactive-resume/db/client"; import * as schema from "@reactive-resume/db/schema"; +import { applicationService } from "../applications/service"; import { linkLetterApplication } from "../cover-letters/service"; import { resumeService } from "../resume/service"; @@ -15,7 +16,7 @@ const TRASH_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // Resumes keep their existing error code, which API and MCP clients already handle. const locked = (type: DocumentType) => type === "resume" - ? new ORPCError("RESUME_LOCKED") + ? new ORPCError("RESUME_LOCKED", { status: 403 }) : new ORPCError("DOCUMENT_LOCKED", { status: 400, message: "Unlock the letter first." }); /** "{source} — {company}" for a copy made for a job, "{source} (copy)" without one. */ @@ -267,7 +268,7 @@ export const documentsService = { if (application) { await db.update(schema.resume).set({ applicationId: application.id }).where(eq(schema.resume.id, id)); if (!application.resumeId) { - await db.update(schema.application).set({ resumeId: id }).where(eq(schema.application.id, application.id)); + await applicationService.update({ userId: input.userId, id: application.id, resumeId: id }); } } diff --git a/packages/api/src/features/resume/crud.ts b/packages/api/src/features/resume/crud.ts index 25ea90fdb..9c7644aa6 100644 --- a/packages/api/src/features/resume/crud.ts +++ b/packages/api/src/features/resume/crud.ts @@ -133,6 +133,7 @@ export const crudRouter = { .use(resumeMutationRateLimit) .output(resumeDto.update.output) .errors({ + RESUME_LOCKED: { status: 403, message: "Unlock the resume first." }, RESUME_SLUG_ALREADY_EXISTS: { message: "A resume with this slug already exists.", status: 400, @@ -166,6 +167,7 @@ export const crudRouter = { .use(resumeMutationRateLimit) .output(resumeDto.patch.output) .errors({ + RESUME_LOCKED: { status: 403, message: "Unlock the resume first." }, INVALID_PATCH_OPERATIONS: { message: "The patch operations are invalid or produced an invalid resume.", status: 400, @@ -248,5 +250,6 @@ export const crudRouter = { .input(resumeDto.delete.input) .use(resumeMutationRateLimit) .output(resumeDto.delete.output) + .errors({ RESUME_LOCKED: { status: 403, message: "Unlock the resume first." } }) .handler(({ context, input }) => documentsService.trash({ type: "resume", id: input.id, userId: context.user.id })), }; diff --git a/packages/api/src/features/resume/router.ts b/packages/api/src/features/resume/router.ts index 7ce5b38d7..1187f1a79 100644 --- a/packages/api/src/features/resume/router.ts +++ b/packages/api/src/features/resume/router.ts @@ -8,7 +8,7 @@ import { tagsRouter } from "./tags"; import { versionsRouter } from "./versions"; export const resumeRouter = { - getRoot: publicProcedure.handler(({ context }) => + getRoot: publicProcedure.route({ tags: ["Internal"] }).handler(({ context }) => getRootResume({ requestHeaders: context.reqHeaders, ...(context.user?.id ? { currentUserId: context.user.id } : {}), diff --git a/packages/api/src/features/resume/service.test.ts b/packages/api/src/features/resume/service.test.ts index 6333a47d2..a896a3fd0 100644 --- a/packages/api/src/features/resume/service.test.ts +++ b/packages/api/src/features/resume/service.test.ts @@ -247,6 +247,7 @@ describe("update", () => { await expect(resumeService.update({ id: "r1", userId: "u1", name: "New" })).rejects.toMatchObject({ code: "RESUME_LOCKED", + status: 403, }); expect(select.forUpdate).toHaveBeenCalledWith("update"); }); @@ -376,11 +377,34 @@ describe("delete", () => { await expect(resumeService.delete({ id: "r1", userId: "u1" })).rejects.toMatchObject({ code: "RESUME_LOCKED", + status: 403, }); }); }); describe("getBySlug", () => { + it.each(["u1", "other-user"])("password gate exempts only the owner (%s)", async (currentUserId) => { + dbMock.select.mockReturnValueOnce( + slugLookup([ + { + ...createResumeRow(defaultResumeData), + userId: "u1", + isPublic: true, + hasPassword: true, + passwordHash: "hash", + }, + ]), + ); + const request = resumeService.getBySlug({ + username: "owner", + slug: "resume", + currentUserId, + requestHeaders: new Headers(), + }); + if (currentUserId === "u1") await expect(request).resolves.toMatchObject({ id: "r1" }); + else await expect(request).rejects.toMatchObject({ code: "NEED_PASSWORD", status: 401 }); + }); + it("hides a private resume from an anonymous visitor", async () => { const row = { ...createResumeRow(defaultResumeData), @@ -401,6 +425,23 @@ describe("getBySlug", () => { }); describe("statistics.recordDownload", () => { + it("lets the owner download a password-protected resume without an unlock cookie", async () => { + dbMock.select.mockReturnValueOnce({ + from: () => ({ + innerJoin: () => ({ + where: () => Promise.resolve([{ id: "r1", userId: "u1", isPublic: true, passwordHash: "hash" }]), + }), + }), + }); + await expect( + resumeService.statistics.recordDownload({ + username: "owner", + slug: "resume", + currentUserId: "u1", + requestHeaders: new Headers(), + }), + ).resolves.toBe(true); + }); it("does not look in Trash for the resume", async () => { const where = vi.fn((_condition: unknown) => Promise.resolve([])); dbMock.select.mockReturnValueOnce({ from: () => ({ innerJoin: () => ({ where }) }) }); diff --git a/packages/api/src/features/resume/service.ts b/packages/api/src/features/resume/service.ts index 71570801d..0e314dc3f 100644 --- a/packages/api/src/features/resume/service.ts +++ b/packages/api/src/features/resume/service.ts @@ -90,7 +90,7 @@ async function applyResumePatchTx( .for("update"); if (!existing) throw new ORPCError("NOT_FOUND"); - if (existing.isLocked) throw new ORPCError("RESUME_LOCKED"); + if (existing.isLocked) throw new ORPCError("RESUME_LOCKED", { status: 403 }); if (input.expectedUpdatedAt && existing.updatedAt.getTime() !== input.expectedUpdatedAt.getTime()) { throw resumeVersionConflict(existing.updatedAt); } @@ -203,7 +203,11 @@ const statistics = { if (!resume) throw new ORPCError("NOT_FOUND"); const viewer = input.currentUserId ? { id: input.currentUserId } : null; assertCanView(resume, viewer); - if (resume.passwordHash && !hasResumeAccess(input.requestHeaders, resume.id, resume.passwordHash)) { + if ( + resume.passwordHash && + !isOwner(resume, viewer) && + !hasResumeAccess(input.requestHeaders, resume.id, resume.passwordHash) + ) { throw new ORPCError("NEED_PASSWORD", { status: 401, data: { username: input.username, slug: input.slug }, @@ -379,7 +383,7 @@ export const resumeService = { restore: async (input: { resumeId: string; versionId: string; userId: string }) => { // Check lock state before loading or validating historical data so locked resumes fail without expensive work. const current = await resumeService.getById({ id: input.resumeId, userId: input.userId }); - if (current.isLocked) throw new ORPCError("RESUME_LOCKED"); + if (current.isLocked) throw new ORPCError("RESUME_LOCKED", { status: 403 }); const version = await getVersion(input); @@ -467,6 +471,7 @@ export const resumeService = { username: string; slug: string; requestHeaders: Headers; + trustedClient?: string; currentUserId?: string; requirePublic?: boolean; expectedResumeId?: string; @@ -502,7 +507,11 @@ export const resumeService = { const viewer = input.currentUserId ? { id: input.currentUserId } : null; assertCanView(resume, viewer); - if (resume.hasPassword && !hasResumeAccess(input.requestHeaders, resume.id, resume.passwordHash)) { + if ( + resume.hasPassword && + !isOwner(resume, viewer) && + !hasResumeAccess(input.requestHeaders, resume.id, resume.passwordHash) + ) { throw new ORPCError("NEED_PASSWORD", { status: 401, data: { username: input.username, slug: input.slug }, @@ -510,7 +519,7 @@ export const resumeService = { } if (shouldCountForStatistics(resume, viewer)) { - const key = `${resume.id}:${clientKeyFromHeaders(input.requestHeaders)}`; + const key = `${resume.id}:${clientKeyFromHeaders(input.trustedClient)}`; if (await shouldCountView(key, Date.now())) { await resumeService.statistics.increment({ id: resume.id, views: true }); } @@ -610,7 +619,7 @@ export const resumeService = { .for("update"); if (!existing) throw new ORPCError("NOT_FOUND"); - if (existing.isLocked) throw new ORPCError("RESUME_LOCKED"); + if (existing.isLocked) throw new ORPCError("RESUME_LOCKED", { status: 403 }); // A new address must follow the pattern; existing ones that don't keep working until changed. const renamed = input.slug !== undefined && input.slug !== existing.slug; @@ -816,7 +825,7 @@ export const resumeService = { .where(and(eq(schema.resume.id, input.id), eq(schema.resume.userId, input.userId))); if (!resume) throw new ORPCError("NOT_FOUND"); - if (resume.isLocked) throw new ORPCError("RESUME_LOCKED"); + if (resume.isLocked) throw new ORPCError("RESUME_LOCKED", { status: 403 }); await tx.delete(schema.resume).where(and(eq(schema.resume.id, input.id), eq(schema.resume.userId, input.userId))); }); diff --git a/packages/api/src/features/resume/sharing.ts b/packages/api/src/features/resume/sharing.ts index 0e845aa4d..eef8026e2 100644 --- a/packages/api/src/features/resume/sharing.ts +++ b/packages/api/src/features/resume/sharing.ts @@ -22,6 +22,7 @@ export const sharingRouter = { resumeService.getBySlug({ ...input, requestHeaders: context.reqHeaders, + ...(context.trustedClient ? { trustedClient: context.trustedClient } : {}), ...(context.user?.id ? { currentUserId: context.user.id } : {}), }), ), diff --git a/packages/api/src/features/storage/service.ts b/packages/api/src/features/storage/service.ts index 427c74664..80ec60234 100644 --- a/packages/api/src/features/storage/service.ts +++ b/packages/api/src/features/storage/service.ts @@ -140,16 +140,16 @@ class LocalStorageService implements StorageService { } async write({ key, data, private: isPrivate }: StorageWriteInput): Promise { - if (isPrivate) { + if (isPrivate && !/^uploads\/[A-Za-z0-9_-]+\/agent\/[A-Za-z0-9_-]+\/[A-Za-z0-9_-]+$/.test(key)) { throw new Error( - "Private storage writes are not supported by the local filesystem backend. Configure S3 to store private attachments.", + "Private local writes must use the assistant attachment namespace, which public upload routes never serve.", ); } const fullPath = this.resolvePath(key); await fs.mkdir(dirname(fullPath), { recursive: true }); - await fs.writeFile(fullPath, data); + await fs.writeFile(fullPath, data, isPrivate ? { mode: 0o600 } : undefined); } async read(key: string): Promise { diff --git a/packages/api/src/middleware/rate-limit/index.test.ts b/packages/api/src/middleware/rate-limit/index.test.ts new file mode 100644 index 000000000..6d3ee2014 --- /dev/null +++ b/packages/api/src/middleware/rate-limit/index.test.ts @@ -0,0 +1,61 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +const { limit, settings } = vi.hoisted(() => ({ + limit: vi.fn(), + settings: { FLAG_DISABLE_API_RATE_LIMIT: false }, +})); + +vi.mock("../../redis", () => ({ createRateLimiter: () => ({ limit }) })); +vi.mock("@reactive-resume/env/server", () => ({ env: settings })); + +afterEach(() => { + vi.unstubAllEnvs(); + vi.resetModules(); + limit.mockReset(); +}); + +describe("public resume rate limits", () => { + it.each([false, true])("honors FLAG_DISABLE_API_RATE_LIMIT=%s in production", async (disabled) => { + vi.stubEnv("NODE_ENV", "production"); + settings.FLAG_DISABLE_API_RATE_LIMIT = disabled; + limit.mockResolvedValue({ success: false, remaining: 0, reset: Date.now() + 60_000 }); + const { resumePasswordRateLimit } = await import("./index"); + const next = vi.fn(async () => "allowed"); + const request = resumePasswordRateLimit( + { context: { trustedClient: "203.0.113.9" }, next } as never, + { username: "owner", slug: "resume" }, + vi.fn(), + ); + if (disabled) { + await expect(request).resolves.toBe("allowed"); + expect(limit).not.toHaveBeenCalled(); + } else { + await expect(request).rejects.toMatchObject({ code: "TOO_MANY_REQUESTS" }); + expect(next).not.toHaveBeenCalled(); + } + }); + + it("changing spoofed headers cannot rotate the password-limit key", async () => { + vi.stubEnv("NODE_ENV", "production"); + settings.FLAG_DISABLE_API_RATE_LIMIT = false; + limit.mockResolvedValue({ success: true, remaining: 4, reset: Date.now() + 60_000 }); + const { resumePasswordRateLimit } = await import("./index"); + for (const spoofedIp of ["198.51.100.1", "198.51.100.2"]) { + await resumePasswordRateLimit( + { + context: { + trustedClient: "203.0.113.9", + reqHeaders: new Headers({ "x-forwarded-for": spoofedIp, "cf-connecting-ip": spoofedIp }), + }, + next: vi.fn(async () => "allowed"), + } as never, + { username: "owner", slug: "resume" }, + vi.fn(), + ); + } + expect(limit.mock.calls.map(([key]) => key)).toEqual([ + "resume-password:owner:resume:ip:203.0.113.9", + "resume-password:owner:resume:ip:203.0.113.9", + ]); + }); +}); diff --git a/packages/api/src/middleware/rate-limit/index.ts b/packages/api/src/middleware/rate-limit/index.ts index 7469360b2..1eca3b761 100644 --- a/packages/api/src/middleware/rate-limit/index.ts +++ b/packages/api/src/middleware/rate-limit/index.ts @@ -1,40 +1,19 @@ import type { Ratelimiter } from "@orpc/experimental-ratelimit"; import { createRatelimitMiddleware } from "@orpc/experimental-ratelimit"; -import { rateLimitConfig, TRUSTED_IP_HEADERS } from "@reactive-resume/utils/rate-limit"; +import { env } from "@reactive-resume/env/server"; +import { rateLimitConfig } from "@reactive-resume/utils/rate-limit"; import { createRateLimiter } from "../../redis"; -const isRateLimitEnabled = process.env.NODE_ENV === "production"; +const isRateLimitEnabled = process.env.NODE_ENV === "production" && !env.FLAG_DISABLE_API_RATE_LIMIT; type ContextWithHeaders = { reqHeaders?: Headers; user?: { id: string } | null; + trustedClient?: string; }; -function getTrustedIp(headers?: Headers): string | null { - if (!headers) return null; - - for (const headerName of TRUSTED_IP_HEADERS) { - const raw = headers.get(headerName)?.trim(); - if (!raw) continue; - - // Some proxies provide a comma-delimited chain; first item is the original client. - const ip = raw.split(",")[0]?.trim(); - if (!ip) continue; - - return ip; - } - - return null; -} - -export function getClientKey(headers?: Headers): string { - const trustedIp = getTrustedIp(headers); - if (trustedIp) return `ip:${trustedIp}`; - - const userAgent = headers?.get("user-agent")?.trim() ?? "unknown"; - const language = headers?.get("accept-language")?.split(",")[0]?.trim() ?? "none"; - - return `fp:${userAgent.slice(0, 64)}:${language.slice(0, 16)}`; +export function getClientKey(trustedClient?: string): string { + return `ip:${trustedClient?.trim() || "unknown"}`; } function getUserKey(context: ContextWithHeaders): string { @@ -85,7 +64,7 @@ export const resumePasswordRateLimit = createRatelimitMiddleware< { username: string; slug: string } >({ limiter: productionLimiter(resumePasswordLimiter), - key: ({ context }, input) => `resume-password:${input.username}:${input.slug}:${getClientKey(context.reqHeaders)}`, + key: ({ context }, input) => `resume-password:${input.username}:${input.slug}:${getClientKey(context.trustedClient)}`, }); export const pdfExportRateLimit = createRatelimitMiddleware({ @@ -99,7 +78,7 @@ export const resumeDownloadRateLimit = createRatelimitMiddleware< >({ limiter: productionLimiter(resumeDownloadLimiter), key: ({ context }, input) => - `resume-download:${input.username}:${input.slug}:${getUserKey(context)}:${getClientKey(context.reqHeaders)}`, + `resume-download:${input.username}:${input.slug}:${getUserKey(context)}:${getClientKey(context.trustedClient)}`, }); export const aiRequestRateLimit = createRatelimitMiddleware({ diff --git a/packages/auth/src/config.ts b/packages/auth/src/config.ts index 76a85fc77..0b41783fb 100644 --- a/packages/auth/src/config.ts +++ b/packages/auth/src/config.ts @@ -20,7 +20,7 @@ import * as schema from "@reactive-resume/db/schema"; import { ResetPasswordEmail, VerifyEmail, VerifyEmailChange } from "@reactive-resume/email/templates/auth"; import { sendEmail } from "@reactive-resume/email/transport"; import { env } from "@reactive-resume/env/server"; -import { rateLimitConfig, TRUSTED_IP_HEADERS } from "@reactive-resume/utils/rate-limit"; +import { rateLimitConfig } from "@reactive-resume/utils/rate-limit"; import { generateId, toUsername } from "@reactive-resume/utils/string"; import { isAllowedOAuthRedirectUri } from "@reactive-resume/utils/url-security.node"; import { createGithubProfileMapper, createProfileMapper } from "./oauth-profile"; @@ -78,7 +78,7 @@ export async function verifyOAuthToken(token: string): Promise { }); } -function isCustomOAuthProviderEnabled() { +export function isCustomOAuthProviderEnabled() { const hasDiscovery = Boolean(env.OAUTH_DISCOVERY_URL); const hasManual = Boolean(env.OAUTH_AUTHORIZATION_URL) && Boolean(env.OAUTH_TOKEN_URL) && Boolean(env.OAUTH_USER_INFO_URL); @@ -201,7 +201,7 @@ const getAuthConfig = () => { advanced: { database: { generateId }, useSecureCookies: authBaseUrl.startsWith("https://"), - ipAddress: { ipAddressHeaders: TRUSTED_IP_HEADERS }, + ipAddress: { ipAddressHeaders: ["X-Real-IP"] }, }, emailAndPassword: { diff --git a/packages/docx/src/section-renderers.ts b/packages/docx/src/section-renderers.ts index c277fe0e1..1b22b9927 100644 --- a/packages/docx/src/section-renderers.ts +++ b/packages/docx/src/section-renderers.ts @@ -165,13 +165,14 @@ function renderExperience(section: Sections["experience"], colorHex: string): Pa const baseRun = getBaseRun(); for (const item of items) { - if (item.roles && item.roles.length > 0) { + const roles = item.roles.filter((role) => role.position.trim()); + if (roles.length > 0) { paragraphs.push(titleAndSubtitle(item.company, "", item.period)); const loc = locationAndPeriod(item.location, ""); if (loc) paragraphs.push(loc); - for (const role of item.roles) { + for (const role of roles) { paragraphs.push( new Paragraph({ spacing: { before: 80 }, @@ -190,11 +191,8 @@ function renderExperience(section: Sections["experience"], colorHex: string): Pa const loc = locationAndPeriod(item.location, ""); if (loc) paragraphs.push(loc); - - if (item.description) { - paragraphs.push(...htmlToParagraphs(item.description, getHtmlStyle())); - } } + if (item.description) paragraphs.push(...htmlToParagraphs(item.description, getHtmlStyle())); const ws = websiteParagraph(item.website.url, item.website.label); if (ws) paragraphs.push(ws); diff --git a/packages/mcp/src/mcp-server-card.ts b/packages/mcp/src/mcp-server-card.ts index 276f03fd1..84bdbb0e8 100644 --- a/packages/mcp/src/mcp-server-card.ts +++ b/packages/mcp/src/mcp-server-card.ts @@ -89,7 +89,7 @@ export function buildMcpServerCard(appVersion: string) { type: "string", title: "API key", description: - "Optional. Create a key under Account → API Keys. Forwarded as the x-api-key header when not using OAuth.", + "Optional. Create a key under Settings → AI & developer → API keys. Forwarded as the x-api-key header when not using OAuth.", "x-from": { header: "x-api-key" }, }, }, @@ -101,7 +101,7 @@ export function buildMcpServerCard(appVersion: string) { resourceTemplates, authentication: { required: true, - schemes: ["oauth2", "bearer"], + schemes: ["oauth2", "bearer", "apiKey"], }, }; } diff --git a/packages/mcp/src/tool-meta.ts b/packages/mcp/src/tool-meta.ts index 215765cf6..6be337828 100644 --- a/packages/mcp/src/tool-meta.ts +++ b/packages/mcp/src/tool-meta.ts @@ -226,7 +226,7 @@ export const TOOL_META = { [T.createResume]: { title: "Create Resume", description: [ - "Create a new, empty resume with a name and URL-friendly slug.", + "Create a new, empty resume with a name. Its URL-friendly slug is generated when omitted.", "", "Returns the ID of the newly created resume.", "Set `withSampleData` to true to pre-fill with example content (useful for testing).", @@ -238,7 +238,8 @@ export const TOOL_META = { .string() .min(1) .max(64) - .describe("URL-friendly slug, must be unique across your resumes (e.g. 'software-engineer-2026')"), + .optional() + .describe("Optional URL-friendly slug; generated from the name when omitted."), tags: z .array(z.string()) .optional() @@ -269,14 +270,14 @@ export const TOOL_META = { "Create a copy of an existing resume with all its data.", "", "Returns the ID of the newly duplicated resume.", - "You must provide a new name and slug for the copy.", + "Name and tags default to the original; a unique slug is generated when omitted.", "Useful for creating job-specific variants of a base resume.", ].join("\n"), inputSchema: z.object({ id: resumeIdSchema.describe("ID of the resume to duplicate"), - name: z.string().min(1).max(64).describe("Name for the duplicate"), - slug: z.string().min(1).max(64).describe("URL-friendly slug for the duplicate (must be unique)"), - tags: z.array(z.string()).optional().default([]).describe("Tags for the duplicate"), + name: z.string().min(1).max(64).optional().describe("Name for the duplicate; defaults to the original"), + slug: z.string().min(1).max(64).optional().describe("Optional unique slug; generated when omitted"), + tags: z.array(z.string()).optional().describe("Tags for the duplicate; defaults to the original"), }), annotations: WRITE_NON_IDEMPOTENT, }, diff --git a/packages/mcp/src/tools.test.ts b/packages/mcp/src/tools.test.ts index c05b645a0..272979d1b 100644 --- a/packages/mcp/src/tools.test.ts +++ b/packages/mcp/src/tools.test.ts @@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { ORPCError } from "@orpc/server"; +import { TOOL_META } from "./tool-meta"; vi.mock("@reactive-resume/api/context", () => ({ resolveUserFromRequestHeaders: vi.fn(), @@ -103,6 +104,19 @@ describe("registerTools", () => { vi.clearAllMocks(); }); + it("creates and duplicates with an automatically generated address", async () => { + const { server, registered } = makeFakeServer(); + registerTools(server as never, clientMock as never, new Headers()); + clientMock.resume.create.mockResolvedValueOnce("created"); + clientMock.resume.duplicate.mockResolvedValueOnce("copied"); + const create = registered.find((tool) => tool.name === MCP_TOOL_NAME.createResume)!; + const duplicate = registered.find((tool) => tool.name === MCP_TOOL_NAME.duplicateResume)!; + await create.handler(TOOL_META[MCP_TOOL_NAME.createResume].inputSchema.parse({ name: "Resume" })); + await duplicate.handler(TOOL_META[MCP_TOOL_NAME.duplicateResume].inputSchema.parse({ id: "r1" })); + expect(clientMock.resume.create).toHaveBeenCalledWith({ name: "Resume", tags: [], withSampleData: false }); + expect(clientMock.resume.duplicate).toHaveBeenCalledWith({ id: "r1" }); + }); + it("imports applications with followUpAt coerced to Date and null preserved", async () => { clientMock.applications.import.mockResolvedValueOnce({ imported: 2 }); const { server, registered } = makeFakeServer(); diff --git a/packages/mcp/src/tools.ts b/packages/mcp/src/tools.ts index 1efd4031b..107ecad73 100644 --- a/packages/mcp/src/tools.ts +++ b/packages/mcp/src/tools.ts @@ -195,14 +195,14 @@ export function registerTools(server: McpServer, client: RouterClient { - const id = await client.resume.create({ name, slug, tags, withSampleData }); + const id = await client.resume.create({ name, ...(slug ? { slug } : {}), tags, withSampleData }); return text( - `Created resume "${name}" (ID: ${id}) with slug "${slug}".${withSampleData ? " Pre-filled with sample data." : ""}\n\nNext steps: Use \`${T.getResume}\` to view it, or \`${T.patchResume}\` to start editing.`, + `Created resume "${name}" (ID: ${id}) ${slug ? `with slug "${slug}"` : "with a generated address"}.${withSampleData ? " Pre-filled with sample data." : ""}\n\nNext steps: Use \`${T.getResume}\` to view it, or \`${T.patchResume}\` to start editing.`, ); }, ), @@ -239,11 +239,26 @@ export function registerTools(server: McpServer, client: RouterClient { - const newId = await client.resume.duplicate({ id, name, slug, tags }); + async ({ + id, + name, + slug, + tags, + }: { + id: string; + name?: string | undefined; + slug?: string | undefined; + tags?: string[] | undefined; + }) => { + const newId = await client.resume.duplicate({ + id, + ...(name ? { name } : {}), + ...(slug ? { slug } : {}), + ...(tags ? { tags } : {}), + }); return text( - `Duplicated resume as "${name}" (ID: ${newId}) with slug "${slug}".\n\nNext steps: Use \`${T.getResume}\` to view it, or \`${T.patchResume}\` to customize.`, + `Duplicated resume${name ? ` as "${name}"` : ""} (ID: ${newId}) ${slug ? `with slug "${slug}"` : "with a generated address"}.\n\nNext steps: Use \`${T.getResume}\` to view it, or \`${T.patchResume}\` to customize.`, ); }, ), @@ -268,9 +283,9 @@ export function registerTools(server: McpServer, client: RouterClient { const { id, name, slug, tags, isPublic } = params as { id: string; - name?: string; - slug?: string; - tags?: string[]; + name?: string | undefined; + slug?: string | undefined; + tags?: string[] | undefined; isPublic?: boolean; }; if (name === undefined && slug === undefined && tags === undefined && isPublic === undefined) diff --git a/packages/pdf/src/forme/render.ts b/packages/pdf/src/forme/render.ts index d60bf0ca7..ee405f07c 100644 --- a/packages/pdf/src/forme/render.ts +++ b/packages/pdf/src/forme/render.ts @@ -10,7 +10,7 @@ import type { SectionTitleResolver } from "../section-title"; import { createElement } from "react"; import { ResumeDocument } from "../document"; import { resolvePdfFonts, resumeContentContainsCJK, resumeContentScripts } from "../hooks/use-register-fonts"; -import { extractPageMap } from "../page-map"; +import { extractPageMap, NODE_SOURCE_PREFIX, parseResumeNodeKey } from "../page-map"; import { loadFonts } from "./fonts"; import { loadIcons } from "./icons"; import { imageSources, loadImages } from "./images"; @@ -56,6 +56,26 @@ const misplacesABox = (result: RenderWithLayoutResult) => }), ); +/** Whole sections Forme lost while splitting a column, rather than ordinary off-page fragments. */ +function unplacedSections(layout: RenderWithLayoutResult["layout"]): string[] { + const placed = new Set( + extractPageMap(layout) + .nodes.filter((node) => node.kind === "section") + .map((node) => node.key), + ); + const missing = new Set(); + const visit = (element: ElementInfo) => { + const source = element.sourceLocation?.file; + if (source?.startsWith(NODE_SOURCE_PREFIX) && (offPage(element.y) || offPage(element.height))) { + const key = source.slice(NODE_SOURCE_PREFIX.length); + if (parseResumeNodeKey(key)?.kind === "section" && !placed.has(key)) missing.add(key); + } + element.children.forEach(visit); + }; + for (const page of layout.pages) page.elements.forEach(visit); + return [...missing]; +} + const isFixed = (element: ElementInfo): boolean => element.sourceLocation?.file === FIXED_SOURCE || element.children.some(isFixed); @@ -124,8 +144,14 @@ export async function renderResumeElement(engine: FormeEngine, element: ReactEle const { images, warnings: imageWarnings } = await loadImages(imageSources(tree)); const breakBeforeListItems = new Set(); + const breakBeforeSections = new Set(); const layOutOnce = async (keepNestedRowsWhole: boolean) => { - const { document, warnings } = toFormeDocument(tree, { images, keepNestedRowsWhole, breakBeforeListItems }); + const { document, warnings } = toFormeDocument(tree, { + images, + keepNestedRowsWhole, + breakBeforeListItems, + breakBeforeSections, + }); // Forme rewrites the font entries it's given (bytes to base64), so each render gets its own. const render = () => engine.renderSerializedDocWithLayout({ ...document, fonts: fonts.map((font) => ({ ...font })) }); @@ -158,6 +184,12 @@ export async function renderResumeElement(engine: FormeEngine, element: ReactEle let { result, warnings } = await layOut(false); if (misplacesABox(result)) ({ result, warnings } = await layOut(true)); + const missingSections = unplacedSections(result.layout); + if (missingSections.length > 0) { + // A section that disappeared gets an explicit next-page start; never discard its content to make it fit. + for (const key of missingSections) breakBeforeSections.add(key); + ({ result, warnings } = await layOut(true)); + } if (misplacesABox(result)) warnings.push("render defect: the engine couldn't place a box; a page may be laid out wrong"); diff --git a/packages/pdf/src/forme/to-forme.tsx b/packages/pdf/src/forme/to-forme.tsx index 7e0caa7f2..659be120e 100644 --- a/packages/pdf/src/forme/to-forme.tsx +++ b/packages/pdf/src/forme/to-forme.tsx @@ -54,6 +54,7 @@ type Context = { /** Whether the parent lays its children out in a row. */ rowParent: boolean; keepNestedRowsWhole: boolean; + breakBeforeSections: ReadonlySet; /** The parent's padding: Forme places absolute boxes inside it, react-pdf over it. */ parentPadding: Edges; /** The opaque colour behind the element being converted (see `flattenAlpha`). */ @@ -447,6 +448,8 @@ function convertNode(node: HostNode, parentContext: Context, key: number): React ); let children = spread.children; const viewStyle = flowStyle(props, spread.style); + const nodeKey = props[RESUME_NODE_PROP]; + if (typeof nodeKey === "string" && context.breakBeforeSections.has(nodeKey)) viewStyle.breakBefore = true; if (context.listItem?.role === LIST_ROLE.item && context.lists.breakBefore.has(context.listItem.index)) viewStyle.breakBefore = true; // Forme ignores a page break on an item of a row: the row takes it, as the item can't start a page without it. @@ -895,11 +898,18 @@ export type ConvertOptions = { keepNestedRowsWhole?: boolean; /** List items (by index, see `LIST_ROLE`) that start a new page, so their marker stays with their first line. */ breakBeforeListItems?: ReadonlySet; + /** Wholly unplaced sections that need an explicit page break on the final render retry. */ + breakBeforeSections?: ReadonlySet; }; export function toFormeDocument( tree: HostNode[], - { images = new Map(), keepNestedRowsWhole = false, breakBeforeListItems = new Set() }: ConvertOptions = {}, + { + images = new Map(), + keepNestedRowsWhole = false, + breakBeforeListItems = new Set(), + breakBeforeSections = new Set(), + }: ConvertOptions = {}, ): ConvertedDocument { const root = tree.find((node): node is HostElement => node.type === HOST.document); if (!root) throw new Error("The resume didn't render a ."); @@ -913,6 +923,7 @@ export function toFormeDocument( insideRow: false, rowParent: false, keepNestedRowsWhole, + breakBeforeSections, images, backdrop: WHITE, pageMargin: undefined, diff --git a/packages/pdf/src/semantic/tree.test.ts b/packages/pdf/src/semantic/tree.test.ts index afe0c4d54..31505a1f7 100644 --- a/packages/pdf/src/semantic/tree.test.ts +++ b/packages/pdf/src/semantic/tree.test.ts @@ -58,7 +58,7 @@ const buildFixture = (): ResumeData => { location: "London", period: "1842", website: { url: "https://example.com/company", label: "Company", inlineLink: true }, - description: "

    Ignored when roles exist

    ", + description: "

    Company-wide description

    ", roles: [ { id: "role/item", @@ -355,6 +355,27 @@ const buildCompleteFixture = (): ResumeData => { }; describe("buildSemanticTree", () => { + it("retains company-wide description and prints a repeated position only in the visible role", () => { + const data = buildFixture(); + const item = required(data.sections.experience.items[0], "experience fixture"); + item.position = required(item.roles[0], "role fixture").position; + item.roles.push({ id: "blank-role", position: " ", period: "", description: "

    Hidden role

    " }); + const tree = buildSemanticTree({ + data, + template: "onyx", + page: required(data.metadata.layout.pages[0], "authored page"), + pageNumber: 1, + showHeader: true, + }); + const parent = required( + findNode(tree, (node) => node.id === item.id), + "experience", + ); + expect(parent.children.some((node) => node.kind === "field" && node.attributes.name === "description")).toBe(true); + expect(findNodes(parent, (node) => node.kind === "field" && node.attributes.name === "position")).toHaveLength(1); + expect(findNode(tree, (node) => node.id === "blank-role")).toBeUndefined(); + expect(item.position).toBe("Programmer"); + }); it("builds stable authored-page, section, nested-role, field, and rich-text ancestry", () => { const data = buildFixture(); const before = structuredClone(data); diff --git a/packages/pdf/src/semantic/tree.ts b/packages/pdf/src/semantic/tree.ts index cb1159df5..1925ed0c4 100644 --- a/packages/pdf/src/semantic/tree.ts +++ b/packages/pdf/src/semantic/tree.ts @@ -293,10 +293,6 @@ const buildItem = ({ } for (const name of Object.keys(STANDARD_FIELD_REGISTRY[type])) { - if (type === "experience" && name === "description" && Array.isArray(item.roles) && item.roles.length > 0) { - continue; - } - const parent = headerFieldNames.includes(name as never) || (requireItemHeaderPrimitive && headerFieldNames.length === 0) ? headerKey diff --git a/packages/pdf/src/templates/shared/filtering.ts b/packages/pdf/src/templates/shared/filtering.ts index 37767c468..c6f38bbea 100644 --- a/packages/pdf/src/templates/shared/filtering.ts +++ b/packages/pdf/src/templates/shared/filtering.ts @@ -74,10 +74,12 @@ const filterExperienceRoles = (item: T, sectionType?: stri if (!Array.isArray(roles)) return item; const visibleRoles = roles.filter(hasVisibleExperienceRole); + const position = (item as { position?: unknown }).position; + const repeatsRole = hasText(position) && visibleRoles.some((role) => role.position.trim() === position.trim()); - if (visibleRoles.length === roles.length) return item; + if (visibleRoles.length === roles.length && !repeatsRole) return item; - return { ...item, roles: visibleRoles } as T; + return { ...item, roles: visibleRoles, ...(repeatsRole ? { position: "" } : {}) } as T; }; export const filterItems = (items: T[], sectionType?: string): T[] => { diff --git a/packages/resume/src/ats-pdf/analyze/contact.ts b/packages/resume/src/ats-pdf/analyze/contact.ts index b76e232ec..c6423a751 100644 --- a/packages/resume/src/ats-pdf/analyze/contact.ts +++ b/packages/resume/src/ats-pdf/analyze/contact.ts @@ -23,7 +23,7 @@ function digitsIn(value: string): number { } function extractPhones(text: string): string[] { - const candidates = text.match(PHONE_PATTERN) ?? []; + const candidates = text.split(/\r?\n/).flatMap((line) => line.match(PHONE_PATTERN) ?? []); return uniqueStrings( candidates @@ -31,6 +31,7 @@ function extractPhones(text: string): string[] { .filter((candidate) => { const digits = digitsIn(candidate); if (digits < 7 || digits > 15) return false; + if (/^(?:19|20)\d{2}\s*[-–—]?\s*(?:19|20)\d{2}$/.test(candidate)) return false; // A year range or a street number is digits too; a phone number is mostly digits. return digits / candidate.replace(/\s/g, "").length > 0.55; }), @@ -141,8 +142,14 @@ export function analyzeContact(raw: RawExtraction, document: ExtractedDocument): const locationLine = firstPageLines .slice(0, FIRST_PAGE_CONTACT_LINES) - .find((line) => /,\s*[\p{Lu}]/u.test(line.text) && !EMAIL_TEST.test(line.text) && line.text.length < 80) - ?.text.trim() ?? null; + .flatMap((line) => line.text.split(/\s*[·|•]\s*/)) + .find( + (candidate) => + /^[\p{L}\p{M} .'-]+,\s*[\p{L}\p{M} .'-]+$/u.test(candidate) && + !candidate.endsWith(".") && + candidate.trim().split(/\s+/).length <= 6, + ) + ?.trim() ?? null; return { emails, diff --git a/packages/resume/src/ats-pdf/index.test.ts b/packages/resume/src/ats-pdf/index.test.ts index fe4e42d7d..f94b2739b 100644 --- a/packages/resume/src/ats-pdf/index.test.ts +++ b/packages/resume/src/ats-pdf/index.test.ts @@ -1,11 +1,31 @@ import { describe, expect, it } from "vitest"; +import { buildResumeSemantics } from "./analyze/semantics"; import { PDF_ATS_RULE_CODES } from "./catalog"; +import { buildExtractedDocument } from "./extract"; import { analyzePdfResume } from "./index"; import { healthyResume, makeRawExtraction } from "./test-fixtures"; const NOW = new Date("2024-06-15T00:00:00Z"); describe("analyzePdfResume", () => { + it("extracts contact fields without reading summary fragments or years as contacts", () => { + const raw = makeRawExtraction({ + lines: [ + { text: "Ada Lovelace", size: 20 }, + "ada@example.com", + "+1 (555) 291-4756", + "Experienced developer creates tools, Leading teams across global projects", + "San Francisco, CA", + "2022", + "2022", + "2020 - 2024", + ], + }); + const { contact } = buildResumeSemantics(raw, buildExtractedDocument(raw), { now: NOW }); + expect(contact.phones).toEqual(["+1 (555) 291-4756"]); + expect(contact.locationLine).toBe("San Francisco, CA"); + }); + it("scores a clean single-column resume at the top of the range", () => { const report = analyzePdfResume(healthyResume(), { now: NOW }); diff --git a/packages/resume/src/markdown.test.ts b/packages/resume/src/markdown.test.ts index 84150e074..4a828f72e 100644 --- a/packages/resume/src/markdown.test.ts +++ b/packages/resume/src/markdown.test.ts @@ -19,6 +19,18 @@ const withLetter = () => { }; describe("htmlToMarkdown", () => { + it("preserves numbered-list starts and inline formatting", () => { + expect( + htmlToMarkdown( + '
    1. Lead work with proof

    2. Old New

    ', + ), + ).toBe("3. **Lead** _work_ with [**proof**](https://example.com)\n4. ~~Old~~ New"); + }); + it("keeps nested list markers beneath their parent", () => { + expect(htmlToMarkdown("
    • Parent

      1. Child

    ")).toBe( + "- Parent\n\n 1. Child", + ); + }); it("converts the constrained tiptap tag set", () => { const html = "

    Led teams of engineers.

    • Shipped X
    • Owned Y
    "; expect(htmlToMarkdown(html)).toBe("Led **teams** of _engineers_.\n\n- Shipped X\n- Owned Y"); @@ -32,6 +44,18 @@ describe("htmlToMarkdown", () => { }); describe("buildMarkdown", () => { + it("keeps experience descriptions when visible or blank roles are present", () => { + const data = structuredClone(sampleResumeData); + const item = data.sections.experience.items[0]; + if (!item) throw new Error("Missing experience fixture"); + item.description = "

    Company-wide impact

    "; + item.roles = [{ id: "role", position: "Lead", period: "", description: "

    Role impact

    " }]; + expect(buildMarkdown(data)).toContain("Company-wide impact"); + expect(buildMarkdown(data)).toContain("Role impact"); + item.roles = [{ id: "blank-role", position: " ", period: "", description: "

    Role impact

    " }]; + expect(buildMarkdown(data)).toContain(`### ${item.company} — ${item.position}`); + expect(buildMarkdown(data)).not.toContain("Role impact"); + }); // Section titles are stored empty and resolved by the caller; mimic that with a simple resolver. const resolveTitle = (sectionId: string) => ({ summary: "Summary", experience: "Experience", education: "Education" })[sectionId]; diff --git a/packages/resume/src/markdown.ts b/packages/resume/src/markdown.ts index d0e526dca..93b4c10f0 100644 --- a/packages/resume/src/markdown.ts +++ b/packages/resume/src/markdown.ts @@ -115,15 +115,16 @@ function renderExperience(section: Sections["experience"]): string[] { const blocks: string[] = [heading(section.title)]; for (const item of items) { - if (item.roles.length > 0) { + const roles = item.roles.filter((role) => role.position.trim()); + if (roles.length > 0) { blocks.push(entryHeading(item.company, undefined, item.period), italicLine([item.location])); - for (const role of item.roles) { + for (const role of roles) { blocks.push(italicLine([role.position, role.period]), htmlToMarkdown(role.description)); } } else { blocks.push(entryHeading(item.company, item.position, item.period), italicLine([item.location])); - blocks.push(htmlToMarkdown(item.description)); } + blocks.push(htmlToMarkdown(item.description)); blocks.push(link(item.website.label, item.website.url)); } return blocks.filter(Boolean); @@ -314,24 +315,39 @@ const ENTITIES: Record = { /** * ponytail: regex converter, not a full HTML parser. The rich-text fields only ever hold the - * constrained tiptap tag set (p, br, strong/b, em/i, u, s, a, ul/ol/li, headings). If the editor - * gains nested/table markup, swap this for a real parser. + * constrained tiptap tag set (p, br, strong/b, em/i, u, s, a, ul/ol/li, headings). Nested lists are converted innermost first. + * If the editor gains tables or arbitrary HTML, swap this for a real parser. */ export function htmlToMarkdown(html: string): string { if (!html) return ""; - return html - .replace(/]*href="([^"]*)"[^>]*>(.*?)<\/a>/gis, (_m, url, inner) => `[${stripTags(inner)}](${url})`) + // Convert innermost lists first so nested items retain their own numbering and indentation. + const list = /<(ul|ol)\b([^>]*)>((?:(?!<(?:ul|ol)\b).)*?)<\/\1>/gis; + let content = html; + while (/<(?:ul|ol)\b/i.test(content)) { + const next = content.replace(list, (_match, tag: string, attributes: string, inner: string) => { + let index = Number(/\bstart=["']?(\d+)/i.exec(attributes)?.[1] ?? 1); + const items = inner.replace(/]*>(.*?)<\/li>/gis, (_item, body: string) => { + const prefix = tag.toLowerCase() === "ol" ? `${index++}. ` : "- "; + return `${prefix}${htmlToMarkdown(body).replace(/\n/g, `\n${" ".repeat(prefix.length)}`)}\n`; + }); + return `\n${items}\n`; + }); + if (next === content) break; + content = next; + } + return content + .replace(/]*href="([^"]*)"[^>]*>(.*?)<\/a>/gis, (_m, url, inner) => `[${htmlToMarkdown(inner)}](${url})`) .replace(/<(strong|b)>(.*?)<\/\1>/gis, "**$2**") .replace(/<(em|i)>(.*?)<\/\1>/gis, "_$2_") - .replace(/]*>(.*?)<\/li>/gis, (_m, inner) => `- ${stripTags(inner).trim()}\n`) + .replace(/<(s|strike|del)\b[^>]*>(.*?)<\/\1>/gis, "~~$2~~") + .replace(/]*>(.*?)<\/u>/gis, "$1") + .replace(/]*>(.*?)<\/li>/gis, (_m, inner) => `- ${htmlToMarkdown(inner).trim()}\n`) .replace(//gi, "\n") .replace(/<\/(p|div|h[1-6]|ul|ol)>/gi, "\n\n") - .replace(/<[^>]+>/g, "") + .replace(/<(?!\/?u>)[^>]+>/g, "") .replace(/'| |"|&|<|>/g, (m) => ENTITIES[m] ?? m) .replace(/[ \t]+\n/g, "\n") .replace(/\n{3,}/g, "\n\n") .trim(); } - -const stripTags = (html: string) => html.replace(/<[^>]+>/g, ""); diff --git a/packages/schema/src/resume/sample.ts b/packages/schema/src/resume/sample.ts index 5e951df69..c060323d9 100644 --- a/packages/schema/src/resume/sample.ts +++ b/packages/schema/src/resume/sample.ts @@ -111,7 +111,7 @@ export const sampleResumeData: ResumeData = { }, roles: [], description: - "
    • Lead gameplay programmer on an unannounced AAA action-adventure title built in Unreal Engine 5 for PC and next-gen consoles

    • Architected and implemented core combat system including hit detection, combo mechanics, and enemy AI behavior trees serving 15+ enemy types

    • Developed custom editor tools in C++ that reduced level designer iteration time by 40% and improved workflow efficiency across the team

    • Optimized rendering pipeline and gameplay systems to maintain 60 FPS performance target on all supported platforms, achieving 95% frame rate stability

    • Ad nostrud enim adipisicing ea proident aliqua veniam nisi amet ea irure et mollit.

    ", + "
    • Lead gameplay programmer on an unannounced AAA action-adventure title built in Unreal Engine 5 for PC and next-gen consoles

    • Architected and implemented core combat system including hit detection, combo mechanics, and enemy AI behavior trees serving 15+ enemy types

    • Developed custom editor tools in C++ that reduced level designer iteration time by 40% and improved workflow efficiency across the team

    • Optimized rendering pipeline and gameplay systems to maintain 60 FPS performance target on all supported platforms, achieving 95% frame rate stability

    • Collaborated with designers and QA to resolve gameplay defects and ship stable milestone builds.

    ", }, ], }, @@ -515,7 +515,7 @@ export const sampleResumeData: ResumeData = { }, customSections: [ { - title: "", + title: "Earlier experience", icon: "briefcase", columns: 1, hidden: false, @@ -599,7 +599,7 @@ export const sampleResumeData: ResumeData = { type: "icon", }, colors: { - primary: "rgba(0, 132, 209, 1)", + primary: "rgba(0, 112, 178, 1)", text: "rgba(0, 0, 0, 1)", background: "rgba(255, 255, 255, 1)", }, diff --git a/packages/ui/src/components/menu-styles.tsx b/packages/ui/src/components/menu-styles.tsx index 37cca7ded..8156d551b 100644 --- a/packages/ui/src/components/menu-styles.tsx +++ b/packages/ui/src/components/menu-styles.tsx @@ -13,7 +13,7 @@ export const popupSlideClassName = export const menuPopupClassName = `relative z-50 max-h-(--available-height) min-w-[220px] origin-(--transform-origin) overflow-y-auto overflow-x-hidden rounded-xl bg-raised p-1 text-ink shadow-e2 outline-none transition-[opacity,scale,translate] duration-standard ease-enter data-ending-style:scale-[0.98] data-starting-style:scale-[0.98] data-closed:overflow-hidden data-ending-style:opacity-0 data-starting-style:opacity-0 data-instant:transition-none data-ending-style:duration-[calc(var(--d2)*0.7)] data-nested:duration-quick data-nested:data-ending-style:duration-[calc(var(--d1)*0.7)] ${popupSlideClassName}`; export const menuItemClassName = - "relative flex min-h-9 cursor-default select-none items-center gap-2.5 rounded-md px-2.5 text-ink text-sm outline-hidden data-disabled:pointer-events-none data-highlighted:bg-hover data-inset:ps-9 data-disabled:text-ink-3 data-[variant=destructive]:text-danger-text [&_[data-slot=icon]]:text-ink-2 data-[variant=destructive]:[&_[data-slot=icon]]:text-danger-text [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0"; + "relative flex min-h-9 cursor-default select-none items-center gap-2.5 rounded-md px-2.5 text-ink text-sm outline-hidden data-disabled:pointer-events-none data-highlighted:bg-hover data-inset:ps-9 data-disabled:text-ink-3 data-[variant=destructive]:not-data-disabled:text-danger-text [&_[data-slot=icon]]:text-ink-2 data-disabled:[&_[data-slot=icon]]:text-ink-3 data-[variant=destructive]:not-data-disabled:[&_[data-slot=icon]]:text-danger-text [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0"; export const menuLabelClassName = "px-2.5 pt-2 pb-1 font-semibold text-[12px] text-ink-3 uppercase tracking-[0.02em] data-inset:ps-9";