diff --git a/.claude/agents/code-simplifier.md b/.claude/agents/code-simplifier.md deleted file mode 100644 index 2dfa2039d..000000000 --- a/.claude/agents/code-simplifier.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: code-simplifier -description: Reviews recent code changes and suggests simplifications — reduces complexity, removes dead code, flattens nesting, applies DRY. -tools: Read, Glob, Grep -model: sonnet ---- - -You are a code simplification expert for a WordPress/React plugin. - -## Your Task - -Review the recently changed files and suggest concrete simplifications. Do NOT make changes — only report findings. - -## What to Look For - -### PHP -- Duplicated logic that can be extracted into a shared method -- Deeply nested conditionals that can be flattened with early returns -- Dead code (unused variables, unreachable branches, commented-out code) -- Verbose array/string operations that WordPress has helpers for -- Overly complex conditionals that can be simplified - -### JavaScript/React -- Components doing too much — can they be split? -- Duplicated JSX or logic across components -- State that could be derived instead of stored -- useEffect with dependencies that could be simplified -- Unnecessary re-renders from inline objects/functions in props - -## Output Format - -For each finding: - -``` -### file-path:line-number -**Type:** DRY | Complexity | Dead Code | Optimization -**Current:** Brief description of current code -**Suggestion:** How to simplify (1-2 sentences) -**Impact:** Low | Medium | High -``` - -End with a summary: total findings by type and priority. - -## Rules -- Only report findings with clear, concrete improvements -- No subjective style preferences — only measurable simplifications -- Skip third-party code (`inc/lib/`, `node_modules/`, `vendor/`) -- Be precise with line numbers diff --git a/.claude/agents/srfm-block-checker.md b/.claude/agents/srfm-block-checker.md deleted file mode 100644 index ec7bbf8b9..000000000 --- a/.claude/agents/srfm-block-checker.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -name: srfm-block-checker -description: Audits SureForms block render files for security issues — checks output escaping, input sanitization, ABSPATH guards, and WPCS compliance. -tools: Read, Glob, Grep -model: sonnet ---- - -You are a WordPress security reviewer specialized in Gutenberg block rendering. - -## Your Task - -Audit SureForms block PHP files for common security and quality issues. - -## Files to Check - -1. All block render files: `inc/blocks/*/block.php` -2. All field markup files: `inc/fields/*.php` -3. The base block class: `inc/blocks/base.php` - -## Checklist for Each File - -For every file, check and report: - -### Security -- [ ] **ABSPATH guard** — File starts with `if ( ! defined( 'ABSPATH' ) ) { exit; }` -- [ ] **Output escaping** — All `echo` statements use `esc_html()`, `esc_attr()`, `wp_kses_post()`, or `wp_kses()`. Flag any raw `echo $var` without escaping (note: `// phpcs:ignore` comments may indicate intentional bypass — flag these for review) -- [ ] **Attribute sanitization** — Block attributes accessed from `$attributes` are sanitized before use -- [ ] **No direct `$_GET`/`$_POST`/`$_REQUEST`** — Block render should never read superglobals directly - -### Quality -- [ ] **`@since` tag present** — Class and methods have `@since` docblock tags -- [ ] **Namespace follows convention** — Uses `SRFM\Inc\Blocks\{BlockName}` pattern -- [ ] **Extends Base** — Block class extends `SRFM\Inc\Blocks\Base` -- [ ] **Return type** — `render()` method returns `string|bool` - -## Output Format - -For each file, output: - -``` -### block-name/block.php -- PASS: ABSPATH guard present -- WARN: Line 33 — raw echo with phpcs:ignore, verify markup() output is pre-escaped -- PASS: No superglobals used -- FAIL: Missing @since tag on render() method -``` - -End with a summary table: - -| Block | Security | Quality | Issues | -|-------|----------|---------|--------| -| input | WARN | FAIL | 2 | -| email | PASS | PASS | 0 | - -## Important - -- Be precise — include line numbers for every issue -- Distinguish FAIL (must fix) from WARN (review needed) -- Do NOT suggest code changes — only report findings -- Check ALL block files, not just a sample diff --git a/.claude/commands/sureforms:investigate.md b/.claude/commands/sureforms:investigate.md deleted file mode 100644 index d171756ec..000000000 --- a/.claude/commands/sureforms:investigate.md +++ /dev/null @@ -1,67 +0,0 @@ -# Investigate Issue - -Investigate a reported issue using parallel subagents for speed. - -## Input - -$ARGUMENTS — GitHub issue URL, Jira ticket ID, or a description of the issue. - -If no arguments provided, stop and ask: "Please provide an issue URL, Jira ticket ID, or describe the issue." - -## Step 1 — Read the Issue - -- If a GitHub URL: use `gh issue view` to read the issue -- If a Jira ticket: use the Jira MCP tools to read the ticket -- If a description: use the provided text directly - -Extract: title, description, steps to reproduce, expected vs actual behavior, screenshots, labels. - -## Step 2 — Classify - -Determine the type: -- **Bug** — something is broken, unexpected behavior, error, regression -- **Feature** — new functionality requested -- **Improvement** — enhancement to existing functionality - -Tell the user: "This looks like a **[type]**. Proceeding with [investigation/planning]." - -## Step 3 — Investigate with Subagents - -Use subagents to parallelize the investigation: - -### For Bugs: -Launch these subagents in parallel: -1. **Code Search Agent** — Search the codebase for files related to the bug (grep for keywords, function names, error messages, related hooks/filters) -2. **Test Coverage Agent** — Check if there are existing tests covering this area, identify gaps -3. **Impact Analysis Agent** — Trace all usages of the affected code to understand blast radius - -Once all agents report back, synthesize findings: -- Present the probable root cause with file path and line number -- Show which other areas might be affected -- Suggest a fix with a clear explanation -- Ask the user: "Should I apply this fix?" -- If yes — apply the fix, run linters, and suggest running relevant tests - -### For Features: -1. Enter plan mode -2. Launch subagents in parallel: - - **Pattern Discovery Agent** — Find similar existing features in the codebase to follow the same patterns - - **Impact Analysis Agent** — Identify all files that will need changes -3. Use findings to outline implementation steps -4. Present the plan for approval - -### For Improvements: -1. Launch subagents in parallel: - - **Code Search Agent** — Read the relevant existing code - - **Impact Analysis Agent** — Trace dependencies to understand what might break -2. Suggest the minimal changes needed -3. Ask the user: "Should I implement these changes?" -4. If yes — apply changes and run linters - -## Rules -- Always use subagents for investigation to maximize speed -- Show your reasoning — which files you checked and why -- Be precise with file paths and line numbers -- For bugs, prioritize finding the root cause over applying a quick patch -- Never make changes without asking first -- After any code change, run the verification checklist from CLAUDE.md diff --git a/.claude/commands/sureforms:sync-public.md b/.claude/commands/sureforms:sync-public.md deleted file mode 100644 index f69001d12..000000000 --- a/.claude/commands/sureforms:sync-public.md +++ /dev/null @@ -1,218 +0,0 @@ ---- -allowed-tools: Bash(git:*), Bash(gh:*), Bash(rm:*), Bash(rmdir:*), Bash(mktemp:*), Bash(echo:*), Bash(cd:*), Bash(test:*) -description: Sync private master to the sureforms-public mirror, stripping internal-only paths in one commit ---- - -# SureForms — Sync to Public Mirror - -Sync `brainstormforce/sureforms@master` (private, this repo) to `brainstormforce/sureforms-public@master` (public WordPress.org-facing mirror), stripping internal-only paths in a single follow-up commit on the sync branch. Replaces the previous manual flow (`git push mirror origin/master:sync/master` + `gh pr create`). - -This skill is the **only sanctioned way** to sync the public mirror. Running raw `git push mirror …` skips the strip and re-leaks internal artifacts. - -## Stripped paths (single source of truth) - -Edit this list when the leak surface changes — there is no other place to update. - -``` -.claude -.scripts/git-hooks -internal-docs -CLAUDE.md -ARCHITECTURE.md -COMPREHENSIVE_ANALYSIS.md -PRODUCT_ANALYSIS.md -TECHNICAL_OVERVIEW.md -.github/workflows/push-to-deploy.yml -.github/workflows/push-asset-readme-update.yml -.github/workflows/release-tag-draft.yml -.github/workflows/update-translations.yml -.github/workflows/release-pr-template.yml -bin/build-zip.sh -bin/checkout-and-build -bin/i18n.sh -``` - -These paths must NOT appear on the public mirror. They legitimately exist on private `master` and stay there (internal release CI, AI tooling, internal team wiki). - -## Preconditions - -Working directory: any worktree of this repo. - -Required remotes: -- `origin` → `https://github.com/brainstormforce/sureforms` (private) -- `mirror` → `https://github.com/brainstormforce/sureforms-public` (public) - -Verify with `git remote -v`. Abort if either remote is missing. - -## Instructions - -Follow steps sequentially. If any step fails, jump to **Error Recovery**. - -### Step 1: Record current state - -```bash -ORIGINAL_BRANCH=$(git rev-parse --abbrev-ref HEAD) -HAD_STASH=false -if [ -n "$(git status --porcelain)" ]; then - git stash push -m "sureforms-sync-public auto-stash" - HAD_STASH=true -fi -``` - -### Step 2: Fetch both remotes - -```bash -git fetch origin master -git fetch mirror master sync/master 2>/dev/null || git fetch mirror master -``` - -### Step 3: Detect no-op - -```bash -PRIVATE_TIP=$(git rev-parse origin/master) -PUBLIC_TIP=$(git rev-parse mirror/master) -``` - -If `PRIVATE_TIP` == `PUBLIC_TIP`, report "Public mirror is already up to date with private master — nothing to sync." Run **Step 8 cleanup** and exit. - -Capture the upstream commit range and count for reporting: - -```bash -COMMIT_COUNT=$(git rev-list --count "$PUBLIC_TIP..$PRIVATE_TIP") -``` - -### Step 4: Stage cleaned tree on a temp worktree - -Use a temp worktree so the developer's current working tree is never modified. - -```bash -WORKTREE=$(mktemp -d)/srfm-sync-public -git worktree add "$WORKTREE" "$PRIVATE_TIP" -cd "$WORKTREE" -``` - -### Step 5: Strip internal paths idempotently - -For each path in the **Stripped paths** list above, only act if it exists: - -```bash -for p in \ - .claude \ - .scripts/git-hooks \ - internal-docs \ - CLAUDE.md \ - ARCHITECTURE.md \ - COMPREHENSIVE_ANALYSIS.md \ - PRODUCT_ANALYSIS.md \ - TECHNICAL_OVERVIEW.md \ - .github/workflows/push-to-deploy.yml \ - .github/workflows/push-asset-readme-update.yml \ - .github/workflows/release-tag-draft.yml \ - .github/workflows/update-translations.yml \ - .github/workflows/release-pr-template.yml \ - bin/build-zip.sh \ - bin/checkout-and-build \ - bin/i18n.sh \ -; do - if [ -e "$p" ]; then - git rm -r --quiet "$p" - fi -done - -# Remove now-empty .scripts directory if applicable -if [ -d .scripts ] && [ -z "$(ls -A .scripts 2>/dev/null)" ]; then - rmdir .scripts -fi -``` - -### Step 6: Commit the strip if anything changed - -```bash -STRIPPED=false -if ! git diff --cached --quiet; then - STRIPPED=true - STRIPPED_PATHS=$(git diff --cached --name-only | tr '\n' ' ') - git -c user.name="sureforms-sync" \ - -c user.email="noreply@brainstormforce.com" \ - commit -m "chore: strip internal-only paths from public mirror sync" -fi -``` - -If `STRIPPED=false`, the upstream commits did not touch any internal-only paths — that's fine, just push the unmodified upstream tip. - -### Step 7: Push to `mirror sync/master` - -```bash -git push --force-with-lease mirror HEAD:sync/master -``` - -`--force-with-lease` is used because the strip commit is regenerated on top of each new upstream tip; previous strip commits on `sync/master` are discarded. The `--force-with-lease` flag still refuses if someone else has pushed to `sync/master` in the meantime. - -### Step 8: Open or update the sync PR - -Check whether an open PR already exists from `sync/master` → `master` on `brainstormforce/sureforms-public`: - -```bash -EXISTING_PR=$(gh pr list -R brainstormforce/sureforms-public \ - --base master --head sync/master --state open \ - --json number -q '.[0].number') -``` - -- **If `EXISTING_PR` is non-empty:** the existing PR auto-updates with the new commits (no action needed). Comment on it with a brief refresh note: - - ```bash - gh pr comment "$EXISTING_PR" -R brainstormforce/sureforms-public \ - --body "Refreshed: synced \`$COMMIT_COUNT\` commit(s) from private master ($PUBLIC_TIP..$PRIVATE_TIP). Strip applied: $STRIPPED." - ``` - -- **If `EXISTING_PR` is empty:** open a new PR. - - Title: `Sync master from upstream` - - Body: list the upstream commit range, the commit count, and the strip status. Paste the high-level summary of upstream commits (use `git log --oneline "$PUBLIC_TIP..$PRIVATE_TIP"`) into a "## Highlights" section. Note in the body that the strip commit on top of upstream content is the only public-only change. - - ```bash - gh pr create -R brainstormforce/sureforms-public \ - --base master --head sync/master \ - --title "Sync master from upstream" \ - --body "$PR_BODY" - ``` - -### Step 9: Tear down the temp worktree - -```bash -cd - -git worktree remove --force "$WORKTREE" -``` - -### Step 10: Restore developer state - -```bash -git checkout "$ORIGINAL_BRANCH" -if [ "$HAD_STASH" = "true" ]; then - git stash pop -fi -``` - -## Output to user - -Report at the end: - -- Upstream range: `..` (`$COMMIT_COUNT` commits) -- Whether the strip commit was created (`$STRIPPED`); if true, list the stripped paths -- PR URL — new or existing - -## Error Recovery - -If any step fails: - -1. **`cd` back to the original repo dir** if currently inside `$WORKTREE`. -2. **Remove temp worktree** if it was created: `git worktree remove --force "$WORKTREE"` (ignore errors). -3. **Restore branch and stash** as in Step 10. -4. Surface the failing command and its error to the user — do not retry blindly. - -Common failure modes: - -- **`git push --force-with-lease` rejected** — someone else pushed to `sync/master` since the last fetch. Re-run the skill from Step 2; their changes will be incorporated automatically. -- **`gh pr create` fails with "PR already exists"** — Step 8 detection missed a draft PR. Re-run Step 8 with `--state all` and reuse / reopen the existing PR. -- **No `mirror` remote** — add it and re-run: `git remote add mirror https://github.com/brainstormforce/sureforms-public`. diff --git a/.claude/commands/sureforms:update-readme.md b/.claude/commands/sureforms:update-readme.md deleted file mode 100644 index b3d9d8a6f..000000000 --- a/.claude/commands/sureforms:update-readme.md +++ /dev/null @@ -1,327 +0,0 @@ ---- -description: Audit and update the WordPress.org readme.txt — analyze new features, research competitors, draft changes, and create a PR ---- - -# SureForms readme.txt Update - -Comprehensive audit and update of the `readme.txt` (and `README.md`) for the WordPress.org listing. - -## Arguments - -Parse from: $ARGUMENTS - -Expected format: `[version] [--full]` - -- `version` — optional. Baseline version to analyze changes since (e.g., `2.5.0`). If not provided, auto-detect from the most recent `= X.X.X` changelog header in `readme.txt`. -- `--full` — optional flag. Perform a full rewrite of all sections instead of an incremental update. - -If no arguments are given, auto-detect the baseline and proceed with incremental mode. - -## Working Directory - -All commands and file paths are relative to the sureforms plugin root — the directory containing `sureforms.php`. - ---- - -## Phase 1: Analyze What's New - -### Step 1.1 — Determine Baseline Version - -- If `version` argument was provided, use that as the baseline. -- Otherwise, read the `== Changelog ==` section of `readme.txt`, extract the most recent version header (`= X.X.X - ... =`), and use that version as the baseline. -- Resolve the git tag: `v` (e.g., `v2.5.0`). Verify it exists with `git tag -l "v"`. -- If the tag does not exist, list available tags (`git tag --sort=-version:refname | head -10`) and ask the user to pick one. - -### Step 1.2 — Gather Changes Since Baseline - -Launch **3 Explore subagents in parallel** (single message, 3 Agent tool calls): - -**Agent 1 — Git History Analysis:** -- Run `git log v..HEAD --oneline` to get all commits since the baseline. -- Categorize commits: new features, improvements, bug fixes, refactors. -- Focus on commits touching: `inc/blocks/`, `inc/fields/`, `inc/payments/`, `inc/ai-form-builder/`, `modules/`, `src/blocks/`, `inc/page-builders/`. -- Report: list of significant user-facing changes with commit hashes and affected areas. - -**Agent 2 — Free Codebase Feature Scan:** -- List all blocks in `inc/blocks/` — compare against the readme's "Input Fields" and feature bullets. -- Check `inc/payments/` for payment providers. -- Check `inc/ai-form-builder/` for AI feature updates. -- Check `modules/` for any new modules. -- Check `inc/global-settings/` for new settings sections. -- Check `inc/rest-api.php` for new REST endpoints. -- Check `inc/page-builders/` for page builder compatibility additions. -- Report: features present in code but missing from readme. - -**Agent 3 — Pro Codebase Feature Scan:** -- Check `../sureforms-pro/inc/pro/native-integrations/integrations/` — list ALL integration JSON files and compare against the readme's integration list. -- Check `../sureforms-pro/inc/blocks/` for pro-only blocks. -- Check `../sureforms-pro/inc/pro/` subdirectories for pro features (conversational-form, save-resume, signature, zapier, etc.). -- Check `../sureforms-pro/inc/extensions/` for conditional logic, field-restrictions, etc. -- If `../sureforms-pro/` does not exist, skip this agent and warn: "Pro plugin not found. Only free features will be analyzed." -- Report: pro features/integrations present in code but missing from readme. - -### Step 1.3 — Present Gap Analysis - -Merge all agent results and present a table: - -``` -┌─────────────────────────────────────┬────────┬──────────────────────────────┐ -│ Area │ Status │ Details │ -├─────────────────────────────────────┼────────┼──────────────────────────────┤ -│ Free field types match readme │ ✅/❌ │ Code: N, Readme: M │ -│ Pro blocks mentioned │ ✅/❌ │ Missing: ... │ -│ Integration list up to date │ ✅/❌ │ Missing: ... │ -│ Pro features all listed │ ✅/❌ │ Missing: ... │ -│ Payment providers accurate │ ✅/❌ │ │ -│ Page builder compat listed │ ✅/❌ │ │ -│ "Tested up to" WP version │ ✅/❌ │ Readme: X.X, Current: Y.Y │ -│ New features since v │ ℹ️ │ N features found │ -└─────────────────────────────────────┴────────┴──────────────────────────────┘ -``` - -Tell the user: "Phase 1 complete. Found **N gaps** and **M new features** to incorporate. Proceeding to competitor research." - ---- - -## Phase 2: Competitor & Market Research - -### Step 2.1 — Research Competitor READMEs - -Use **WebSearch** to run these searches in parallel: - -1. `"WPForms" site:wordpress.org/plugins description features` -2. `"Gravity Forms" site:wordpress.org/plugins description features` -3. `"Fluent Forms" site:wordpress.org/plugins fluentform features` -4. `"Formidable Forms" site:wordpress.org/plugins description features` -5. `"Contact Form 7" site:wordpress.org/plugins description` -6. `"WordPress.org readme.txt best practices 2025 2026"` - -For each competitor, use **WebFetch** on the top result URL if needed to extract: -- How they structure feature lists -- Marketing language and benefit-focused copy -- How they distinguish free vs pro features -- FAQ structure and common questions -- Trust signals (install counts, star ratings, testimonials) - -### Step 2.2 — Present Research Summary - -Show a comparison table: - -``` -Feature Highlighted by Competitors │ SureForms Has It? │ In Readme? -──────────────────────────────────────┼───────────────────┼────────── -Conditional Logic │ ✅ (Pro) │ ✅/❌ -File Upload │ ✅ (Pro) │ ✅/❌ -Drag & Drop Builder │ ✅ (Free) │ ✅/❌ -... │ │ -``` - -Also note: -- SEO-relevant keywords competitors use that SureForms is missing. -- Structural patterns that work well (comparison tables, benefit-focused headers). -- Any WordPress.org formatting trends. - -Tell the user: "Phase 2 complete. Ready to draft the update. Shall I proceed?" - -**⏸️ WAIT for user confirmation before proceeding to Phase 3.** - ---- - -## Phase 3: Draft the Update - -### Step 3.1 — Determine Scope - -- If `--full` flag was passed: draft ALL sections from scratch. -- Otherwise: draft only sections that need changes based on Phase 1 and Phase 2 findings. - -### Step 3.2 — Draft Each Section - -For each section that needs updating, present in this format: - -``` -━━━ SECTION: [Section Name] ━━━ - -── CURRENT ── -[Current text from readme.txt, abbreviated if very long] - -── PROPOSED ── -[New text] - -── CHANGES ── -• Added: [what was added] -• Removed: [what was removed, if any] -• Reworded: [what was reworded and why] -``` - -Sections to evaluate (in order): - -1. **Plugin header** — Stable tag, Tested up to, Tags (optimize for WordPress.org search) -2. **Short description** — Must be under 150 characters. Make it compelling and keyword-rich. -3. **Long description** — Feature bullets, AI section, payment section, field types list -4. **Premium features section** — Integration list, pro-only features, pro field types -5. **FAQ** — Add questions for new features, update outdated answers -6. **3rd Party Services** — Add any new external services used -7. **Compatibility lists** — Themes and plugins - -### Step 3.3 — WordPress.org Compliance Check - -Verify the draft against WordPress.org readme standards: -- ✅ Short description is under 150 characters -- ✅ No disallowed HTML in description -- ✅ `== Changelog ==` section exists and is properly formatted -- ✅ `== Frequently Asked Questions ==` uses correct `= Question =` format -- ✅ No broken markdown that WordPress.org would render incorrectly -- ✅ Stable tag matches the version in the main plugin file - -### Step 3.4 — Present Full Draft - -Present all drafted sections together with a summary: - -``` -📋 Readme Update Summary -───────────────────────────────────── -Sections modified: N -Lines added: +X -Lines removed: -Y -New features listed: Z -New integrations: W -New FAQ entries: Q -WP.org compliance: ✅ All checks pass -``` - -Tell the user: "Please review the draft above. You can: -1. **Approve** — proceed to apply changes and create PR -2. **Request edits** — tell me what to change -3. **Abort** — cancel the update" - -**⏸️ WAIT for explicit user approval. Do NOT proceed without it.** - ---- - -## Phase 4: User Review & Iteration - -This phase is a loop: - -1. If user **requests edits** → apply them to the draft and re-present the affected sections. Ask again for approval. -2. If user **approves** → proceed to Phase 5. -3. If user **aborts** → stop and report "Readme update cancelled. No changes were made." - ---- - -## Phase 5: Apply & Create PR - -### Step 5.1 — Create Branch - -```bash -git fetch origin -git checkout dev -git pull origin dev -git checkout -b chore/update-readme -``` - -If `chore/update-readme` already exists, append a date suffix: `chore/update-readme-YYYYMMDD`. - -### Step 5.2 — Apply Changes - -Edit `readme.txt` with the approved draft changes. Apply section by section — do NOT rewrite sections that weren't modified. - -### Step 5.3 — Regenerate README.md - -```bash -npx grunt readme -``` - -Verify `README.md` was updated. If `grunt readme` fails, check that `npm install` has been run and `grunt-wp-readme-to-markdown` is in `devDependencies`. - -### Step 5.4 — Verify - -Read the updated `readme.txt` and confirm: -- Stable tag matches current plugin version -- Tested up to is correct -- Short description is under 150 characters -- All sections are properly formatted -- No stray draft markers or debug text - -### Step 5.5 — Commit and Push - -```bash -git add readme.txt README.md -git commit -m "chore: update readme.txt for WordPress.org listing - -Update plugin description, feature lists, integrations, FAQ, -and compatibility information to reflect current capabilities. - -Co-Authored-By: Claude Opus 4.6 (1M context) " -git push -u origin chore/update-readme -``` - -### Step 5.6 — Create PR - -```bash -gh pr create \ - --title "chore: Update readme.txt for WordPress.org" \ - --base dev \ - --body "$(cat <<'EOF' -## Summary -- Updated readme.txt to reflect current plugin capabilities -- Regenerated README.md via `grunt readme` - -## What Changed -[List each section that was modified and what changed] - -## Research Notes -- Competitor READMEs reviewed: WPForms, Gravity Forms, Fluent Forms, Formidable, CF7 -- Gaps identified and addressed: [count] - -## Test Plan -- [ ] Preview on WordPress.org readme validator -- [ ] Verify all links in the readme are working -- [ ] Confirm feature claims match actual plugin capabilities -- [ ] Verify short description is under 150 characters - -🤖 Generated with [Claude Code](https://claude.com/claude-code) -EOF -)" -``` - -### Step 5.7 — Final Report - -``` -✅ Readme Update Complete -───────────────────────────────────────── -✅ Phase 1: Gap analysis complete -✅ Phase 2: Competitor research complete -✅ Phase 3: Draft created -✅ Phase 4: User review passed -✅ Phase 5: Changes applied -✅ Branch: chore/update-readme (from dev) -✅ readme.txt updated -✅ README.md regenerated -✅ PR: - -Sections updated: - • [List each modified section] -``` - ---- - -## Rules - -- **NEVER modify readme.txt without user approval.** Always present the full draft first. -- **NEVER invent features.** Only document what actually exists in the codebase. -- **NEVER modify changelog entries.** The changelog is managed by `/sureforms:version-bump`. -- **ALWAYS branch from `dev`**, never from `master` or `next-release`. -- **ALWAYS run `npx grunt readme`** after modifying `readme.txt` to regenerate `README.md`. -- **ALWAYS verify feature claims** by checking the actual codebase, not just commit messages. -- **Keep the 150-character limit** for the WordPress.org short description. -- **Maintain the existing voice and tone** — professional, benefit-focused, not overly salesy. - -## Error Recovery - -| Symptom | Fix | -|---------|-----| -| `grunt readme` fails | Run `npm install` first; verify `grunt-wp-readme-to-markdown` is in `devDependencies` | -| Branch already exists | Append date suffix: `chore/update-readme-YYYYMMDD` | -| Pro plugin not found at `../sureforms-pro/` | Skip pro analysis, warn user, document only free features | -| Git tag not found | List available tags and ask user to pick one | -| WebSearch unavailable | Skip Phase 2, proceed with codebase analysis only, note the limitation | diff --git a/.claude/commands/sureforms:version-bump.md b/.claude/commands/sureforms:version-bump.md deleted file mode 100644 index 5f48a2e1f..000000000 --- a/.claude/commands/sureforms:version-bump.md +++ /dev/null @@ -1,204 +0,0 @@ -# SureForms Release Version Bump - -Automates the SureForms version bump release checklist end-to-end. - -## Arguments - -Parse from: $ARGUMENTS - -Expected format: ` [pro-version] [branch]` - -- `version` — **required**. Version number to release (e.g., `2.5.2`). If not provided, stop immediately and tell the user: `"Version number is required. Usage: /sureforms:version-bump [pro-version] [branch]"` -- `pro-version` — optional. Version to set for `SRFM_PRO_RECOMMENDED_VER`. If not provided, ask: `"What should SRFM_PRO_RECOMMENDED_VER be set to? (default: )"` and default to the core version if the user presses Enter or skips. -- `branch` — optional. Source branch to cut from — must be `dev` or `next-release`. Default: `next-release`. - -## Working Directory - -All commands and file paths are relative to the sureforms plugin root. Detect it as the directory containing `sureforms.php` — typically the current working directory or a `sureforms/` subdirectory of it. - ---- - -## Steps - -### Step 1 — Validate Arguments - -- Extract `version`, `pro-version`, and `branch` from `$ARGUMENTS`. -- Abort with usage message if `version` is missing. -- If `branch` is provided but not `dev` or `next-release`, abort: `"Invalid branch. Must be 'dev' or 'next-release'."` -- If `pro-version` was not passed as an argument, prompt the user for it (default: same as `version`). - ---- - -### Step 2 — Create Version Bump Branch - -Run from the sureforms plugin root: - -```bash -git fetch origin -git checkout -git pull origin -git checkout -b version-bump- -``` - -Confirm the new branch was created successfully before continuing. - ---- - -### Step 3 — Run Grunt Version Bump - -```bash -npx grunt version-bump --ver= -``` - -This runs `bumpup` (updates `package.json`) and `replace` (updates version strings in `readme.txt` and `sureforms.php`). - ---- - -### Step 4 — Verify package.json and package-lock.json - -- Read `package.json` → confirm `"version"` equals ``. -- Read `package-lock.json` → confirm the top-level `"version"` and `packages[""].version` both equal ``. -- If `package-lock.json` is out of sync, patch **only** the two version string values — do not alter any whitespace, indentation, line endings, or surrounding characters: - - Top-level: replace only the value in `"version": ""` → `"version": ""` - - Inside `"packages": { "": { ... } }`: replace only the value in `"version": ""` → `"version": ""` - - The resulting diff must show **exactly 2 lines changed** — only the version string on each line. No other bytes in the file should change. - - Do **not** run `npm install` — dependency conflicts can cause it to fail and it is not needed for this change. - ---- - -### Step 5 — Verify readme.txt — Stable tag - -- Read `readme.txt` and confirm `Stable tag: `. -- If incorrect, edit the line to the correct value. - ---- - -### Step 6 — Verify readme.txt — Tested up to - -- Fetch the latest WordPress version by running: - ```bash - curl -s "https://api.wordpress.org/core/version-check/1.7/" | grep -o '"version":"[^"]*"' | head -1 | cut -d'"' -f4 - ``` -- Store the result as ``. -- Read `readme.txt` and check the current `Tested up to:` value. -- If it does **not** match ``, update the line to `Tested up to: `. -- Confirm the final value in the file after any edit. - ---- - -### Step 7 — Verify sureforms.php — Plugin Header Version - -- Read `sureforms.php` lines 1–15. -- Confirm `Version: ` in the plugin header comment. -- If incorrect, edit to the correct value. - ---- - -### Step 8 — Verify SRFM_VER - -- Confirm `define( 'SRFM_VER', '' );` in `sureforms.php`. -- If incorrect, edit to the correct value. - ---- - -### Step 9 — Verify SRFM_PRO_RECOMMENDED_VER - -- Confirm `define( 'SRFM_PRO_RECOMMENDED_VER', '' );` in `sureforms.php`. -- If incorrect, edit to the correct value. - ---- - -### Step 10 — Verify Changelog Entry in readme.txt - -- Read the `== Changelog ==` section of `readme.txt`. -- **Check for a placeholder entry** matching `= x.x.x =` (case-insensitive): - - If **found**: ask the user: `"What is the release date for ? (e.g. 19th February 2026)"`. Replace the placeholder header with `= - =`, matching the exact formatting of existing changelog entries (spaces around the `=`, date style matching what is already present). -- **Check for an entry** matching `= -`: - - If **missing** after the above: warn the user and **pause** — they must add a changelog entry for `` before the process can continue. The expected format is: - ``` - = - DD Month YYYY = - * New: ... - * Improvement: ... - * Fix: ... - ``` - - If **found**: confirm the date is present and the format matches SureForms standards. -- **Polish each bullet line** of the `` entry: - - Fix any grammatical or spelling errors. - - Rewrite passive or vague phrasing into clear, active, benefit-led language (e.g. "Fixed bug where X" → "Fix: Resolved an issue where X to ensure Y"). - - Keep the improvements **subtle and factual** — do not invent features or exaggerate. The prefix (`New:`, `Improvement:`, `Fix:`) must stay unchanged. - - Show the user a before/after diff of any lines you changed and ask for confirmation before writing. -- Then sort the bullet lines of the `` entry so they follow this group order: - 1. `* New:` lines - 2. `* Improvement:` lines - 3. `* Fix:` lines - 4. Any other prefixes come last -- Within each group, sort lines **alphabetically** (case-insensitive) by the text that follows the prefix. -- Write the re-ordered lines back to `readme.txt` if any reordering was needed, and report whether changes were made. - ---- - -### Step 11 — Trim Changelog to 3 Entries - -- Parse the `== Changelog ==` section of `readme.txt` to identify all version entries (lines matching `= X.X.X - ...=`). -- Keep only the **3 most recent** entries (the new `` entry plus the 2 entries immediately before it), including all their bullet lines. -- Remove all older entries that follow the 3rd entry, up to but not including the next `==` section header. -- Write the trimmed content back to `readme.txt`. -- Report how many entries were removed (e.g., "Removed 4 old changelog entries"). - ---- - -### Step 12 — Generate README.md - -```bash -npx grunt readme -``` - ---- - -### Step 13 — Generate POT File - -```bash -npm run makepot -``` - ---- - -### Step 14 — Commit and Open PR - -```bash -git add -A -git commit -m "Version Bump " -git push origin version-bump- -gh pr create \ - --repo brainstormforce/sureforms \ - --title "Version Bump " \ - --base \ - --label "Release PR,skip-title-check" -``` - ---- - -### Step 15 — Final Report - -Print a status summary for every step, then the PR URL: - -``` -Release Bump: -───────────────────────────────────────── -✅ Branch created: version-bump- (from ) -✅ grunt version-bump: completed -✅ package.json: -✅ package-lock.json: -✅ readme.txt Stable tag: -✅ readme.txt Tested up to: -✅ sureforms.php Version: -✅ SRFM_VER: -✅ SRFM_PRO_RECOMMENDED_VER: -✅ Changelog entry polished, confirmed, and sorted (New → Improvement → Fix, alphabetical within groups) -✅ Changelog trimmed to 3 entries (N removed) -✅ README.md generated -✅ POT file generated -✅ PR opened: -``` - -If any step failed (❌) or needs attention (⚠️), list the required actions at the bottom. diff --git a/.claude/commands/sync-release-branches.md b/.claude/commands/sync-release-branches.md deleted file mode 100644 index 210f07139..000000000 --- a/.claude/commands/sync-release-branches.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -allowed-tools: Bash(git:*) -auto-approve: true -description: Sync master into dev and dev into next-release after a release ---- - -# Sync Release Branches - -After a release, sync the three main branches: master → dev → next-release. - -## Instructions - -Follow these steps sequentially. If any step fails, jump to the Error Recovery section. - -### Step 1: Record current state - -1. Record the current branch: -```bash -git rev-parse --abbrev-ref HEAD -``` -Store this as ORIGINAL_BRANCH. - -2. Check for uncommitted changes: -```bash -git status --porcelain -``` -If there is ANY output, stash the changes: -```bash -git stash -``` -Store HAD_STASH=true. Otherwise HAD_STASH=false. - -### Step 2: Fetch latest from remote - -```bash -git fetch origin -``` - -### Step 3: Update master - -```bash -git checkout master -git pull origin master -``` - -### Step 4: Merge master into dev - -```bash -git checkout dev -git pull origin dev -git pull origin master -``` - -If there are merge conflicts, STOP. Tell the user: "Merge conflicts while merging master into dev. Please resolve them manually." List the conflicting files. - -If merge succeeds: -```bash -git push origin dev -``` - -### Step 5: Merge dev into next-release - -```bash -git checkout next-release -git pull origin next-release -git pull origin dev -``` - -If there are merge conflicts, STOP. Tell the user: "Merge conflicts while merging dev into next-release. Please resolve them manually." List the conflicting files. - -If merge succeeds: -```bash -git push origin next-release -``` - -### Step 6: Return to original branch - -```bash -git checkout ${ORIGINAL_BRANCH} -``` - -If HAD_STASH=true: -```bash -git stash pop -``` - -Report success: "Branch sync complete. master → dev → next-release are now in sync." - -## Error Recovery - -If any step fails after switching branches: -1. Switch back to original branch: `git checkout ${ORIGINAL_BRANCH}` -2. Restore stash if needed: `git stash pop` (only if HAD_STASH=true) -3. Report the error to the user. - -NEVER force-push. If a merge has conflicts, stop and let the user resolve them. diff --git a/.claude/settings.json b/.claude/settings.json deleted file mode 100644 index 02b620f27..000000000 --- a/.claude/settings.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "hooks": { - "PreToolUse": [ - { - "matcher": "Bash", - "hooks": [ - { - "type": "command", - "command": "if echo \"$CLAUDE_BASH_COMMAND\" | grep -q '^git commit'; then echo '--- PreCommit: Running checks ---' && composer lint 2>&1 | tail -5 && composer phpstan 2>&1 | tail -5 && composer insights 2>&1 | tail -5; fi" - } - ] - } - ], - "PostToolUse": [ - { - "matcher": "Write|Edit", - "hooks": [ - { - "type": "command", - "command": "case \"$CLAUDE_FILE_PATH\" in *.php) vendor/bin/phpcbf \"$CLAUDE_FILE_PATH\" 2>/dev/null || true;; *.js|*.jsx) npx wp-scripts lint-js --fix \"$CLAUDE_FILE_PATH\" 2>/dev/null || true;; *.scss|*.css) npx wp-scripts lint-style --fix \"$CLAUDE_FILE_PATH\" 2>/dev/null || true;; esac" - } - ] - } - ] - }, - "permissions": { - "allow": [ - "Bash(npm run lint-js*)", - "Bash(npm run lint-css*)", - "Bash(npm run pretty*)", - "Bash(npm run build*)", - "Bash(npm run start)", - "Bash(npm run test:unit)", - "Bash(npm run test:e2e)", - "Bash(npm run play:*)", - "Bash(npm run makepot)", - "Bash(npm run i18n:*)", - "Bash(composer lint*)", - "Bash(composer format*)", - "Bash(composer test*)", - "Bash(composer phpstan*)", - "Bash(composer insights*)", - "Bash(npx playwright test*)", - "Bash(npx grunt *)", - "Bash(composer install*)", - "Bash(npm install*)", - "Bash(curl *)", - "Bash(git status*)", - "Bash(git diff*)", - "Bash(git log*)", - "Bash(git branch*)", - "Bash(git show*)", - "Bash(git stash*)", - "Bash(git checkout*)", - "Bash(git add*)", - "Bash(git commit*)", - "Bash(git merge*)", - "Bash(git rebase*)", - "Bash(git fetch*)", - "Bash(git pull*)", - "Bash(gh pr *)", - "Bash(gh issue *)", - "Bash(gh api *)", - "Bash(ls *)", - "Bash(wc *)", - "Bash(which *)", - "Bash(node -e *)", - "Bash(php -r *)", - "Bash(wp *)" - ], - "deny": [] - } -} diff --git a/.github/workflows/push-asset-readme-update.yml b/.github/workflows/push-asset-readme-update.yml deleted file mode 100644 index e2d2932be..000000000 --- a/.github/workflows/push-asset-readme-update.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Plugin asset/readme update -on: - push: - branches: - - master - paths: - - 'readme.txt' - - '.wordpress-org/**' -jobs: - master: - name: Push to main - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@master - - name: Build - run: | - npm install --force - npm run build - - name: WordPress.org plugin asset/readme update - uses: 10up/action-wordpress-plugin-asset-update@stable - env: - SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} - SVN_USERNAME: ${{ secrets.SVN_USERNAME }} diff --git a/.github/workflows/push-to-deploy.yml b/.github/workflows/push-to-deploy.yml deleted file mode 100644 index 039c0107b..000000000 --- a/.github/workflows/push-to-deploy.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Deploy to WordPress.org -on: - release: - types: [published] -jobs: - tag: - name: New tag - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@master - - name: Build - run: | - npm install --force - npm run build - - name: WordPress Plugin Deploy - uses: 10up/action-wordpress-plugin-deploy@master - env: - SVN_USERNAME: ${{ secrets.SVN_USERNAME }} - SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} diff --git a/.github/workflows/release-pr-template.yml b/.github/workflows/release-pr-template.yml deleted file mode 100644 index b296fcd31..000000000 --- a/.github/workflows/release-pr-template.yml +++ /dev/null @@ -1,41 +0,0 @@ - -name: Update checklist for Release PR - -on: - pull_request: - types: [ labeled ] - -jobs: - update_pr: - name: Update checklist for Release PR - if: ${{ github.event.label.name == 'Release PR' }} - runs-on: ubuntu-latest - steps: - - name: Check Branch - id: check-branch - run: | - if [[ ${{ github.base_ref }} == master || ${{ github.base_ref }} == dev || ${{ github.base_ref }} == next-release ]]; then - echo ::set-output name=match::true - fi - - uses: tzkhan/pr-update-action@v2 - if: steps.check-branch.outputs.match == 'true' - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" - base-branch-regex: '[A-Za-z\d-_.\\/]+' - head-branch-regex: '[A-Za-z\d-_.\\/]+' - body-template: | - --- - ### Release Checklist: - - [ ] Run to update version number : `grunt version-bump --ver=` - - [ ] Verify the version number in `package.json` and `package-lock.json` - - [ ] Verify `Stable tag` is `` in readme.txt - - [ ] Verify `Tested upto` is set to latest tested version of WordPress - - [ ] Update version in `sureforms.php` in plugin description - - [ ] Verify constant `SRFM_VER` in `sureforms.php` with latest version of SureForms - - [ ] Verify constant `SRFM_PRO_RECOMMENDED_VER` in `sureforms.php` with compatible version of SureForms Pro - - [ ] Verify changelog `date` and `content` as per SureForms standards - - [ ] Generate README.md : `grunt readme` - - [ ] Generate POT file : `npm run makepot` - --- - body-update-action: 'suffix' - body-uppercase-base-match: false diff --git a/.github/workflows/release-tag-draft.yml b/.github/workflows/release-tag-draft.yml deleted file mode 100644 index 03eaa5748..000000000 --- a/.github/workflows/release-tag-draft.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Create a release tag - -on: - push: - branches: - - master - paths: - # Release happens only if the version number in main file is updated. - - 'sureforms.php' - -jobs: - build-artifact: - name: Build Release Artifact - runs-on: ubuntu-22.04 - outputs: - current_version: ${{ steps.get_version.outputs.current_version }} - steps: - - name: Checkout code - uses: actions/checkout@v6 - with: - ref: master - - - name: Initialize mandatory git config - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Compute current version - id: get_version - run: | - CURRENT_VERSION=$(jq --raw-output '.version' package.json) - echo "current_version=${CURRENT_VERSION}" >> $GITHUB_OUTPUT - - - name: Install Node.js and npm - uses: actions/setup-node@v6 - with: - node-version: '20.20.1' - cache: 'npm' - - - name: Install dependencies - run: npm ci --legacy-peer-deps - - - name: Build - run: npm run build - - - name: Build plugin ZIP file - run: bash ./bin/build-zip.sh - - - name: Upload artifact - uses: actions/upload-artifact@v7 - with: - name: sureforms-plugin - path: ./artifact/sureforms.zip - - create-release: - name: Create Release Draft and Attach Asset - needs: [build-artifact] - runs-on: ubuntu-latest - steps: - - name: Set Release Version - id: get_release_version - env: - VERSION: ${{ needs.build-artifact.outputs.current_version }} - run: echo "version=$(echo $VERSION | cut -d / -f 3 | sed 's/-rc./ RC/' )" >> $GITHUB_OUTPUT - - - name: Download Plugin Zip Artifact - uses: actions/download-artifact@v8 - with: - name: sureforms-plugin - - - name: Create Release Draft - id: create_release - uses: softprops/action-gh-release@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - name: Version ${{ steps.get_release_version.outputs.version }} - tag_name: "v${{ steps.get_release_version.outputs.version }}" - target_commitish: master - draft: true - prerelease: false - body: 'Replace changelog here' - files: ./sureforms.zip diff --git a/.github/workflows/update-translations.yml b/.github/workflows/update-translations.yml deleted file mode 100644 index 9bd4d3562..000000000 --- a/.github/workflows/update-translations.yml +++ /dev/null @@ -1,176 +0,0 @@ -name: Update Translations - -on: - issue_comment: - types: [created] - -# Only allow one i18n job per PR at a time. -concurrency: - group: i18n-${{ github.event.issue.number }} - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - issues: write - -jobs: - i18n: - if: | - github.event.comment.body == '/i18n' && - github.event.issue.pull_request != null - runs-on: ubuntu-latest - - steps: - # Acknowledge the command with a reaction - - name: Add reaction to comment - uses: peter-evans/create-or-update-comment@v5 - with: - comment-id: ${{ github.event.comment.id }} - reactions: rocket - - # Get PR metadata (head branch, fork detection) - - name: Get PR details - id: pr - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - PR_JSON=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.issue.number }}) - HEAD_REF=$(echo "$PR_JSON" | jq -r '.head.ref') - HEAD_REPO=$(echo "$PR_JSON" | jq -r '.head.repo.full_name') - IS_FORK=$(echo "$PR_JSON" | jq -r '.head.repo.full_name != .base.repo.full_name') - - echo "head_ref=$HEAD_REF" >> "$GITHUB_OUTPUT" - echo "head_repo=$HEAD_REPO" >> "$GITHUB_OUTPUT" - echo "is_fork=$IS_FORK" >> "$GITHUB_OUTPUT" - - # Block fork PRs — secrets are not available - - name: Block fork PRs - if: steps.pr.outputs.is_fork == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh pr comment "${{ github.event.issue.number }}" \ - --repo "${{ github.repository }}" \ - --body "**i18n update skipped**: This PR is from a fork. Translation updates require repository secrets and cannot run on fork PRs." - exit 1 - - # Notify that the workflow has started - - name: Comment starting - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh pr comment "${{ github.event.issue.number }}" \ - --repo "${{ github.repository }}" \ - --body "**Translations update started** :hourglass_flowing_sand: - Building and generating translations for 7 languages (nl, fr, de, es, it, pt, pl)... - [View workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" - - # Checkout the actual PR branch (not default branch) - - name: Checkout PR branch - uses: actions/checkout@v6 - with: - ref: ${{ steps.pr.outputs.head_ref }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Node.js - uses: actions/setup-node@v6 - with: - node-version: '20.20.1' - cache: 'npm' - - - name: Install WP-CLI - run: | - curl -sSfL -o wp-cli.phar https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar - chmod +x wp-cli.phar - sudo mv wp-cli.phar /usr/local/bin/wp - wp --info - - - name: Install dependencies - run: npm ci --legacy-peer-deps - - # Build first so makepot picks up all the latest strings - - name: Build - run: npm run build - - # Run the full i18n pipeline (makepot -> po -> gpt-translate -> mo -> json) - - name: Run i18n script - env: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - run: | - set -euo pipefail - bash bin/i18n.sh - - # Check if any files changed - - name: Check for changes - id: changes - run: | - if git diff --quiet; then - echo "changed=false" >> "$GITHUB_OUTPUT" - else - echo "changed=true" >> "$GITHUB_OUTPUT" - CHANGED_FILES=$(git diff --name-only | wc -l | tr -d ' ') - echo "file_count=$CHANGED_FILES" >> "$GITHUB_OUTPUT" - fi - - # Create a separate branch, commit, push, and open a PR - - name: Commit, push, and create PR - if: steps.changes.outputs.changed == 'true' - id: create_pr - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - BRANCH="i18n/${{ steps.pr.outputs.head_ref }}" - git checkout -b "$BRANCH" - git add . - git commit -m "chore: update i18n translations - - Auto-generated by /i18n command on PR #${{ github.event.issue.number }}" - git push origin "$BRANCH" - - PR_URL=$(gh pr create \ - --title "chore: update i18n translations" \ - --body "This PR updates translation files for 7 languages (nl, fr, de, es, it, pt, pl). - - Triggered by \`/i18n\` command on #${{ github.event.issue.number }}." \ - --base "${{ steps.pr.outputs.head_ref }}" \ - --head "$BRANCH") - - echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT" - - # Comment on the original PR with a link to the translations PR - - name: Comment success - if: steps.changes.outputs.changed == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh pr comment "${{ github.event.issue.number }}" \ - --repo "${{ github.repository }}" \ - --body "**Translations PR created** :white_check_mark: - ${{ steps.changes.outputs.file_count }} files changed across 7 languages. - Review and merge: ${{ steps.create_pr.outputs.pr_url }}" - - - name: Comment no changes - if: steps.changes.outputs.changed == 'false' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh pr comment "${{ github.event.issue.number }}" \ - --repo "${{ github.repository }}" \ - --body "**No translation changes** :white_check_mark: - All translation files are already up to date." - - # On any failure, comment with a link to the logs - - name: Comment failure - if: failure() - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh pr comment "${{ github.event.issue.number }}" \ - --repo "${{ github.repository }}" \ - --body "**Translation update failed** :x: - [View workflow logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details." diff --git a/.scripts/git-hooks/pre-commit b/.scripts/git-hooks/pre-commit deleted file mode 100644 index ce0ba23ea..000000000 --- a/.scripts/git-hooks/pre-commit +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/sh - -# Check PHPCS before commit -# Ref - -# https://github.com/smgladkovskiy/phpcs-git-pre-commit/blob/master/src/pre-commit -# https://dev.to/akdevcraft/git-pre-hook-pre-commit-hook-with-npm-project-44p2 - -echo "***** Running pre-commit ******" - -PROJECT=$(php -r "echo dirname(dirname(dirname(realpath('$0'))));") -STAGED_FILES_CMD=$(git diff --cached --name-only --diff-filter=ACMR HEAD | grep \\.php) -UNSTAGED_FILES_CMD=$(git diff --name-only --diff-filter=ACMR | grep \\.php) - -# Determine if a file list is passed -if [ "$#" -eq 1 ] -then - oIFS=$IFS - IFS=' - ' - SFILES="$1" - IFS=$oIFS -fi - -SFILES=${SFILES:-$STAGED_FILES_CMD} - -STAGED_BUT_MODIFIED_FILES=$(php -r "\$sfiles=(explode(\"\\n\", '$SFILES'));\$usfiles=(explode(\"\\n\", '$UNSTAGED_FILES_CMD'));echo implode(\"\\n\",array_intersect(\$usfiles,\$sfiles));") - -if [ -z "$STAGED_BUT_MODIFIED_FILES" ]; then - echo "OK" -else - echo "Files staged but then modified:\n" - echo "${STAGED_BUT_MODIFIED_FILES}" - exit 1 -fi - -# echo $PROJECT -# echo $SFILES - -echo "Checking files for PHP Lint..." -for FILE in $SFILES -do - # echo "$PROJECT/$FILE" - php -l -d display_errors=0 "./$FILE" - if [ $? != 0 ] - then - echo "Fix the error before commit." - exit 1 - fi - FILES="$FILES ./$FILE" -done - -if [ "$FILES" = "" ] -then - echo "All good..." - exit 0 -fi - -if [ "$FILES" != "" ] -then - echo "Running PHPCS (Code Sniffer) Check..." - composer lint -n $FILES - if [ $? != 0 ] - then - echo "Please fix the PHPCS errors before commit!" - echo " => Run this command for automatic fixes." - echo " composer format-- $FILES" - exit 1 - fi -fi - -if [ "$FILES" != "" ] -then - echo "Running PHPStan Check..." - composer phpstan - if [ $? != 0 ] - then - echo "Please fix the PHPStan errors before commit!" - echo " => Run this command to check PHPStan errors." - echo " composer phpstan" - exit 1 - fi -fi - -if [ "$FILES" != "" ] -then - echo "Running CSS linting issues..." - npm run lint-css - if [ $? != 0 ] - then - echo "Please fix the CSS issues before commit!" - exit 1 - fi -fi - -if [ "$FILES" != "" ] -then - echo "Running JS linting issues..." - npm run lint-js - if [ $? != 0 ] - then - echo "Please fix the JS issues before commit!" - exit 1 - fi -fi - -exit $? diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md deleted file mode 100644 index 2afeea1d5..000000000 --- a/ARCHITECTURE.md +++ /dev/null @@ -1,355 +0,0 @@ -# SureForms Architecture Documentation - -## Table of Contents - -1. [Introduction](#introduction) -2. [System Architecture](#system-architecture) -3. [Core Components](#core-components) -4. [Data Flow](#data-flow) -5. [Form Building Process](#form-building-process) -6. [AI Integration](#ai-integration) -7. [Form Submission and Processing](#form-submission-and-processing) -8. [Security Features](#security-features) -9. [Extension Points](#extension-points) -10. [Technical Debt and Improvement Areas](#technical-debt-and-improvement-areas) -11. [Development Guidelines](#development-guidelines) - -## Introduction - -SureForms is a modern WordPress form builder plugin designed to provide an intuitive, no-code form building experience. It leverages WordPress's native block editor (Gutenberg) to create a seamless form building experience that integrates naturally with the WordPress ecosystem. - -### Key Features - -- **Native WordPress Integration**: Built on top of the WordPress block editor -- **AI-Powered Form Generation**: Create forms quickly using AI suggestions -- **No-Code Flexibility**: Advanced features without requiring coding knowledge -- **Mobile-First Design**: Responsive forms that work across all devices -- **Modern UI/UX**: Clean, intuitive interface for both admins and users -- **Security Features**: Anti-spam protection, GDPR compliance, and data security -- **Extensibility**: Developer-friendly architecture with hooks and filters - -## System Architecture - -SureForms follows a modular architecture pattern, separating concerns into distinct components that interact through well-defined interfaces. - -```mermaid -graph TD - A[WordPress Core] --> B[SureForms Plugin] - B --> C[Admin Interface] - B --> D[Form Builder] - B --> E[Form Renderer] - B --> F[Form Processor] - B --> G[Database Layer] - B --> H[AI Integration] - - C --> I[Settings Management] - C --> J[Form Management] - C --> K[Entry Management] - - D --> L[Block Editor Integration] - D --> M[Form Templates] - D --> N[Field Components] - - E --> O[Frontend Rendering] - E --> P[Validation] - - F --> Q[Submission Handler] - F --> R[Email Notifications] - F --> S[Confirmation Handler] - - G --> T[Custom Post Types] - G --> U[Custom Database Tables] - G --> V[Metadata Storage] - - H --> W[AI Form Generator] - H --> X[AI Middleware] -``` - -## Core Components - -### Plugin Loader (`Plugin_Loader`) - -The central initialization class that bootstraps the plugin, registers hooks, and loads core components. It follows a singleton pattern to ensure only one instance exists. - -### Post Types (`Post_Types`) - -Registers and manages custom post types for forms and entries. Handles the admin UI customizations for these post types. - -### Form Submit (`Form_Submit`) - -Processes form submissions through REST API endpoints, validates input data, handles file uploads, processes anti-spam measures, and triggers email notifications. - -### AI Form Builder (`AI_Form_Builder`) - -Integrates with AI services to generate form structures based on user prompts. Communicates with middleware services to process AI requests. - -### Database Layer - -Custom database tables for storing form entries and related data, separate from the WordPress post tables for better performance and data organization. - -### Frontend Assets (`Frontend_Assets`) - -Manages the loading of CSS and JavaScript assets for the frontend rendering of forms. - -### Email Notifications - -Handles the sending of email notifications based on form submissions, with support for multiple notification templates and recipients. - -## Data Flow - -### Form Creation Flow - -```mermaid -sequenceDiagram - participant User - participant WordPress - participant FormBuilder - participant Database - - User->>WordPress: Access Form Builder - WordPress->>FormBuilder: Initialize Builder Interface - FormBuilder->>User: Display Form Builder UI - - alt Manual Form Creation - User->>FormBuilder: Add/Configure Form Fields - FormBuilder->>User: Update UI Preview - else AI-Assisted Creation - User->>FormBuilder: Enter Form Description - FormBuilder->>AI: Send Form Description - AI->>FormBuilder: Return Suggested Form Structure - FormBuilder->>User: Display AI-Generated Form - User->>FormBuilder: Modify/Approve Form - end - - User->>FormBuilder: Save Form - FormBuilder->>Database: Store Form Configuration - Database->>WordPress: Return Form ID - WordPress->>User: Confirm Form Creation -``` - -### Form Submission Flow - -```mermaid -sequenceDiagram - participant User - participant Frontend - participant REST_API - participant Validation - participant AntiSpam - participant Database - participant EmailSystem - - User->>Frontend: Fill Form - Frontend->>User: Validate Client-Side - User->>Frontend: Submit Form - Frontend->>REST_API: POST Form Data - - REST_API->>Validation: Validate Data - Validation->>REST_API: Validation Result - - REST_API->>AntiSpam: Check for Spam - AntiSpam->>REST_API: Spam Check Result - - alt Valid Submission - REST_API->>Database: Store Entry - Database->>REST_API: Entry ID - REST_API->>EmailSystem: Trigger Notifications - EmailSystem->>REST_API: Email Status - REST_API->>Frontend: Success Response - Frontend->>User: Show Confirmation - else Invalid Submission - REST_API->>Frontend: Error Response - Frontend->>User: Show Error Message - end -``` - -## Form Building Process - -SureForms uses WordPress's block editor as the foundation for its form builder. This approach provides several advantages: - -1. **Familiar Interface**: Users already familiar with WordPress's editor can easily adapt -2. **Native Integration**: Seamless integration with WordPress core functionality -3. **Extensibility**: Ability to leverage the block ecosystem - -### Block Structure - -Forms are composed of various block types: - -- **Container Blocks**: Group and organize form fields -- **Field Blocks**: Individual form inputs (text, email, checkbox, etc.) -- **Layout Blocks**: Control the visual arrangement of fields -- **Special Blocks**: Submit buttons, GDPR notices, etc. - -Each block has its own edit and save components, following the WordPress block API pattern. - -### Form Data Storage - -Form configurations are stored as custom post types with: - -- Post content: Stores the block structure (serialized blocks) -- Post meta: Stores form settings, styling options, and other configuration data - -## AI Integration - -SureForms features an AI-powered form generation system that allows users to create forms by describing them in natural language. - -```mermaid -graph TD - A[User Input] --> B[AI Middleware] - B --> C[AI Service] - C --> D[Form Structure Generation] - D --> E[Field Mapping] - E --> F[Block Generation] - F --> G[Form Preview] - G --> H[User Edits] - H --> I[Final Form] -``` - -### AI Form Generation Process - -1. User provides a description of the desired form -2. The description is sent to the AI middleware -3. AI analyzes the description and generates a structured form definition -4. The form definition is mapped to SureForms field types -5. Blocks are generated and inserted into the editor -6. User can review and modify the generated form - -## Form Submission and Processing - -### Submission Handling - -Form submissions are processed through a custom REST API endpoint that: - -1. Validates the form data against defined rules -2. Checks for spam using various methods (honeypot, reCAPTCHA, etc.) -3. Processes file uploads if present -4. Stores the submission in the database -5. Triggers email notifications -6. Returns appropriate success/error responses - -### Email Notifications - -The email notification system supports: - -- Multiple notification templates per form -- Dynamic content using smart tags -- HTML email formatting -- Conditional sending based on form data -- Custom headers (CC, BCC, Reply-To) - -```mermaid -graph TD - A[Form Submission] --> B[Email Notification System] - B --> C{Multiple Recipients?} - C -->|Yes| D[Process Each Recipient] - C -->|No| E[Single Email] - D --> F[Parse Email Template] - E --> F - F --> G[Replace Smart Tags] - G --> H[Apply Email Template] - H --> I[Send Email] - I --> J{Success?} - J -->|Yes| K[Log Success] - J -->|No| L[Log Failure] -``` - -## Security Features - -SureForms implements multiple security measures to protect against common vulnerabilities: - -### Anti-Spam Protection - -- **Honeypot Fields**: Hidden fields to catch automated submissions -- **reCAPTCHA Integration**: Multiple versions of Google reCAPTCHA -- **hCaptcha Support**: Alternative to reCAPTCHA -- **Cloudflare Turnstile**: Modern CAPTCHA alternative - -### Data Protection - -- **GDPR Compliance**: Options to enable GDPR-compliant data handling -- **Data Encryption**: Sensitive data can be encrypted in storage -- **Auto-Delete Entries**: Automatic deletion of entries after a specified period - -### Input Validation - -- **Client-Side Validation**: Immediate feedback to users -- **Server-Side Validation**: Thorough validation of all submitted data -- **File Upload Security**: Strict file type and size validation - -## Extension Points - -SureForms provides several extension points for developers: - -### WordPress Hooks - -```php -// Example of filter hook for email notification -add_filter('srfm_email_notification', function($parsed, $submission_data, $item, $form_data) { - // Modify email content or recipients - return $parsed; -}, 10, 4); - -// Example of action hook before form submission -add_action('srfm_before_submission', function($form_data) { - // Perform custom actions before form processing -}); -``` - -### JavaScript API - -```javascript -// Example of extending the form validation -window.sureFormsHooks.addFilter( - 'srfm.validation.rules', - 'my-plugin/custom-validation', - function(rules, fieldData) { - // Add custom validation rules - return rules; - } -); -``` - -## Technical Debt and Improvement Areas - -1. **Performance Optimization**: - - Lazy loading of form assets - - Improved caching strategies - -2. **Code Refactoring**: - - Further modularization of components - - Consistent naming conventions - -3. **Testing Coverage**: - - Increase unit and integration test coverage - - Automated UI testing - -## Development Guidelines - -### Coding Standards - -SureForms follows WordPress coding standards with some additional guidelines: - -- PHP: PSR-12 with WordPress-specific adaptations -- JavaScript: ESLint with WordPress configuration -- CSS: Follows WordPress CSS coding standards - -### Development Workflow - -1. **Feature Planning**: Document requirements and design -2. **Development**: Implement features with appropriate tests -3. **Code Review**: Peer review for quality assurance -4. **Testing**: Automated and manual testing -5. **Documentation**: Update technical and user documentation -6. **Release**: Version tagging and deployment - -### Version Control - -- Feature branches for new development -- Pull request workflow for code review -- Semantic versioning for releases - -## Conclusion - -SureForms represents a modern approach to WordPress form building, combining the power of the block editor with advanced features like AI form generation. Its modular architecture and extensive extension points make it both user-friendly and developer-friendly, while its focus on security and performance ensures a reliable experience for all users. - -The plugin continues to evolve with a focus on improving user experience, expanding integration capabilities, and optimizing performance across all devices and platforms. diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index cf66c59fc..000000000 --- a/CLAUDE.md +++ /dev/null @@ -1,165 +0,0 @@ -# SureForms - CLAUDE.md - -## Project Overview -SureForms is a WordPress form builder plugin (v2.5.1) by Brainstorm Force. AI-powered drag-and-drop form building using the Gutenberg block editor. - -- **Plugin slug:** `sureforms` | **Text domain:** `sureforms` -- **Prefix:** `SRFM_` (constants), `srfm` (slug), `sureforms_` (post types/DB) -- **Minimum PHP:** 7.4 | **Minimum WP:** 6.4 - -## Tech Stack -- **Backend:** PHP 7.4+ / WordPress Plugin API / Custom REST endpoints -- **Frontend:** React 18 + WordPress Gutenberg blocks -- **Styling:** TailwindCSS 3.4 + SASS + PostCSS -- **Build:** WordPress Scripts (Webpack 5) + Grunt -- **Testing:** PHPUnit 9 (unit) + Playwright (E2E) -- **Static Analysis:** PHPStan level 9 + PHPCS (WordPress-Extra) -- **Node:** 18.15.0 (Volta) | **UI Library:** @bsf/force-ui - -## Commands - -### Build -```bash -npm run start # Dev server with watch -npm run build # Full production build -npm run build:script # Webpack only -npm run build:sass # SASS only -``` - -### Lint & Format -```bash -npm run lint-js # ESLint -npm run lint-js:fix # ESLint auto-fix -npm run lint-css # Stylelint -composer lint # PHPCS -composer format # PHPCBF auto-fix -composer phpstan # PHPStan level 9 -composer insights # PHP Insights -``` - -### Test -```bash -composer test # PHPUnit -composer test:coverage # PHPUnit with coverage -npm run test:unit # JS unit tests -npm run play:up # Start WP test env -npm run play:run # Playwright E2E -npm run play:stop # Stop WP test env -``` - -### i18n -```bash -npm run makepot # Generate .pot -npm run i18n:po # Update .po from .pot -npm run i18n:mo # Compile .mo -npm run i18n:json # JSON translations -``` - -## Architecture - -### Directory Structure -``` -sureforms/ -├── sureforms.php # Entry point, constants -├── plugin-loader.php # Bootstrap -├── inc/ # PHP backend -│ ├── helper.php # Central utility (large — minimize changes) -│ ├── rest-api.php # REST endpoints -│ ├── form-submit.php # Submission handler -│ ├── entries.php # Entry management -│ ├── post-types.php # CPT registration -│ ├── blocks/ # PHP block rendering -│ ├── fields/ # Field type handlers -│ ├── database/ # Custom DB tables -│ ├── payments/ # Stripe integration -│ ├── ai-form-builder/ # AI form generation -│ ├── global-settings/ # Plugin settings -│ ├── page-builders/ # Elementor/Bricks compat -│ └── lib/ # Third-party (DO NOT modify) -├── src/ # React/JS source -│ ├── admin/ # Admin UI -│ ├── blocks/ # Gutenberg block JS -│ ├── components/ # Shared React components -│ ├── store/ # WordPress data store -│ ├── utils/ # JS utilities -│ └── srfm-controls/ # Custom block controls -├── assets/ # Compiled output (gitignored) -├── sass/ # SASS source -├── modules/ # Feature modules -├── templates/ # PHP templates -├── tests/ # PHPUnit + Playwright + Docker -└── languages/ # Translation files -``` - -### Webpack Aliases -``` -@Admin → src/admin/ @Blocks → src/blocks/ @Controls → src/srfm-controls/ -@Components → src/components/ @Utils → src/utils/ @Svg → assets/svg/ -@Attributes → src/blocks-attributes/ @Image → images/ @IncBlocks → inc/blocks/ -``` - -### Key Data Structures -- **Post Type:** `sureforms_form` — Forms as CPT with block content -- **Custom Tables:** `sureforms_entries`, `sureforms_payments` -- **REST Namespace:** Custom endpoints in `inc/rest-api.php` - -## Code Rules - -### PHP -- Follow WPCS. Use `sureforms` text domain for all translatable strings -- `@since x.x.x` on all new functions/classes (updated in release PRs) -- NEVER `echo` without escaping — use `esc_html()`, `esc_attr()`, `wp_kses_post()` -- NEVER use `$_GET/$_POST/$_REQUEST` directly — use `sanitize_text_field( wp_unslash( ... ) )` -- NEVER skip security verification on endpoints/AJAX handlers - - **Public form submission endpoints** use HMAC tokens via `Submit_Token::verify()` (`inc/submit-token.php`) — NOT nonces. These are cache-safe and session-independent. The `// phpcs:ignore WordPress.Security.NonceVerification.Missing` comment is expected on these handlers. - - **Admin/authenticated endpoints** still use traditional nonces (`wp_verify_nonce()` / `check_ajax_referer()`) -- NEVER skip capability checks — use `current_user_can()` before privileged operations -- NEVER use `wp_die()` in REST callbacks — use `WP_Error` with proper response codes -- NEVER hardcode table names — use `$wpdb->prefix . 'sureforms_entries'` -- ALWAYS use `wp_json_encode()`, `wp_remote_get/post()`, `gmdate()`, `wp_safe_redirect()` - -### JavaScript/React -- Follow WordPress Scripts ESLint config -- Use WordPress data stores (`useSelect`/`useDispatch`) — never raw fetch in blocks -- Import from `@wordpress/*` packages — never import React directly -- Use `__()` from `@wordpress/i18n` — never hardcode user-facing strings -- Use TailwindCSS utility classes; use `@bsf/force-ui` for admin UI -- NEVER use `dangerouslySetInnerHTML` — use `RawHTML` from `@wordpress/element` - -### General -- NEVER create files unless absolutely necessary — prefer editing existing files -- NEVER proactively create documentation files unless explicitly requested - -## Gotchas -- **Custom DB tables** introduced in v0.0.13 — migration is irreversible -- **PHPStan level 9** is strict; check baseline before adding new ignores -- **Grunt** still used alongside Webpack for CSS minification and release packaging -- **`inc/lib/`** is third-party code — do not lint or modify -- **Node 18.15.0** pinned via Volta — other versions may cause build issues - -## Verification Before Done -After code changes, verify before reporting done: - -**JS:** `npm run lint-js` → `npm run build:script` -**SASS:** `npm run build:sass` (if touched) - -Checklist: -- Re-read the diff for obvious issues -- No debug code left (`console.log`, `error_log`, `var_dump`) -- All new functions have `@since x.x.x` -- All user-facing strings use `__()` / `_e()` -- Security checks on new endpoints/handlers (HMAC token for public, nonce for admin) -- For significant changes, suggest `npm run play:run` - -## Self-Improvement Loop -- When corrected, add a rule to **Learned Rules** so the mistake never repeats -- When a pattern causes a bug or CI failure, document it immediately -- Periodically prune outdated rules - -## Learned Rules - -- NEVER flag `phpcs:ignore WordPress.Security.NonceVerification.Missing` as a security issue on public form submission handlers (form submit, field validation, Stripe/PayPal payment intents) — these use HMAC token verification (`Submit_Token::verify()`) instead of nonces for page-cache compatibility. The HMAC token is embedded in the form at render time and verified server-side without any session dependency. -- ALWAYS use `Submit_Token::generate($form_id)` / `Submit_Token::verify($token, $form_id)` for public-facing form security — nonces (`wp_verify_nonce`) are only for admin/authenticated endpoints. - -## Current Focus - diff --git a/COMPREHENSIVE_ANALYSIS.md b/COMPREHENSIVE_ANALYSIS.md deleted file mode 100644 index aed786d38..000000000 --- a/COMPREHENSIVE_ANALYSIS.md +++ /dev/null @@ -1,304 +0,0 @@ -# SureForms: Comprehensive Analysis - -This document provides a multi-perspective analysis of the SureForms WordPress plugin, examining it from software architecture, development, and product management viewpoints. - -## Table of Contents - -1. [Software Architecture Analysis](#software-architecture-analysis) -2. [Development Perspective](#development-perspective) -3. [Product Management Analysis](#product-management-analysis) -4. [Integration Capabilities](#integration-capabilities) -5. [Future Development Roadmap](#future-development-roadmap) - -## Software Architecture Analysis - -### Core Architecture - -SureForms follows a modular architecture pattern with clear separation of concerns. The plugin is built around several key components: - -```mermaid -graph TD - A[WordPress Core] --> B[SureForms Plugin] - B --> C[Plugin_Loader] - C --> D[Core Components] - D --> E[Post_Types] - D --> F[Form_Submit] - D --> G[Block_Patterns] - D --> H[Frontend_Assets] - D --> I[AI_Form_Builder] - D --> J[Rest_Api] - D --> K[Database] - K --> L[Custom Tables] - K --> M[Post Meta] -``` - -The architecture leverages WordPress's plugin system and follows object-oriented principles with extensive use of the singleton pattern for core components. - -### Data Flow Architecture - -The data flow within SureForms follows a clear pattern: - -```mermaid -sequenceDiagram - participant User - participant Frontend - participant BlockEditor - participant REST_API - participant Database - - User->>BlockEditor: Create Form - BlockEditor->>Database: Store Form Configuration - User->>Frontend: View & Submit Form - Frontend->>REST_API: Submit Form Data - REST_API->>Database: Store Submission - REST_API->>Frontend: Return Response -``` - -This separation ensures clean data handling and allows for extensibility at various points in the process. - -### Component Analysis - -#### Plugin Loader - -The `Plugin_Loader` class serves as the entry point for the plugin, handling initialization, autoloading, and hook registration. It follows the singleton pattern to ensure only one instance exists. - -#### Post Types - -The `Post_Types` class manages custom post types for forms and entries, including admin UI customizations, shortcode functionality, and metadata registration. - -#### Form Submit - -The `Form_Submit` class processes form submissions through REST API endpoints, handling validation, file uploads, anti-spam measures, and email notifications. - -#### Database Layer - -SureForms uses both WordPress custom post types and custom database tables: -- Custom post type `sureforms_form` for form configurations -- Custom table `{prefix}_srfm_entries` for form submissions - -This hybrid approach leverages WordPress's content management for forms while optimizing data storage for submissions. - -#### AI Integration - -The AI form builder component connects with external AI services through a middleware layer, translating natural language descriptions into structured form definitions. - -### Technical Debt Assessment - -Current areas of technical debt include: - -1. **Performance Optimization** - - Opportunity for more aggressive asset loading strategies - - Potential for improved caching mechanisms - -2. **Code Organization** - - Some components have grown large and could benefit from further modularization - - Inconsistent naming conventions in some areas - -3. **Testing Coverage** - - Limited automated testing for JavaScript components - - Opportunity for more comprehensive integration tests - -## Development Perspective - -### Code Quality - -The codebase demonstrates several positive qualities: - -- **Consistent Structure**: Well-organized directory structure -- **Modern Practices**: Use of namespaces, autoloading, and OOP principles -- **Documentation**: Comprehensive inline documentation -- **Separation of Concerns**: Clear boundaries between components - -Areas for improvement include: - -- **Testing Coverage**: Expanding unit and integration tests -- **Consistent Naming**: Standardizing naming conventions across all components -- **Performance Profiling**: Identifying and addressing performance bottlenecks - -### Development Workflow - -The development process appears to follow modern practices: - -- **Version Control**: Git-based workflow with feature branches -- **Code Review**: Evidence of peer review processes -- **Continuous Integration**: GitHub Actions for automated testing -- **Semantic Versioning**: Clear versioning strategy - -### Extension Points - -SureForms provides several extension mechanisms: - -1. **WordPress Hooks** - - Actions for process intervention - - Filters for data modification - -2. **JavaScript API** - - Client-side hooks for extending functionality - - Custom events for integration - -3. **Block API** - - Ability to register custom form field blocks - - Block filters for modifying existing blocks - -4. **Template System** - - Customizable templates for form rendering - - Theme override capabilities - -### Technology Stack - -The plugin leverages a modern technology stack: - -- **PHP**: Core server-side logic -- **JavaScript/React**: Block editor integration and frontend functionality -- **CSS/SCSS**: Styling with preprocessor support -- **MySQL**: Database storage -- **REST API**: Data communication -- **AI Services**: Form generation capabilities - -## Product Management Analysis - -### User Segments - -SureForms targets several distinct user segments: - -1. **Website Owners** - - Need: Simple form creation without technical knowledge - - Value: Intuitive interface, pre-designed templates - -2. **Designers** - - Need: Visually appealing forms that match site design - - Value: Design customization, aesthetic controls - -3. **Developers** - - Need: Extensible platform with clean APIs - - Value: Hooks, filters, and documentation - -4. **No-Code Professionals** - - Need: Advanced functionality without coding - - Value: Conditional logic, multi-step forms - -### Feature Analysis - -The feature set is well-aligned with user needs: - -| Feature | User Segment | Value Proposition | -|---------|--------------|-------------------| -| Block Editor Integration | All | Familiar, native WordPress experience | -| AI Form Generation | All | Rapid form creation with minimal effort | -| Mobile-First Design | All | Forms work well on all devices | -| Advanced Field Types | No-Code Professionals | Complex form capabilities without coding | -| Developer Hooks | Developers | Extensibility for custom needs | -| Visual Customization | Designers | Forms match site aesthetics | -| Anti-Spam Features | All | Protection from spam submissions | -| GDPR Compliance | All | Legal compliance and data protection | - -### Competitive Positioning - -SureForms differentiates itself through: - -1. **Native WordPress Integration**: Using the block editor rather than a custom interface -2. **AI-Powered Creation**: Faster form building through AI assistance -3. **Design Focus**: Emphasis on visual appeal and user experience -4. **Developer-Friendly**: Clean architecture and extension points - -### Market Fit - -The product demonstrates strong market fit by addressing several key pain points: - -1. **Complex Form Building**: Simplifying the process through AI and intuitive interface -2. **Design Limitations**: Providing modern styling out-of-the-box -3. **Mobile Responsiveness**: Ensuring forms work well on all devices -4. **Technical Barriers**: Enabling advanced features without coding requirements - -## Integration Capabilities - -### WordPress Ecosystem - -SureForms integrates well with the WordPress ecosystem: - -- **Themes**: Compatible with major themes including Astra, Kadence, GeneratePress -- **Page Builders**: Works with Elementor, Beaver Builder, Divi -- **Plugins**: Compatible with popular plugins like WooCommerce, Easy Digital Downloads - -### External Services - -The plugin offers integration with several external services: - -- **reCAPTCHA**: Anti-spam protection -- **hCaptcha**: Alternative CAPTCHA solution -- **Cloudflare Turnstile**: Modern CAPTCHA alternative -- **AI Services**: Form generation capabilities - -### API Architecture - -The API architecture facilitates integration: - -```mermaid -graph LR - A[WordPress] --> B[SureForms Core] - B --> C[REST API] - C --> D[External Integrations] - D --> E[CRM Systems] - D --> F[Email Marketing] - D --> G[Payment Processors] - D --> H[AI Services] -``` - -This architecture allows for flexible integration with various third-party services. - -## Future Development Roadmap - -Based on the analysis, several development priorities emerge: - -### Short-Term Priorities - -1. **Performance Optimization** - - Implement lazy loading for form assets - - Optimize database queries for large form submissions - -2. **Code Quality Improvements** - - Increase test coverage - - Standardize naming conventions - - Refactor larger components - -3. **Integration Expansion** - - Add more third-party service integrations - - Enhance existing integrations with deeper functionality - -### Medium-Term Priorities - -1. **Advanced AI Capabilities** - - Improve form generation accuracy - - Add form analytics and insights - -2. **Enhanced User Experience** - - Streamline the form building process - - Improve form submission handling - -3. **Developer Tools** - - Create comprehensive API documentation - - Develop example extensions - -### Long-Term Vision - -1. **Form Ecosystem** - - Develop a marketplace for extensions - - Create specialized form solutions for different industries - -2. **Enterprise Features** - - Advanced workflow automation - - Enhanced security and compliance features - -3. **SaaS Potential** - - Explore hosted form solution alongside WordPress plugin - - Develop cloud-based form management - -## Conclusion - -SureForms represents a modern approach to WordPress form building, combining native block editor integration with AI-powered form generation. Its architecture demonstrates good separation of concerns and extensibility, while its feature set addresses key user needs across multiple segments. - -The product is well-positioned in the competitive form builder market, with clear differentiation through its WordPress integration, AI capabilities, and design focus. Future development should focus on expanding integrations, enhancing AI capabilities, and improving performance to maintain this competitive advantage. - -From a technical perspective, the codebase is well-structured but would benefit from increased test coverage and some refactoring of larger components. The extension system provides good flexibility for developers, though more comprehensive documentation would enhance this further. - -Overall, SureForms shows strong potential for continued growth and adoption, particularly as the WordPress ecosystem continues to embrace the block editor and AI-powered tools become increasingly important in the website building process. diff --git a/PRODUCT_ANALYSIS.md b/PRODUCT_ANALYSIS.md deleted file mode 100644 index a6c4e595e..000000000 --- a/PRODUCT_ANALYSIS.md +++ /dev/null @@ -1,251 +0,0 @@ -# SureForms Product Analysis - -## Executive Summary - -SureForms is a modern WordPress form builder plugin that differentiates itself through its native WordPress integration, AI-powered form generation, and focus on user experience. This analysis examines the product from multiple perspectives to provide a comprehensive understanding of its strengths, challenges, and opportunities for growth. - -## Table of Contents - -1. [Product Overview](#product-overview) -2. [Market Analysis](#market-analysis) -3. [User Experience Analysis](#user-experience-analysis) -4. [Technical Analysis](#technical-analysis) -5. [Competitive Analysis](#competitive-analysis) -6. [SWOT Analysis](#swot-analysis) -7. [Growth Opportunities](#growth-opportunities) -8. [Recommendations](#recommendations) - -## Product Overview - -SureForms is a WordPress form builder plugin that leverages the native WordPress block editor (Gutenberg) to provide an intuitive form building experience. Key features include: - -- **Native WordPress Integration**: Built on top of the WordPress block editor -- **AI-Powered Form Generation**: Create forms quickly using AI suggestions -- **No-Code Flexibility**: Advanced features without requiring coding knowledge -- **Mobile-First Design**: Responsive forms that work across all devices -- **Modern UI/UX**: Clean, intuitive interface for both admins and users -- **Security Features**: Anti-spam protection, GDPR compliance, and data security -- **Extensibility**: Developer-friendly architecture with hooks and filters - -The plugin is currently at version 1.7.0 and requires WordPress 6.4+ and PHP 7.4+. - -## Market Analysis - -### Target Audience - -SureForms targets several key user segments: - -1. **Website Owners**: Individuals and businesses who manage their own WordPress websites and need to collect information from visitors -2. **Designers**: Professionals who value good design and want to create visually appealing forms -3. **Developers**: Technical users who need a developer-friendly solution with clean APIs and hooks -4. **No-Code Professionals**: Users who need advanced form features without coding skills - -### Market Positioning - -SureForms positions itself as a modern alternative to traditional form builders, emphasizing: - -1. **Seamless WordPress Integration**: Using the native block editor rather than a separate interface -2. **Design-First Approach**: Focusing on aesthetics and user experience -3. **AI-Powered Efficiency**: Leveraging AI to speed up form creation -4. **Simplicity Without Compromise**: Providing advanced features in an accessible way - -### Market Trends - -Several trends in the WordPress form builder market are relevant to SureForms: - -1. **Shift to Block Editor**: Growing adoption of Gutenberg and block-based themes -2. **AI Integration**: Increasing use of AI for content and design generation -3. **Mobile-First Design**: Continued emphasis on mobile responsiveness -4. **Privacy Compliance**: Growing importance of GDPR and other privacy regulations -5. **No-Code Movement**: Rising demand for powerful tools that don't require coding skills - -## User Experience Analysis - -### Form Creation Experience - -SureForms provides a streamlined form creation experience: - -- **Block-Based Building**: Drag-and-drop interface using familiar WordPress blocks -- **AI Form Generation**: Natural language prompts to quickly create form structures -- **Visual Editing**: Real-time preview of forms as they're built -- **Templates**: Pre-designed form templates for common use cases - -### Form Submission Experience - -The end-user experience for form submission is optimized for: - -- **Responsive Design**: Forms adapt to different screen sizes -- **Inline Validation**: Real-time feedback on form inputs -- **Accessibility**: Support for screen readers and keyboard navigation -- **Confirmation Messages**: Customizable success messages and redirects - -### Admin Experience - -The admin interface focuses on: - -- **Intuitive Management**: Easy access to forms, entries, and settings -- **Data Visualization**: Visual reporting of form submission data -- **Entry Management**: Tools for viewing, filtering, and exporting submissions -- **Email Notifications**: Customizable email alerts for new submissions - -## Technical Analysis - -### Architecture - -SureForms follows a modular architecture with clear separation of concerns: - -- **Core Plugin**: Handles initialization, hooks, and basic functionality -- **Block System**: Manages form field blocks and their behavior -- **Form Processing**: Handles form submissions and data storage -- **AI Integration**: Connects with AI services for form generation -- **Extension System**: Provides hooks and filters for customization - -### Performance - -The plugin is designed with performance in mind: - -- **Optimized Asset Loading**: CSS and JS loaded only when needed -- **Efficient Database Usage**: Custom tables with appropriate indexes -- **Caching Strategies**: Caching of frequently accessed data -- **Minimal Dependencies**: Limited reliance on external libraries - -### Security - -Security features include: - -- **Input Validation**: Thorough validation of all user inputs -- **Anti-Spam Measures**: Multiple options for spam prevention -- **Data Protection**: GDPR compliance features -- **File Upload Security**: Strict validation of uploaded files - -### Extensibility - -The plugin provides several extension points: - -- **WordPress Hooks**: Actions and filters for modifying behavior -- **JavaScript API**: Client-side hooks for extending functionality -- **Block API**: Ability to create custom form field blocks -- **Template System**: Customizable templates for form rendering - -## Competitive Analysis - -### Key Competitors - -1. **Gravity Forms**: Established premium form builder with extensive features -2. **WPForms**: User-friendly form builder with a focus on simplicity -3. **Formidable Forms**: Advanced form builder with data management features -4. **Ninja Forms**: Modular form builder with add-on marketplace -5. **Contact Form 7**: Simple, free form builder with large user base - -### Competitive Advantages - -SureForms differentiates itself through: - -1. **Native Block Editor Integration**: More seamless WordPress experience -2. **AI-Powered Form Creation**: Faster form building process -3. **Modern Design Focus**: Better out-of-the-box aesthetics -4. **Developer-Friendly Architecture**: Clean APIs and extension points -5. **Mobile-First Approach**: Better experience on mobile devices - -### Competitive Challenges - -Areas where competitors may have advantages: - -1. **Ecosystem Maturity**: Established competitors have larger add-on ecosystems -2. **Market Recognition**: Lower brand awareness as a newer entrant -3. **Feature Depth**: Some competitors have more specialized features -4. **Integration Breadth**: Fewer third-party service integrations - -## SWOT Analysis - -### Strengths - -- Native integration with WordPress block editor -- AI-powered form generation capabilities -- Modern, clean design aesthetic -- Mobile-first responsive approach -- Developer-friendly architecture -- Focus on user experience - -### Weaknesses - -- Newer entrant in a mature market -- Smaller ecosystem of extensions and add-ons -- Limited third-party integrations compared to competitors -- Requires newer versions of WordPress and PHP - -### Opportunities - -- Growing adoption of the WordPress block editor -- Increasing demand for AI-powered tools -- Rising importance of mobile-friendly forms -- Expanding market for no-code solutions -- Potential for vertical-specific form solutions - -### Threats - -- Established competitors with loyal user bases -- WordPress core changes affecting block editor functionality -- Potential AI regulation affecting AI form generation -- Market commoditization driving price competition -- Alternative form solutions outside WordPress ecosystem - -## Growth Opportunities - -### Product Development - -1. **Expanded AI Capabilities**: More sophisticated form generation and analysis -2. **Vertical-Specific Templates**: Forms tailored to specific industries or use cases -3. **Advanced Conditional Logic**: More powerful dynamic form behavior -4. **Enhanced Data Analysis**: Better visualization and reporting of form data -5. **Multi-Step Form Improvements**: More sophisticated multi-page form experiences - -### Market Expansion - -1. **Agency Partner Program**: Dedicated resources for agencies and developers -2. **Vertical Marketing**: Targeted solutions for specific industries -3. **Educational Content**: Tutorials and resources to drive adoption -4. **Integration Partnerships**: Collaborations with complementary services -5. **International Expansion**: Localization for key markets - -### Business Model - -1. **Freemium Model**: Free core plugin with premium add-ons or features -2. **Subscription Tiers**: Different service levels for different user needs -3. **White-Label Solutions**: Customizable versions for agencies and resellers -4. **Enterprise Offerings**: Custom solutions for larger organizations -5. **Marketplace**: Platform for third-party extensions - -## Recommendations - -### Short-Term (0-6 months) - -1. **Expand Integration Ecosystem**: Add connections to popular CRM and email marketing platforms -2. **Enhance AI Form Builder**: Improve accuracy and capabilities of AI form generation -3. **Develop Educational Content**: Create tutorials and documentation to drive adoption -4. **Optimize Performance**: Further improve loading speed and resource usage -5. **Implement User Feedback System**: Gather structured feedback from early adopters - -### Medium-Term (6-12 months) - -1. **Launch Partner Program**: Develop resources for agencies and developers -2. **Create Vertical Solutions**: Develop specialized templates for key industries -3. **Expand Block Library**: Add more specialized form field types -4. **Improve Analytics**: Enhance data visualization and reporting capabilities -5. **Develop Extension Marketplace**: Create platform for third-party add-ons - -### Long-Term (12+ months) - -1. **Develop Enterprise Features**: Add capabilities for larger organizations -2. **Explore SaaS Model**: Consider hosted form solution alongside WordPress plugin -3. **Implement Advanced AI**: Add predictive analytics and personalization -4. **Create Form Ecosystem**: Develop complementary products and services -5. **Explore International Markets**: Localize for key global markets - -## Conclusion - -SureForms represents a modern approach to WordPress form building, combining the power of the native block editor with AI-powered form generation. Its focus on user experience, design, and developer-friendly architecture positions it well in the competitive form builder market. - -By leveraging its strengths in WordPress integration and AI capabilities while addressing its challenges in market recognition and ecosystem development, SureForms has significant potential for growth. The recommended strategies focus on expanding integrations, enhancing AI capabilities, developing educational resources, and creating specialized solutions for key market segments. - -With continued development and strategic focus, SureForms can establish itself as a leading WordPress form solution for the modern web. diff --git a/README.md b/README.md index 4e348ffe6..468a5a71e 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,40 @@ -# SureForms - Contact Form, Payment Form & Other Custom Form Builder # +# SureForms - Contact Form, Payment Form, Survey & Other Custom Form Builder # **Contributors:** [brainstormforce](https://profiles.wordpress.org/brainstormforce/) -**Tags:** forms, contact form, custom form, payment form, form builder +**Tags:** forms, contact form, form builder, payment form, WordPress form plugin **Requires at least:** 6.4 -**Tested up to:** 6.9.4 +**Tested up to:** 7.0 **Requires PHP:** 7.4 -**Stable tag:** 2.8.2 +**Stable tag:** 2.10.1 **License:** GPLv2 or later **License URI:** http://www.gnu.org/licenses/gpl-2.0.html -The most beginner-friendly AI Form Builder for WordPress. Create contact, payment, quiz & custom forms with advanced features in minutes. +The AI-powered WordPress form builder. Build contact, payment, quiz, survey & multi-step forms in minutes, no code needed. ## Description ## -#### SUREFORMS – THE BEST AI-ASSISTED FORM BUILDER +#### SUREFORMS – THE BEST AI-ASSISTED WORDPRESS FORM BUILDER ★★★★★ +SureForms is the most beginner-friendly **WordPress form builder**, designed to help anyone create contact forms, payment forms, surveys, quizzes, multi-step forms, and conversational forms without writing a single line of code. Powered by AI and built natively on the WordPress block editor, SureForms makes building any form on your WordPress site fast, intuitive, and beautiful. + +Trusted by **500,000+ websites**, SureForms is the modern alternative to traditional contact form plugins — purpose-built for speed, design, and conversions. + 👉 Try the live demo of SureForms [youtube https://www.youtube.com/watch?v=qLpnm4GdXks] ### CREATE BEAUTIFUL RESPONSIVE FORMS USING WORDPRESS BLOCK EDITOR (GUTENBERG EDITOR) WITHOUT CODING ⚡ -Our mission at SureForms is to empower you to build **beautiful forms without any code**. +Our mission at SureForms is to empower you to build **beautiful WordPress forms without any code**. -We're taking a fresh approach with Gutenberg, WordPress's native drag-and-drop builder, to make creating forms seamless and intuitive with no new interface to learn. +We're taking a fresh approach with Gutenberg, WordPress's native drag-and-drop builder, to make creating contact forms and custom forms seamless and intuitive — with no new interface to learn. -SureForms is a beginner-friendly form plugin that makes building contact forms and other high-converting custom forms fast and simple with advanced features like multi-step forms, conversational forms, payment forms, conditional logic, calculation, native integrations, etc. +SureForms is a beginner-friendly WordPress form plugin that makes building contact forms and other high-converting custom forms fast and simple, with advanced features like multi-step forms, conversational forms, payment forms, conditional logic, calculations, native integrations, and more. Good design and user experience are crucial for forms. Yet many website owners struggle to make their forms blend seamlessly with their site's look and feel, often leading to lower response rates. -In this regard, SureForms addresses several pain points commonly experienced by website owners: +In this regard, SureForms addresses several pain points commonly experienced by WordPress users: - Complex Process of Form Building - Design Limitations @@ -44,17 +48,17 @@ SureForms is packed with features to address these pain points of WordPress user Below are some of the top features SureForms offers: -#### Native WordPress +#### Native WordPress Form Builder (No New Editor to Learn) -SureForms uses WordPress's native block editor for a seamless drag-and-drop form building experience. No need to learn a new editor or a new style. +SureForms uses WordPress's native block editor for a seamless drag-and-drop form building experience. There's no separate interface, no proprietary builder, and no learning curve — just the WordPress editor you already know. It's fast, simple, and the most beginner-friendly form builder for WordPress. -#### Create Forms Effortlessly with AI +#### AI Form Builder for WordPress [youtube https://www.youtube.com/watch?v=uDLF4dk3YHI] -SureForms is the first AI-powered form builder for WordPress, which makes form creation faster and smarter. From simple contact forms to advanced calculators, AI handles the details, offers smart suggestions, and helps you build functional, user friendly forms in just a few clicks. +SureForms is the first AI-powered form builder for WordPress, making form creation faster and smarter. From simple contact forms to advanced calculators, the SureForms AI handles the details, offers smart field suggestions, and helps you build functional, user-friendly forms in just a few clicks. **Here are a few examples of forms you can create with SureForms AI:** @@ -69,35 +73,35 @@ SureForms is the first AI-powered form builder for WordPress, which makes form c - Calculators - Conversational Forms -#### No-Code Flexibility +#### No-Code Form Builder with Advanced Logic -SureForms makes advanced features like conditional logic, multi-step forms, query parameters and etc. simple to use through a no-code interface. This empowers anyone to create powerful, interactive forms without writing a single line of code. +SureForms makes advanced features like conditional logic, multi-step forms, query parameters, and more simple to use through a no-code interface. This empowers anyone to create powerful, interactive WordPress forms without writing a single line of code. -#### Payment Forms +#### WordPress Payment Forms with Stripe and PayPal -SureForms supports a built-in Payment Forms feature. With SureForms, anyone can easily create full-fledged donation forms, event registrations, product checkouts, or any kind of form that needs to accept payments, all without relying on any extra add-on or third-party plugins. This makes collecting payments seamless, secure, and effortless directly through your forms using Stripe. PayPal payments are available with SureForms Business. +SureForms supports a built-in **Payment Forms** feature. With SureForms, anyone can easily create full-fledged donation forms, event registrations, product checkouts, or any kind of form that needs to accept payments — all without relying on any extra add-on or third-party plugins. This makes collecting payments seamless, secure, and effortless directly through your WordPress forms using Stripe. PayPal payments are available with SureForms Business. -Here are a few examples of how the Payment Feature in SureForms can power your forms: +Here are a few examples of how the Payment Forms feature in SureForms can power your forms: - [Donation Form](https://sureforms.com/form/donation-form/) - [Photography Packages Booking Form](https://sureforms.com/form/photography-packages-payment-form/) - [Monthly Membership Plan Form](https://sureforms.com/form/monthly-membership-plan/) - [Web Design Packages Booking Form](https://sureforms.com/form/freelance-web-design-packages-payment/) -#### Instant Forms +#### Instant Forms (Shareable Form Links — No Embed Needed) [youtube https://www.youtube.com/watch?v=pMH129ZUxJ0] -With SureForms' own Instant Form feature, you can publish forms with a unique shareable URL. No embedding needed. Share them anywhere and make your forms instantly accessible. +With SureForms' own Instant Form feature, you can publish forms with a unique shareable URL. No page, no shortcode, no embedding needed. Share the link anywhere — email, social, SMS — and make your forms instantly accessible. -#### Mobile-First Approach +#### Mobile-Friendly Responsive Forms -SureForms recognizes the importance of mobile friendly forms. The forms created with SureForms are designed with a mobile-first approach, ensuring they look and function flawlessly on various devices. +SureForms recognizes the importance of mobile-friendly forms. Every form created with SureForms is designed with a mobile-first approach, ensuring it looks and functions flawlessly on phones, tablets, and desktops alike. -#### Multi-Column Layouts +#### Multi-Column Form Layouts SureForms makes it easy to arrange input fields into multiple columns for a clean, efficient form layout. This makes your forms look organized, visually appealing, and encourages higher completion rates. You can customize the columns to fit your design. -#### Input Fields +#### 15+ Form Input Fields **SureForms comes with 15+ fields to build your form:** @@ -118,35 +122,35 @@ SureForms makes it easy to arrange input fields into multiple columns for a clea - Image - Icon -#### Inline Field Validation +#### Inline Form Validation in Real-Time -Real-time validation for form fields provides instant feedback to users if they enter incorrect or incomplete information. This ensures data accuracy and enhances the user experience. +Real-time validation for form fields provides instant feedback to users if they enter incorrect or incomplete information. This ensures data accuracy and enhances the user experience on every form submission. -#### GDPR Compliance +#### GDPR-Compliant WordPress Forms Ensure your forms are GDPR compliant and protect user data by simply enabling the built-in GDPR setting. -#### Anti-Spam Forms +#### Anti-Spam Forms (reCAPTCHA + Honeypot) -Protect your forms from spam with built-in measures like Google reCAPTCHA and Honeypot fields. These ensure submissions are genuine, block bots, and keep your forms secure without bothering your users. +Protect your WordPress forms from spam with built-in measures like Google reCAPTCHA and Honeypot fields. These ensure submissions are genuine, block bots, and keep your forms secure without bothering your users. -#### Personalized Confirmation Messages +#### Personalized Confirmation Messages and Redirects SureForms provides options for setting up customized confirmation messages or redirections that are displayed to users after successful form submissions. Tailor these messages to provide personalized feedback or redirect respondents to specific pages. -#### Email Notifications +#### Email Notifications for Every Form Submission Configure customized email notifications triggered by form submissions. Specify recipients, email templates, and personalized messages to stay informed and automate communication. -#### Form Entries +#### Form Entries Management Inside WordPress -Stores form entries securely to access and manage form submission data within your WordPress dashboard. You can also review, export, or perform actions on form entries as needed. +Stores form entries securely so you can access and manage form submission data right inside your WordPress dashboard. You can review, export, or perform actions on form entries as needed — no external service required. -#### Visual Data Reporting +#### Visual Data Reporting and Form Analytics -Analyze and gain insights from form submissions through interactive charts, graphs, and data visualizations. Take data-driven decisions. +Analyze and gain insights from form submissions through interactive charts, graphs, and data visualizations. Take data-driven decisions from your WordPress dashboard. #### Developer-Friendly Customization @@ -159,10 +163,10 @@ SureForms Business unlocks advanced capabilities for power users, agencies, and #### Advanced Form Types [**Conversational Forms**](https://sureforms.com/features/conversational-form/): -Chat-like forms, one question at a time, for more conversions. +Chat-like forms, one question at a time, for higher conversions and lower drop-off rates. [**Multi-step Forms**](https://sureforms.com/features/multi-step-forms/): -Bite-sized forms with progress indicators, less form fatigue for your users. +Bite-sized forms with progress indicators, reducing form fatigue and boosting completion rates. [**Quiz Forms**](https://sureforms.com/features/quiz/): Create scored quizzes and personality tests with result output and grading. @@ -170,8 +174,8 @@ Create scored quizzes and personality tests with result output and grading. [**Conditional Logic Forms**](https://sureforms.com/features/conditional-logic/): Show or hide fields, customize email notifications, and display different confirmation messages based on users' answers. -[**Calculators**](https://sureforms.com/features/calculator-form/): -Provide instant quotes or results with interactive calculators in your site. Designed to bring more traffic to your site. +[**Calculator Forms**](https://sureforms.com/features/calculator-form/): +Provide instant quotes or results with interactive calculators on your site — designed to bring more traffic and conversions. #### Pro Field Types @@ -197,7 +201,7 @@ Instantly create downloadable PDFs of form submissions for records or sharing. Let users save their progress and come back to complete the form later. [**Custom Registration & Login Forms**](https://sureforms.com/features/login-and-registration/): -Fully functional, branded Registration & Login forms for your site using just a block. +Fully functional, branded Registration and Login forms for your WordPress site using just a block. **Custom Post Type Creation**: Create WordPress posts or custom post types directly from form submissions. @@ -217,7 +221,7 @@ Customize form appearance with advanced styling options when embedding forms via #### Integrations & Automation [**Advanced Native Integrations**](https://sureforms.com/integrations/): -Connect your forms natively with top apps and services to automate workflows and save time without any third-party add-ons or plugins. +Connect your forms natively with top apps and services to automate workflows and save time — no third-party add-ons or plugins required. SureForms connects natively with: - Google Sheets @@ -264,23 +268,23 @@ Customize form appearance directly within your favorite page builder: - Bricks Builder — styling options in the Bricks panel - Elementor — styling controls in the Elementor widget -With SureForms, we are here to fix some real issues users face with WordPress Forms. That's why **300,000+ websites** have embraced SureForms for all their form related needs. +With SureForms, we are here to fix the real issues users face with WordPress forms. That's why **500,000+ websites** have embraced SureForms for all their form-related needs. ### HOW IT WORKS ❓ From installation to creating your first form, SureForms is designed to be simple and intuitive. Here is how it works: -#### Step 1: Install WordPress Plugin 🔌 +#### Step 1: Install the SureForms WordPress Plugin 🔌 From your WordPress dashboard, navigate to the Plugins menu and click on the "Add New" button. Search for the SureForms plugin, then click "Install Now" and "Activate". -#### Step 2: Build your Form ⚙️ +#### Step 2: Build Your Form with Drag and Drop ⚙️ -Once the plugin is installed, you will be redirected to the SureForms dashboard page in your WordPress dashboard. There you will find a button to create a new form. Click it to build and customize your form using the SureForms interface to suit your requirements. +Once the plugin is installed, you'll be redirected to the SureForms dashboard page in your WordPress dashboard. There you will find a button to create a new form. Click it to build and customize your form using the SureForms drag-and-drop interface to suit your requirements. -#### Step 3: Embed/Publish your Form 📄 +#### Step 3: Embed or Publish Your Form 📄 -Once your form is ready, easily embed it on any page or post using the provided shortcode or block. Or, you can use the 'Instant Form' option to make it live instantly. +Once your form is ready, easily embed it on any page or post using the provided shortcode or block. Or, you can use the 'Instant Form' option to make it live instantly with a shareable link. ### WHO CAN BENEFIT FROM SUREFORMS? @@ -334,18 +338,6 @@ Don't think this is just it. There is no limit to the types of businesses and or - Divi Builder - And many more -### BRANDING GUIDELINE - -#### SureForms® is a registered trademark. Please use the following format when mentioning SureForms anywhere: - -- SureForms \[correct\] -- Sure Forms \[incorrect\] -- Sureform \[incorrect\] -- Sureforms \[incorrect\] -- Sure forms \[incorrect\] -- SureForm \[incorrect\] -- Sure Form \[incorrect\] - ### CONNECT WITH OUR TEAM AND COMMUNITY [Join our Facebook group community](https://www.facebook.com/groups/surecart): @@ -369,140 +361,146 @@ To improve the user experience, SureForms may use the following 3rd party servic - **Stripe** -- is used for processing payment forms. [TOS](https://stripe.com/legal/ssa) and [Privacy Policy](https://stripe.com/privacy) +### BRANDING GUIDELINE + +#### SureForms® is a registered trademark. Please use the following format when mentioning SureForms anywhere: + +- SureForms \[correct\] +- Sure Forms \[incorrect\] +- Sureform \[incorrect\] +- Sureforms \[incorrect\] +- Sure forms \[incorrect\] +- SureForm \[incorrect\] +- Sure Form \[incorrect\] + ## Blocks ## This plugin provides 16 blocks for all users: -- **Address:** Displays a SureForms Address Field +- **Address Field:** Add a full-address input to your WordPress contact form, with line 1, line 2, city, state, postal code, and country. -- **Phone Number:** Displays a SureForms Phone Field +- **Phone Number Field:** Collect international phone numbers in your forms with built-in country code detection and validation. -- **Email:** Displays a SureForms Email Field +- **Email Field:** Add an email input to your contact form, with real-time validation and built-in spam protection. -- **Textarea:** Displays a SureForms Textarea Field +- **Textarea Field:** Capture long-form responses, comments, or messages in your WordPress forms with a resizable text area. -- **Number:** Displays a SureForms Number Field +- **Number Field:** Collect numeric input such as age, quantity, or price in your form with min, max, and step controls. -- **URL:** Displays a SureForms URL Field +- **URL Field:** Let users submit website addresses with automatic URL validation in your forms. -- **Dropdown:** Displays a SureForms Dropdown Field +- **Dropdown Field:** Add a single-select dropdown to your WordPress form, with customizable options and dynamic values. -- **Custom Button:** Displays a SureForms Custom Button +- **Custom Button Block:** Add a styled submit or action button to your SureForms layout. -- **Text:** Displays a SureForms Text Field +- **Text Field:** Add a single-line text input for short answers like names, titles, or short responses. -- **Multiple Choice:** Displays a SureForms Multiple Choice Field +- **Multiple Choice Field:** Let users pick one option from a list of radio choices in your WordPress form. -- **Checkbox:** Displays a SureForms Check Box Field +- **Checkbox Field:** Add single or multiple checkbox options to capture preferences, agreements, or selections. -- **Separator:** Displays a SureForms Separator Field +- **Separator:** Add a visual divider to organize fields and sections inside your SureForms form. -- **Heading:** Displays a SureForms Heading Field +- **Heading:** Add section headings to give your form structure and improve readability. -- **Image:** Displays a SureForms Upload Image Field +- **Image:** Display an image inside your form to add visual context, branding, or instructions. -- **Icon:** Displays a SureForms Icon Field +- **Icon:** Add an icon to your form for visual polish and brand consistency. -- **GDPR Agreement:** Displays a SureForms GDPR Agreement Field +- **GDPR Agreement Field:** Add a GDPR consent checkbox to your WordPress contact form to stay compliant with data privacy laws. ## Frequently Asked Questions ## +### Is SureForms free? ### + +Yes! SureForms is 100% free to download and use on the WordPress.org plugin directory. The free version includes the AI form builder, contact forms, payment forms via Stripe, GDPR compliance, anti-spam protection, native integrations, and 15+ form fields. Advanced features like multi-step forms, conversational forms, quizzes, surveys, file uploads, and PayPal payments are available with SureForms Business. + +### How is SureForms different from other WordPress form plugins? ### + +SureForms is the first AI-powered form builder built natively on the WordPress block editor. Most form plugins ship with their own proprietary builder you have to learn from scratch. SureForms uses the Gutenberg interface you already know, adds AI form generation so you can build a form from a single prompt, and includes payment forms, conditional logic, and native integrations in a clean, modern design. It's the modern alternative to legacy contact form plugins on WordPress. + +### How is SureForms different from Contact Form 7? ### + +Contact Form 7 is a long-trusted plugin, but it relies on shortcodes and requires manual HTML for advanced layouts. SureForms is fully visual, drag-and-drop, mobile-first, and includes payment forms, AI form generation, conditional logic, and design controls out of the box — without needing add-ons. If you're upgrading from Contact Form 7, SureForms gives you a modern WordPress form-building experience without the technical setup. + +### Does SureForms work with Elementor, Bricks, and Divi? ### + +Yes. SureForms works seamlessly with Elementor, Bricks Builder, Divi Builder, Beaver Builder, and any other major WordPress page builder. SureForms Business also adds dedicated styling controls inside the Elementor widget and the Bricks element so you can match your form's appearance to your site's design without writing CSS. + ### Do I need coding skills to create forms using SureForms? ### **No coding needed!** -With SureForms' visual block builder, you can drag and drop Gutenberg -blocks to create beautiful, responsive forms. Perfect for small business -owners, freelancers, or anyone who wants forms without technical skills. +With SureForms' visual block builder, you can drag and drop Gutenberg blocks to create beautiful, responsive WordPress forms. Perfect for small business owners, freelancers, designers, or anyone who wants forms without technical skills. ### What are the requirements to use SureForms? ### -You just need the latest version of WordPress and a theme. SureForms -installs like any other plugin and is ready to use. +You just need the latest version of WordPress and any theme. SureForms installs like any other plugin and is ready to use within seconds. + +### Can I use SureForms along with a Page Builder? ### -### Can I use the SureForms along with a Page Builder? ### +Yes. SureForms only requires the latest WordPress version and works seamlessly with all major page builders — Elementor, Bricks, Divi, Beaver Builder, and more — without interference. -SureForms only requires the latest WordPress version and works -seamlessly with all major page builders without interference. +Should you need help, you can [get in touch with us.](https://support.brainstormforce.com/?utm_source=wp-repo&utm_medium=link&utm_campaign=readme) -Should you need help, you can [get in touch with -us.](https://support.brainstormforce.com/?utm_source=wp-repo&utm_medium=link&utm_campaign=readme) +### Will SureForms slow down my website? ### -### Will the SureForms slow down my website? ### +Absolutely not. SureForms is lightweight and fast, built with clean code and modular architecture to ensure it never slows down your WordPress site. -Absolutely not! SureForms is lightweight and fast, built with clean -code and modular architecture to ensure it never slows down your -website. +### Can I use SureForms on client websites? ### -### Can I use the SureForms on client websites? ### +Yes. You can use SureForms on your own sites as well as on your clients' websites — no licensing restrictions on the free version. -Yes! You can certainly use SureForms on your own as well as your -client's websites. +### What more do I get with SureForms? ### -### What more do I get with the SureForms? ### +When you use SureForms, you get a huge library of ready-to-use form templates that can be used to build your forms fast — contact forms, payment forms, lead generation forms, registration forms, and many more. -When you use SureForms, you get a huge library of ready-to-use form -templates that can be used to build your forms fast. +### Does SureForms support Multi-step Forms or Conversational Forms? ### -### Does SureForms support Multi-step Forms or Conversational Forms? +Yes. You can easily create Multi-step Forms as well as Conversational Forms to improve user experience and conversion rates with SureForms Business plans. -Yes. You can easily create Multi-step Forms as well as Conversational -Forms to improve user experience and conversion rates with SureForms Business -plans. -### ### Can I create quiz forms with SureForms? ### -Yes! SureForms Business includes a Quiz module. You can create scored quizzes with grading and personality tests with result output — all with the same drag-and-drop builder. +Yes. SureForms Business includes a Quiz module. You can create scored quizzes with grading and personality tests with result output — all with the same drag-and-drop builder. ### Does SureForms support file uploads? ### -Yes! With SureForms Business, you can add file upload fields to your forms. It supports multi-file uploads, file type restrictions, and role-based access control for uploaded files. +Yes. With SureForms Business, you can add file upload fields to your forms. It supports multi-file uploads, file type restrictions, and role-based access control for uploaded files. ### What integrations does SureForms support? ### -SureForms Business connects natively with services including Google Sheets, Mailchimp, HubSpot, ActiveCampaign, Klaviyo, Zoho CRM, Notion, and many more. You can also use Zapier to connect with 5,000+ additional apps, or use webhooks to send data to any API endpoint. +SureForms connects natively with services including Google Sheets, Mailchimp, HubSpot, ActiveCampaign, Klaviyo, FluentCRM, Zoho CRM, Notion, and many more. You can also use Zapier to connect with 5,000+ additional apps, or use webhooks to send data to any API endpoint. ### Does SureForms support Payment Forms? ### -Yes! SureForms has built-in Payment Form support. -You can collect payments securely through Stripe in the free version. PayPal payments are available with SureForms Business. No add-ons or extra plugins needed. +Yes. SureForms has built-in Payment Form support. You can collect payments securely through Stripe in the free version. PayPal payments are available with SureForms Business. No add-ons or extra plugins needed. ## Screenshot ## -1. SureForms Dashboard -2. Start building your forms within minutes using SureForms. You can build a form from scratch or choose AI to build one for you. -3. Build forms instantly with just a prompt. AI creates your forms with smart field suggestions. Then add, remove, or rearrange fields as you need. -4. Beautify your forms with Instant Form Styling and a wide range of Block and Form Settings to customize every detail. -5. Lastly, publish your forms instantly or easily embed forms in any pages with SureForms' native block. +1. SureForms dashboard — manage all your WordPress forms in one place with form analytics, entries, and quick actions. +2. Start building your forms within minutes using SureForms. Build a form from scratch with drag and drop, or let AI generate one for you from a simple prompt. +3. AI form builder for WordPress — describe the form you need and SureForms creates it instantly with smart field suggestions. Add, remove, or rearrange fields as you need. +4. Beautify your forms with Instant Form Styling and a wide range of Block and Form Settings — customize colors, typography, spacing, and every visual detail. +5. Publish your forms instantly with a shareable Instant Form link, or easily embed forms in any page or post using SureForms' native Gutenberg block. -You can report the issue through our [Bug Bounty Program](https://brainstormforce.com/bug-bounty-program/). We collaborate with Patchstack to provide opportunities for researchers to report vulnerabilities. The Patchstack team will help validate, triage, and handle any reported security issues. +You can report security issues through our [Bug Bounty Program](https://brainstormforce.com/bug-bounty-program/). We collaborate with Patchstack to provide opportunities for researchers to report vulnerabilities. The Patchstack team will help validate, triage, and handle any reported security issues. ## Changelog ## -### 2.8.2 - 5th May 2026 ### -* New: Added "Both" payment type so a single form can collect one-time and subscription payments together. -* New: Added Hidden field support for the payment block's dynamic amount. -* New: Added minimum character limit support for the Textarea field. -* Improvement: Added extension hooks for windowed entry caps in form restriction. -* Fix: Fixed AI Form Builder silent failures and replaced generic error messages with clearer feedback. -* Fix: Resolved an issue where the Confirm Email field could silently block form submission when the Email field was not marked as required. -### 2.8.1 - 27th April 2026 ### -* New: Added support for dynamic default values on Dropdown and Multi-Choice fields. -* New: Added {entry_id} smart tag for use in email templates, confirmations, and dynamic content. -* Improvement: Added PLN (Polish Złoty) to the currency dropdown. -* Fix: Fixed background color not applying correctly in non-iframe editor mode. -* Fix: Fixed MCP endpoint REST URL resolution so it uses the correct site URL. -* Fix: Fixed Phone field country flag unexpectedly changing during browser autocomplete. -* Fix: Fixed review/validation issues in Global Settings. -### 2.8.0 - 16th April 2026 ### -* New: Added My Account page allowing users to view and manage their payment history and subscriptions. -* Improvement: Phone number country detection moved to backend with caching, reducing multiple API calls. -* Fix: Fixed payment method radio button display issue when both Stripe and PayPal gateways are enabled. -* Fix: Fixed crash when saving a form containing the Register block. -* Fix: Fixed inability to deselect a preselected option in single-selection controls (radio, dropdown) within the editor. -* Fix: Fixed Quill rich text editor toolbar strings not being translatable. +### 2.10.1 - 1st June 2026 ### +* Improvement: Improved compatibility with older Block API versions so the SureForms editor loads reliably across WordPress environments. +* Fix: Resolved an issue where the Textarea character counter was misaligned. +* Fix: Resolved an issue where the {entry_id} smart tag failed to resolve in email notifications. +### 2.10.0 - 27th May 2026 ### +* New: Added a live character counter to Textarea fields. +* New: Added a one-click converter that turns raw HTML forms into native SureForms in gutenberg editor. +* Improvement: Added dynamic default value support for multi-select Dropdown and Multi-Choice fields. +* Improvement: Entry URL now records actual submission page. +* Fix: CSV export was stripping line breaks from Textarea submissions. +### 2.9.1 - 19th May 2026 ### +* Improvement: Added compatibility with WordPress 7.0. The full changelog is available [here](https://sureforms.com/whats-new/). ## Upgrade Notice ## ### 0.0.13 ### -From version 0.0.13 we're migrating to a custom database to enhance SureForms' performance and features. This step is necessary and irreversible and your current existing entries will be lost. Thank you for your understanding! +From version 0.0.13 we're migrating to a custom database to enhance SureForms' performance and features. This step is necessary and irreversible and your current existing entries will be lost. Thank you for your understanding! \ No newline at end of file diff --git a/TECHNICAL_OVERVIEW.md b/TECHNICAL_OVERVIEW.md deleted file mode 100644 index 9d2d44140..000000000 --- a/TECHNICAL_OVERVIEW.md +++ /dev/null @@ -1,393 +0,0 @@ -# SureForms Technical Overview - -## Introduction - -SureForms is a modern WordPress form builder plugin that leverages the native WordPress block editor (Gutenberg) to provide an intuitive, no-code form building experience. This document provides a comprehensive technical overview of the plugin's architecture, components, and functionality. - -## Table of Contents - -1. [Plugin Architecture](#plugin-architecture) -2. [Core Components](#core-components) -3. [Database Structure](#database-structure) -4. [Form Building System](#form-building-system) -5. [Form Submission Process](#form-submission-process) -6. [AI Integration](#ai-integration) -7. [Security Features](#security-features) -8. [Extension Points](#extension-points) -9. [Performance Considerations](#performance-considerations) -10. [Future Development](#future-development) - -## Plugin Architecture - -SureForms follows a modular architecture pattern with clear separation of concerns. The plugin is structured around several key components that interact through well-defined interfaces. - -### Directory Structure - -``` -sureforms/ -├── admin/ # Admin-specific functionality -├── api/ # REST API endpoints -├── assets/ # CSS, JS, and other assets -├── inc/ # Core functionality -│ ├── ai-form-builder/ # AI form generation -│ ├── blocks/ # Block registration -│ ├── compatibility/ # Theme/plugin compatibility -│ ├── database/ # Custom database tables -│ ├── email/ # Email notification system -│ ├── fields/ # Form field definitions -│ ├── global-settings/ # Global plugin settings -│ ├── lib/ # Third-party libraries -│ ├── page-builders/ # Page builder integrations -│ ├── single-form-settings/ # Form-specific settings -│ └── traits/ # Shared PHP traits -├── languages/ # Internationalization files -├── modules/ # Feature modules -│ ├── gutenberg/ # Gutenberg integration -│ └── quick-action-sidebar/ # Quick action UI -├── src/ # JavaScript source files -│ ├── admin/ # Admin JS -│ ├── blocks/ # Block JS -│ ├── components/ # Reusable React components -│ ├── lib/ # JS libraries -│ ├── store/ # Redux store -│ ├── styles/ # SCSS files -│ └── utils/ # Utility functions -└── templates/ # Template files -``` - -### Initialization Flow - -The plugin follows a structured initialization process: - -1. `sureforms.php` - Main plugin file that defines constants and includes the plugin loader -2. `plugin-loader.php` - Initializes the plugin and registers core components -3. Core components are loaded through the `Plugin_Loader` class using autoloading -4. WordPress hooks are registered to integrate with the WordPress lifecycle - -```mermaid -graph TD - A[sureforms.php] --> B[plugin-loader.php] - B --> C[Plugin_Loader class] - C --> D[Register hooks] - C --> E[Autoload classes] - C --> F[Load textdomain] - D --> G[Init core components] - G --> H[Post_Types] - G --> I[Form_Submit] - G --> J[Block_Patterns] - G --> K[Frontend_Assets] - G --> L[AI_Form_Builder] - G --> M[Rest_Api] -``` - -## Core Components - -### Plugin_Loader - -The central initialization class that bootstraps the plugin, registers hooks, and loads core components. It follows a singleton pattern to ensure only one instance exists. - -```php -class Plugin_Loader { - private static $instance = null; - - public static function get_instance() { - if (null === self::$instance) { - self::$instance = new self(); - do_action('srfm_core_loaded'); - } - return self::$instance; - } - - // Initialization methods... -} -``` - -### Post_Types - -Registers and manages custom post types for forms and entries. Handles the admin UI customizations for these post types. - -Key features: -- Registers `sureforms_form` post type for storing form configurations -- Adds custom columns to the admin list view -- Implements shortcode functionality -- Manages form metadata registration - -### Form_Submit - -Processes form submissions through REST API endpoints, validates input data, handles file uploads, processes anti-spam measures, and triggers email notifications. - -Key features: -- Registers `/sureforms/v1/submit-form` REST API endpoint -- Validates form submissions against defined rules -- Processes file uploads with security checks -- Handles anti-spam measures (honeypot, reCAPTCHA, hCaptcha, Cloudflare Turnstile) -- Stores submissions in the database -- Triggers email notifications - -### AI_Form_Builder - -Integrates with AI services to generate form structures based on user prompts. Communicates with middleware services to process AI requests. - -Key features: -- Processes natural language descriptions into form structures -- Maps AI-generated fields to SureForms field types -- Generates block structures for the editor - -## Database Structure - -SureForms uses both WordPress custom post types and custom database tables to store data efficiently. - -### Custom Post Types - -- **sureforms_form**: Stores form configurations - - Post content: Serialized blocks representing the form structure - - Post meta: Form settings, styling options, and other configuration data - -### Custom Database Tables - -- **{prefix}_srfm_entries**: Stores form submissions - - ID: Primary key - - form_id: Associated form ID - - user_id: Submitter's user ID (if logged in) - - form_data: JSON-encoded submission data - - submission_info: Browser, IP, and device information - - status: Entry status (read, unread, trash) - - logs: Activity logs for the entry - - created_at: Submission timestamp - -```mermaid -erDiagram - FORMS ||--o{ ENTRIES : "has" - FORMS { - int ID - string post_title - text post_content - string post_status - datetime post_date - } - ENTRIES { - int ID - int form_id - int user_id - json form_data - json submission_info - string status - json logs - datetime created_at - } - FORMS ||--o{ FORM_META : "has" - FORM_META { - int meta_id - int post_id - string meta_key - mixed meta_value - } -``` - -## Form Building System - -SureForms uses WordPress's block editor as the foundation for its form builder. - -### Block Structure - -Forms are composed of various block types: - -- **Container Blocks**: Group and organize form fields -- **Field Blocks**: Individual form inputs (text, email, checkbox, etc.) -- **Layout Blocks**: Control the visual arrangement of fields -- **Special Blocks**: Submit buttons, GDPR notices, etc. - -Each block has its own edit and save components, following the WordPress block API pattern. - -### Block Registration - -Blocks are registered using the WordPress block registration API: - -```javascript -registerBlockType('sureforms/input', { - title: __('Text Field', 'sureforms'), - icon: 'text', - category: 'sureforms', - attributes: { - // Block attributes - }, - edit: Edit, - save: Save -}); -``` - -### Form Rendering - -Forms are rendered on the frontend using a combination of server-side rendering and client-side JavaScript: - -1. The form shortcode or block triggers the `Generate_Form_Markup::get_form_markup()` method -2. The method retrieves the form configuration and generates the HTML markup -3. Frontend JavaScript initializes the form functionality (validation, submission, etc.) - -## Form Submission Process - -### Client-Side Flow - -1. User fills out the form -2. Client-side validation checks for errors -3. Form data is collected and serialized -4. AJAX request is sent to the REST API endpoint -5. Response is processed and appropriate feedback is shown to the user - -### Server-Side Flow - -1. REST API endpoint receives the form submission -2. Data is validated and sanitized -3. Anti-spam checks are performed -4. If GDPR compliance is enabled, appropriate data handling is applied -5. Submission is stored in the database (unless configured not to) -6. Email notifications are triggered -7. Response is sent back to the client - -```mermaid -sequenceDiagram - participant User - participant Browser - participant REST_API - participant Database - participant Email - - User->>Browser: Fill form - Browser->>Browser: Validate input - User->>Browser: Submit form - Browser->>REST_API: POST /sureforms/v1/submit-form - REST_API->>REST_API: Validate data - REST_API->>REST_API: Anti-spam check - REST_API->>Database: Store submission - REST_API->>Email: Send notifications - REST_API->>Browser: Return response - Browser->>User: Show confirmation -``` - -## AI Integration - -SureForms features an AI-powered form generation system that allows users to create forms by describing them in natural language. - -### AI Form Generation Process - -1. User provides a description of the desired form -2. The description is sent to the AI middleware -3. AI analyzes the description and generates a structured form definition -4. The form definition is mapped to SureForms field types -5. Blocks are generated and inserted into the editor -6. User can review and modify the generated form - -### AI Middleware - -The AI middleware acts as a bridge between SureForms and the AI service: - -1. Receives the form description from SureForms -2. Processes the description using AI models -3. Returns a structured form definition -4. Handles authentication and rate limiting - -## Security Features - -SureForms implements multiple security measures to protect against common vulnerabilities: - -### Anti-Spam Protection - -- **Honeypot Fields**: Hidden fields to catch automated submissions -- **reCAPTCHA Integration**: Multiple versions of Google reCAPTCHA -- **hCaptcha Support**: Alternative to reCAPTCHA -- **Cloudflare Turnstile**: Modern CAPTCHA alternative - -### Data Protection - -- **GDPR Compliance**: Options to enable GDPR-compliant data handling -- **Data Encryption**: Sensitive data can be encrypted in storage -- **Auto-Delete Entries**: Automatic deletion of entries after a specified period - -### Input Validation - -- **Client-Side Validation**: Immediate feedback to users -- **Server-Side Validation**: Thorough validation of all submitted data -- **File Upload Security**: Strict file type and size validation - -## Extension Points - -SureForms provides several extension points for developers: - -### WordPress Hooks - -```php -// Example of filter hook for email notification -add_filter('srfm_email_notification', function($parsed, $submission_data, $item, $form_data) { - // Modify email content or recipients - return $parsed; -}, 10, 4); - -// Example of action hook before form submission -add_action('srfm_before_submission', function($form_data) { - // Perform custom actions before form processing -}); -``` - -### JavaScript API - -```javascript -// Example of extending the form validation -window.sureFormsHooks.addFilter( - 'srfm.validation.rules', - 'my-plugin/custom-validation', - function(rules, fieldData) { - // Add custom validation rules - return rules; - } -); -``` - -## Performance Considerations - -SureForms is designed with performance in mind: - -### Asset Loading - -- CSS and JavaScript assets are loaded only when needed -- Assets are minified and optimized for production -- Critical CSS is inlined for faster rendering - -### Database Optimization - -- Custom database tables with appropriate indexes -- Efficient queries with proper WHERE clauses -- Caching of frequently accessed data - -### Form Rendering - -- Server-side rendering for initial form display -- Progressive enhancement for JavaScript features -- Lazy loading of heavy components - -## Future Development - -Planned enhancements for future versions: - -1. **Enhanced AI Capabilities** - - More sophisticated form generation - - AI-powered form analytics - -2. **Advanced Integrations** - - More third-party service integrations - - Improved CRM connections - -3. **Performance Optimizations** - - Further asset optimization - - Enhanced caching strategies - -4. **Accessibility Improvements** - - Better screen reader support - - Keyboard navigation enhancements - -5. **Developer Tools** - - More comprehensive API documentation - - Additional extension points - -## Conclusion - -SureForms represents a modern approach to WordPress form building, combining the power of the block editor with advanced features like AI form generation. Its modular architecture and extensive extension points make it both user-friendly and developer-friendly, while its focus on security and performance ensures a reliable experience for all users. diff --git a/admin/admin.php b/admin/admin.php index bc68cef59..c8e5efd78 100644 --- a/admin/admin.php +++ b/admin/admin.php @@ -10,10 +10,12 @@ use Astra_Notices; use SRFM\Inc\AI_Form_Builder\AI_Helper; use SRFM\Inc\Database\Tables\Entries; +use SRFM\Inc\Global_Settings\Global_Settings; use SRFM\Inc\Helper; use SRFM\Inc\Onboarding; use SRFM\Inc\Payments\Payment_Helper; use SRFM\Inc\Payments\Stripe\Stripe_Helper; +use SRFM\Inc\Smart_Tags; use SRFM\Inc\Traits\Get_Instance; if ( ! defined( 'ABSPATH' ) ) { @@ -78,6 +80,7 @@ public function __construct() { if ( ! Helper::has_pro() ) { add_action( 'admin_menu', [ $this, 'add_quiz_page' ] ); add_action( 'admin_menu', [ $this, 'add_survey_reports_page' ] ); + add_action( 'admin_menu', [ $this, 'add_partial_entries_page' ] ); add_action( 'admin_menu', [ $this, 'add_upgrade_to_pro' ] ); add_action( 'admin_footer', [ $this, 'add_upgrade_to_pro_target_attr' ] ); } @@ -230,12 +233,7 @@ public static function check_first_form_creation_threshold( $days = 3 ) { public function add_action_links( $links ) { if ( ! Helper::has_pro() ) { // Display upsell link if SureForms Pro is not installed. - $upsell_link = add_query_arg( - [ - 'utm_medium' => 'plugin-list', - ], - Helper::get_sureforms_website_url( 'pricing' ) - ); + $upsell_link = Helper::get_sureforms_website_url( 'pricing', [ 'utm_medium' => 'plugin-list' ] ); ob_start(); ?> @@ -397,12 +395,7 @@ public function add_upgrade_to_pro_target_attr() { public function add_upgrade_to_pro() { // The url used here is used as a selector for css to style the upgrade to pro submenu. // If you are changing this url, please make sure to update the css as well. - $upgrade_url = add_query_arg( - [ - 'utm_medium' => 'submenu_link_upgrade', - ], - Helper::get_sureforms_website_url( 'upgrade' ) - ); + $upgrade_url = Helper::get_sureforms_website_url( 'upgrade', [ 'utm_medium' => 'submenu_link_upgrade' ] ); add_submenu_page( 'sureforms_menu', @@ -479,6 +472,39 @@ public function render_survey_empty_state() { ' . + esc_html__( 'New', 'sureforms' ) . + '', + self::$sureforms_page_default_capability, + 'sureforms_partial_entries', + [ $this, 'render_partial_entries_empty_state' ], + 7 + ); + } + + /** + * Partial Entries empty state page callback. + * + * @return void + * @since 2.9.0 + */ + public function render_partial_entries_empty_state() { + ?> +
+ get_site_url(), - 'current_user_login' => $current_user->user_login ?? '', - 'website_lead_details' => [ + 'site_url' => get_site_url(), + 'current_user_login' => $current_user->user_login ?? '', + 'website_lead_details' => [ 'first_name' => $current_user->first_name ?? '', 'last_name' => $current_user->last_name ?? '', 'email' => $current_user->user_email ?? '', ], - 'breadcrumbs' => $this->get_breadcrumbs_for_current_page(), - 'sureforms_dashboard_url' => admin_url( '/admin.php?page=sureforms_menu' ), - 'plugin_version' => SRFM_VER, - 'global_settings_nonce' => Helper::current_user_can() ? wp_create_nonce( 'wp_rest' ) : '', - 'is_pro_active' => Helper::has_pro(), - 'is_first_form_created' => self::is_first_form_created(), - 'check_three_days_threshold' => self::check_first_form_creation_threshold(), - 'check_eight_days_threshold' => self::check_first_form_creation_threshold( 8 ), - 'pro_plugin_version' => Helper::has_pro() ? SRFM_PRO_VER : '', - 'pro_plugin_name' => Helper::has_pro() && defined( 'SRFM_PRO_PRODUCT' ) ? SRFM_PRO_PRODUCT : 'SureForms Pro', - 'sureforms_pricing_page' => Helper::get_sureforms_website_url( 'pricing' ), - 'field_spacing_vars' => Helper::get_css_vars(), - 'is_ver_lower_than_6_7' => version_compare( $wp_version, '6.6.2', '<=' ), - 'integrations' => Helper::sureforms_get_integration(), - 'rotating_plugin_banner' => Helper::get_rotating_plugin_banner(), - 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'sf_plugin_manager_nonce' => wp_create_nonce( 'sf_plugin_manager_nonce' ), - 'plugin_installer_nonce' => wp_create_nonce( 'updates' ), - 'plugin_activating_text' => __( 'Activating...', 'sureforms' ), - 'plugin_activated_text' => __( 'Activated', 'sureforms' ), - 'plugin_activate_text' => __( 'Activate', 'sureforms' ), - 'plugin_installing_text' => __( 'Installing...', 'sureforms' ), - 'plugin_installed_text' => __( 'Installed', 'sureforms' ), - 'privacy_policy_url' => Helper::get_sureforms_website_url( 'privacy-policy/' ), - 'is_rtl' => $is_rtl, - 'onboarding_completed' => method_exists( $onboarding_instance, 'get_onboarding_status' ) ? $onboarding_instance->get_onboarding_status() : false, - 'onboarding_redirect' => isset( $_GET['srfm-activation-redirect'] ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce is not required for the activation redirection. - 'pointer_nonce' => wp_create_nonce( 'sureforms_pointer_action' ), - 'general_settings_url' => admin_url( '/options-general.php' ), - 'additional_header_nav_items' => [], - 'payments' => apply_filters( + 'breadcrumbs' => $this->get_breadcrumbs_for_current_page(), + 'sureforms_dashboard_url' => admin_url( '/admin.php?page=sureforms_menu' ), + 'plugin_version' => SRFM_VER, + 'global_settings_nonce' => Helper::current_user_can() ? wp_create_nonce( 'wp_rest' ) : '', + 'is_pro_active' => Helper::has_pro(), + 'is_first_form_created' => self::is_first_form_created(), + 'check_three_days_threshold' => self::check_first_form_creation_threshold(), + 'check_eight_days_threshold' => self::check_first_form_creation_threshold( 8 ), + 'pro_plugin_version' => Helper::has_pro() ? SRFM_PRO_VER : '', + 'pro_plugin_name' => Helper::has_pro() && defined( 'SRFM_PRO_PRODUCT' ) ? SRFM_PRO_PRODUCT : 'SureForms Pro', + 'sureforms_pricing_page' => Helper::get_sureforms_website_url( 'pricing' ), + 'field_spacing_vars' => Helper::get_css_vars(), + 'is_ver_lower_than_6_7' => version_compare( $wp_version, '6.6.2', '<=' ), + 'integrations' => Helper::sureforms_get_integration(), + 'rotating_plugin_banner' => Helper::get_rotating_plugin_banner(), + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'sf_plugin_manager_nonce' => wp_create_nonce( 'sf_plugin_manager_nonce' ), + 'plugin_installer_nonce' => wp_create_nonce( 'updates' ), + 'plugin_activating_text' => __( 'Activating...', 'sureforms' ), + 'plugin_activated_text' => __( 'Activated', 'sureforms' ), + 'plugin_activate_text' => __( 'Activate', 'sureforms' ), + 'plugin_installing_text' => __( 'Installing...', 'sureforms' ), + 'plugin_installed_text' => __( 'Installed', 'sureforms' ), + 'privacy_policy_url' => Helper::get_sureforms_website_url( 'privacy-policy/' ), + 'is_rtl' => $is_rtl, + 'onboarding_completed' => method_exists( $onboarding_instance, 'get_onboarding_status' ) ? $onboarding_instance->get_onboarding_status() : false, + 'onboarding_redirect' => isset( $_GET['srfm-activation-redirect'] ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce is not required for the activation redirection. + 'pointer_nonce' => wp_create_nonce( 'sureforms_pointer_action' ), + 'general_settings_url' => admin_url( '/options-general.php' ), + 'additional_header_nav_items' => [], + // Smart tags for the Global Defaults email notification fields. + // srfm_block_data is only available in the block editor; these keys + // make the same data accessible on the settings page via srfm_admin. + 'smart_tags_array' => Smart_Tags::smart_tag_list(), + 'smart_tags_array_email' => Smart_Tags::email_smart_tag_list(), + // Default confirmation message HTML (icon + heading + text) used as + // the initial React state before the settings API response arrives. + 'default_confirmation_message' => Global_Settings::get_default_confirmation_message(), + 'payments' => apply_filters( 'srfm_admin_localize_payments_data', [ 'stripe_connected' => Stripe_Helper::is_stripe_connected(), @@ -940,22 +974,23 @@ public function enqueue_scripts() { 'currency_sign_position' => Payment_Helper::get_currency_sign_position(), ] ), - 'mcp_adapter_status' => file_exists( WP_PLUGIN_DIR . '/mcp-adapter/mcp-adapter.php' ) + 'mcp_adapter_status' => file_exists( WP_PLUGIN_DIR . '/mcp-adapter/mcp-adapter.php' ) ? ( is_plugin_active( 'mcp-adapter/mcp-adapter.php' ) ? 'active' : 'installed' ) : 'not_installed', - 'mcp_endpoint_url' => esc_url_raw( rest_url( 'sureforms/v1/mcp' ) ), + 'mcp_endpoint_url' => esc_url_raw( rest_url( 'sureforms/v1/mcp' ) ), ]; - $is_screen_sureforms_menu = Helper::validate_request_context( 'sureforms_menu', 'page' ); - $is_screen_add_new_form = Helper::validate_request_context( 'add-new-form', 'page' ); - $is_screen_sureforms_forms = Helper::validate_request_context( 'sureforms_forms', 'page' ); - $is_screen_sureforms_form_settings = Helper::validate_request_context( 'sureforms_form_settings', 'page' ); - $is_screen_sureforms_payments = Helper::validate_request_context( 'sureforms_payments', 'page' ); - $is_screen_sureforms_entries = Helper::validate_request_context( SRFM_ENTRIES, 'page' ); - $is_screen_sureforms_learn = Helper::validate_request_context( 'sureforms_learn', 'page' ); - $is_screen_quiz_empty_state = Helper::validate_request_context( 'sureforms_quiz_entries', 'page' ); - $is_screen_survey_empty_state = Helper::validate_request_context( 'sureforms_survey_reports', 'page' ); - $is_post_type_sureforms_form = SRFM_FORMS_POST_TYPE === $current_screen->post_type; + $is_screen_sureforms_menu = Helper::validate_request_context( 'sureforms_menu', 'page' ); + $is_screen_add_new_form = Helper::validate_request_context( 'add-new-form', 'page' ); + $is_screen_sureforms_forms = Helper::validate_request_context( 'sureforms_forms', 'page' ); + $is_screen_sureforms_form_settings = Helper::validate_request_context( 'sureforms_form_settings', 'page' ); + $is_screen_sureforms_payments = Helper::validate_request_context( 'sureforms_payments', 'page' ); + $is_screen_sureforms_entries = Helper::validate_request_context( SRFM_ENTRIES, 'page' ); + $is_screen_sureforms_learn = Helper::validate_request_context( 'sureforms_learn', 'page' ); + $is_screen_quiz_empty_state = Helper::validate_request_context( 'sureforms_quiz_entries', 'page' ); + $is_screen_survey_empty_state = Helper::validate_request_context( 'sureforms_survey_reports', 'page' ); + $is_screen_partial_entries_empty_state = Helper::validate_request_context( 'sureforms_partial_entries', 'page' ); + $is_post_type_sureforms_form = SRFM_FORMS_POST_TYPE === $current_screen->post_type; /** * Check if the current screen is the SureForms Menu and AI Auth Email is present then we will add user type as registered. @@ -980,9 +1015,14 @@ public function enqueue_scripts() { 'text' => __( 'Survey Reports', 'sureforms' ), 'link' => admin_url( 'admin.php?page=sureforms_survey_reports' ), ]; + $localization_data['additional_header_nav_items'][] = [ + 'slug' => 'sureforms_partial_entries', + 'text' => __( 'Partial Entries', 'sureforms' ), + 'link' => admin_url( 'admin.php?page=sureforms_partial_entries' ), + ]; } - $is_sureforms_screen = $is_screen_sureforms_menu || $is_post_type_sureforms_form || $is_screen_add_new_form || $is_screen_sureforms_forms || $is_screen_sureforms_form_settings || $is_screen_sureforms_entries || $is_screen_sureforms_payments || $is_screen_sureforms_learn || $is_screen_quiz_empty_state || $is_screen_survey_empty_state; + $is_sureforms_screen = $is_screen_sureforms_menu || $is_post_type_sureforms_form || $is_screen_add_new_form || $is_screen_sureforms_forms || $is_screen_sureforms_form_settings || $is_screen_sureforms_entries || $is_screen_sureforms_payments || $is_screen_sureforms_learn || $is_screen_quiz_empty_state || $is_screen_survey_empty_state || $is_screen_partial_entries_empty_state; /** * Filter to allow extending the SureForms dashboard screen check. @@ -1174,6 +1214,24 @@ public function enqueue_scripts() { $script_translations_handlers[] = SRFM_SLUG . '-survey-empty-state'; } + // Enqueue scripts for the Partial Entries empty state page (free users only). + if ( $is_screen_partial_entries_empty_state && ! Helper::has_pro() ) { + $asset_handle = 'partialEntriesEmptyState'; + + $script_asset_path = SRFM_DIR . 'assets/build/' . $asset_handle . '.asset.php'; + $script_info = file_exists( $script_asset_path ) + ? include $script_asset_path + : [ + 'dependencies' => [], + 'version' => SRFM_VER, + ]; + + wp_enqueue_script( SRFM_SLUG . '-partial-entries-empty-state', SRFM_URL . 'assets/build/' . $asset_handle . '.js', $script_info['dependencies'], SRFM_VER, true ); + wp_enqueue_style( SRFM_SLUG . '-partial-entries-empty-state', SRFM_URL . 'assets/build/' . $asset_handle . '.css', [], SRFM_VER, 'all' ); + + $script_translations_handlers[] = SRFM_SLUG . '-partial-entries-empty-state'; + } + // Admin Submenu Styles. wp_enqueue_style( SRFM_SLUG . '-admin', $css_uri . 'backend/admin' . $file_prefix . $rtl . '.css', [], SRFM_VER ); @@ -1198,6 +1256,10 @@ public function enqueue_scripts() { ) ); + // Enqueue Tailwind and Quill editor styles for the settings page. + wp_enqueue_style( SRFM_SLUG . '-settings-build', SRFM_URL . 'assets/build/settings.css', [], SRFM_VER, 'all' ); + wp_enqueue_style( SRFM_SLUG . '-reactQuill', SRFM_URL . 'assets/css/minified/deps/quill/quill.snow.css', [], SRFM_VER ); + $script_translations_handlers[] = SRFM_SLUG . '-settings'; } @@ -2011,12 +2073,7 @@ private function render_dashboard_widget_footer( $entries_data ) { get_random_premium_feature_text() ); ?> 'dashboard-widget', - ], - Helper::get_sureforms_website_url( 'pricing' ) - ); + $upgrade_url = Helper::get_sureforms_website_url( 'pricing', [ 'utm_medium' => 'dashboard-widget' ] ); ?> diff --git a/assets/js/unminified/frontend.js b/assets/js/unminified/frontend.js index 49cfab4cc..e383b5868 100644 --- a/assets/js/unminified/frontend.js +++ b/assets/js/unminified/frontend.js @@ -110,6 +110,69 @@ function srfmSprintfString( str, ...args ) { addGlobalSrfmObject( 'toggleErrorState', toggleErrorState ); addGlobalSrfmObject( 'srfmSprintfString', srfmSprintfString ); +// Character counter for textarea/input fields with min or max length configured. +const SRFM_CHAR_COUNTER_FIELD_SELECTOR = + 'textarea.srfm-input-textarea, input.srfm-input-input'; + +// Refresh a single counter's text and over/under-limit error state from its field's current value. +function updateCharCounter( counter ) { + const block = counter.closest( '.srfm-block' ); + if ( ! block ) { + return; + } + const field = block.querySelector( SRFM_CHAR_COUNTER_FIELD_SELECTOR ); + if ( ! field ) { + return; + } + + const limit = counter.getAttribute( 'data-counter-limit' ); + const min = counter.getAttribute( 'data-counter-min' ); + const len = field.value.length; + + counter.textContent = len + '/' + limit; + + const tooShort = min && len < parseInt( min, 10 ); + const tooLong = limit && len > parseInt( limit, 10 ); + counter.classList.toggle( + 'srfm-char-counter--error', + Boolean( tooShort || tooLong ) + ); +} + +// Initial paint for every counter already in the DOM (handles pre-filled default values). +function initCharCounters() { + document + .querySelectorAll( '.srfm-char-counter' ) + .forEach( updateCharCounter ); +} + +// Delegated input handler so counters keep working for fields added or revealed +// after initial paint — multi-step navigation, conditional logic, and AJAX-loaded forms. +document.addEventListener( 'input', ( e ) => { + const field = e.target; + if ( + ! field || + typeof field.matches !== 'function' || + ! field.matches( SRFM_CHAR_COUNTER_FIELD_SELECTOR ) + ) { + return; + } + const block = field.closest( '.srfm-block' ); + if ( ! block ) { + return; + } + const counter = block.querySelector( '.srfm-char-counter' ); + if ( counter ) { + updateCharCounter( counter ); + } +} ); + +if ( document.readyState === 'loading' ) { + document.addEventListener( 'DOMContentLoaded', initCharCounters ); +} else { + initCharCounters(); +} + // Sender's Email. const emailElements = document.getElementsByClassName( diff --git a/bin/build-zip.sh b/bin/build-zip.sh deleted file mode 100644 index 0bf38a51d..000000000 --- a/bin/build-zip.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -# Exit if any command fails. -set -e - -# Enable nicer messaging for build status. -BLUE_BOLD='\033[1;34m'; -GREEN_BOLD='\033[1;32m'; -RED_BOLD='\033[1;31m'; -YELLOW_BOLD='\033[1;33m'; -COLOR_RESET='\033[0m'; -error () { - echo -e "\n${RED_BOLD}$1${COLOR_RESET}\n" -} -status () { - echo -e "\n${BLUE_BOLD}$1${COLOR_RESET}\n" -} -success () { - echo -e "\n${GREEN_BOLD}$1${COLOR_RESET}\n" -} -warning () { - echo -e "\n${YELLOW_BOLD}$1${COLOR_RESET}\n" -} - - -status "💃 Time to build the plugin ZIP file 🕺" - -if [ ! -d "artifact" ]; then - mkdir "artifact" -fi - - -# Copy files for zip. -rsync -rc --delete --exclude-from ".distignore" "./" "artifact/sureforms" - -# Go to directory -cd artifact - -# Create a zip copied files. -zip -r sureforms.zip "./sureforms" - -if [ "no-clean" != "$1" ]; then - # Removed copied files folder. - rm -rf sureforms -fi - -success "Done. Your sureforms zip is ready..! 🎉" diff --git a/bin/checkout-and-build b/bin/checkout-and-build deleted file mode 100755 index c7529e42e..000000000 --- a/bin/checkout-and-build +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Script to checkout a branch and build the project - -# Check if branch name is provided as an argument -if [ -z "$1" ]; then - echo "Error: No branch name provided." - echo "Usage: ./checkout-and-build.sh " - exit 1 -fi - -# Assign the first argument to a variable -branch_name=$1 - -# Checkout the specified branch -git checkout "$branch_name" - -# pull the latest version -git pull origin "$branch_name" - -# Run the build command -npm run build diff --git a/bin/i18n.sh b/bin/i18n.sh deleted file mode 100644 index 357e3aee1..000000000 --- a/bin/i18n.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# Run release script -#bash bin/i18n.sh - -# Run textdomain updates and generate the POT file -echo "Running textdomain update and POT file generation..." -npm run makepot - -# Update PO files -echo "Updating PO files..." -npm run i18n:po - -# Translate using GPT-PO for Dutch, French, and more -echo "Translating PO files using GPT-PO..." -npm run i18n:gptpo:nl -npm run i18n:gptpo:fr -npm run i18n:gptpo:de -npm run i18n:gptpo:es -npm run i18n:gptpo:it -npm run i18n:gptpo:pt -npm run i18n:gptpo:pl - -# Update PO files again after translation -echo "Updating PO files again..." -npm run i18n:po - -# Generate MO files -echo "Generating MO files..." -npm run i18n:mo - -# Generate JSON translation files -echo "Generating JSON translation files..." -npm run i18n:json - -echo "All commands executed successfully." diff --git a/inc/abilities/ABILITIES.md b/inc/abilities/ABILITIES.md index 158fe3bed..e4f2bd45e 100644 --- a/inc/abilities/ABILITIES.md +++ b/inc/abilities/ABILITIES.md @@ -346,7 +346,8 @@ Complete reference for all 15 abilities registered with the WordPress Abilities "submission_info": { "user_ip": "192.168.1.1", "browser_name": "Chrome", - "device_name": "Desktop" + "device_name": "Desktop", + "submission_url": "https://example.com/contact/" }, "user": { "id": 1, diff --git a/inc/abilities/entries/entry-parser.php b/inc/abilities/entries/entry-parser.php index e3b948dc3..cf40c33be 100644 --- a/inc/abilities/entries/entry-parser.php +++ b/inc/abilities/entries/entry-parser.php @@ -87,9 +87,12 @@ protected function parse_entry( array $entry ) { } $submission_info = [ - 'user_ip' => $ip, - 'browser_name' => (string) ( $submission_info_raw['browser_name'] ?? '' ), - 'device_name' => (string) ( $submission_info_raw['device_name'] ?? '' ), + 'user_ip' => $ip, + 'browser_name' => (string) ( $submission_info_raw['browser_name'] ?? '' ), + 'device_name' => (string) ( $submission_info_raw['device_name'] ?? '' ), + // Re-sanitize at the exposure boundary in case the stored value + // was written by a future code path that bypasses form-submit.php. + 'submission_url' => esc_url_raw( (string) ( $submission_info_raw['submission_url'] ?? '' ), [ 'http', 'https' ] ), ]; // Build user info. diff --git a/inc/abilities/forms/create-form.php b/inc/abilities/forms/create-form.php index a4323e686..b0944f2a7 100644 --- a/inc/abilities/forms/create-form.php +++ b/inc/abilities/forms/create-form.php @@ -331,7 +331,14 @@ public function execute( $input ) { // Get default post meta. $post_metas = Create_New_Form::get_default_meta_keys(); - // Add serialized meta defaults for metadata overrides. + // Pull complex-meta defaults from the registered schemas so created + // forms are identical to hand-created ones. Storing empty arrays/strings + // would override the register_post_meta 'default' values (WordPress only + // uses those defaults when no value is stored at all), causing confirmation + // messages, email notifications, styling, and restriction settings to be + // blank for any form created through this code path. + $registered = get_registered_meta_keys( 'post', SRFM_FORMS_POST_TYPE ); + $post_metas['_srfm_instant_form_settings'] = [ 'bg_type' => 'color', 'bg_color' => '#ffffff', @@ -345,11 +352,11 @@ public function execute( $input ) { 'single_page_form_title' => true, 'use_banner_as_page_background' => false, ]; - $post_metas['_srfm_form_confirmation'] = []; - $post_metas['_srfm_compliance'] = []; - $post_metas['_srfm_forms_styling'] = []; - $post_metas['_srfm_email_notification'] = []; - $post_metas['_srfm_form_restriction'] = ''; + $post_metas['_srfm_form_confirmation'] = $registered['_srfm_form_confirmation']['default'] ?? []; + $post_metas['_srfm_compliance'] = $registered['_srfm_compliance']['default'] ?? []; + $post_metas['_srfm_forms_styling'] = $registered['_srfm_forms_styling']['default'] ?? []; + $post_metas['_srfm_email_notification'] = $registered['_srfm_email_notification']['default'] ?? []; + $post_metas['_srfm_form_restriction'] = $registered['_srfm_form_restriction']['default'] ?? ''; $post_metas['_srfm_form_custom_css'] = ''; // Apply metadata overrides from input. diff --git a/inc/abilities/forms/form-field-schema.php b/inc/abilities/forms/form-field-schema.php index 339df8a84..7c09c8681 100644 --- a/inc/abilities/forms/form-field-schema.php +++ b/inc/abilities/forms/form-field-schema.php @@ -102,6 +102,11 @@ protected function get_form_field_schema() { 'type' => 'integer', 'description' => __( 'Maximum character length.', 'sureforms' ), ], + // `placeholder` — @since 2.10.0 (added alongside the HTML-form converter) + 'placeholder' => [ + 'type' => 'string', + 'description' => __( 'Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown.', 'sureforms' ), + ], ]; /** @@ -143,6 +148,9 @@ protected function sanitize_form_fields( array $fields ) { if ( isset( $field['defaultValue'] ) && is_string( $field['defaultValue'] ) ) { $fields[ $index ]['defaultValue'] = sanitize_text_field( $field['defaultValue'] ); } + if ( isset( $field['placeholder'] ) && is_string( $field['placeholder'] ) ) { + $fields[ $index ]['placeholder'] = sanitize_text_field( $field['placeholder'] ); + } if ( ! empty( $field['fieldOptions'] ) && is_array( $field['fieldOptions'] ) ) { // @phpstan-ignore-next-line -- $field['fieldOptions'] is validated as array above. $field_options = $field['fieldOptions']; diff --git a/inc/admin-ajax.php b/inc/admin-ajax.php index c8d59c244..272f490cf 100644 --- a/inc/admin-ajax.php +++ b/inc/admin-ajax.php @@ -426,7 +426,15 @@ public function download_export_file() { $content_type = 'text/csv'; } elseif ( 'zip' === $file_info['extension'] ) { $content_type = 'application/zip'; - $filename = 'SureForms Entries.zip'; + /** + * Filter the user-facing filename used when serving an exported ZIP archive. + * + * @since 2.9.0 + * + * @param string $filename Default ZIP filename. + * @param array $file_info pathinfo() result for the file being served. + */ + $filename = (string) apply_filters( 'srfm_export_zip_filename', 'SureForms Entries.zip', $file_info ); } } diff --git a/inc/admin/editor-nudge.php b/inc/admin/editor-nudge.php index 87ae268b8..20ed9c096 100644 --- a/inc/admin/editor-nudge.php +++ b/inc/admin/editor-nudge.php @@ -181,13 +181,34 @@ public function enqueue_scripts() { SRFM_VER ); + // Editor nudge UTM attribution — start. + // Tag the "Create Form" CTA with the same UTM scheme used by other + // SureForms nudge links so the destination flow can attribute the + // click. Only fills keys not already present in the URL. + $create_form_url = admin_url( 'admin.php?page=add-new-form' ); + $nudge_utm = [ + 'utm_source' => 'sureforms_plugin', + 'utm_medium' => 'editor_nudge', + 'utm_campaign' => 'core_plugin', + ]; + $existing_args = []; + $query_string = wp_parse_url( $create_form_url, PHP_URL_QUERY ); + if ( is_string( $query_string ) && '' !== $query_string ) { + parse_str( $query_string, $existing_args ); + } + $missing_utm = array_diff_key( $nudge_utm, $existing_args ); + if ( ! empty( $missing_utm ) ) { + $create_form_url = add_query_arg( $missing_utm, $create_form_url ); + } + // Editor nudge UTM attribution — end. + wp_localize_script( $handle, 'srfm_editor_nudge', [ 'ajax_url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( self::NONCE_ACTION ), - 'create_form_url' => admin_url( 'admin.php?page=add-new-form' ), + 'create_form_url' => $create_form_url, 'message' => __( 'Hey! It looks like you\'re creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required.', 'sureforms' ), 'button_label' => __( 'Create Form', 'sureforms' ), 'logo_url' => SRFM_URL . 'admin/assets/sureforms-logo.png', diff --git a/inc/admin/html-form-detector.php b/inc/admin/html-form-detector.php new file mode 100644 index 000000000..5bff593ac --- /dev/null +++ b/inc/admin/html-form-detector.php @@ -0,0 +1,1012 @@ +` markup and offers a one-click conversion to a SureForms form. + * + * This is the free-plugin prototype: detection + UI only. The conversion + * callback in the JS layer currently parses locally and logs the result; + * the AI-assisted REST endpoint that actually creates the form lives in a + * follow-up patch so the detection wiring can be validated independently. + * + * Script is enqueued when: + * - User can manage SureForms forms (same `manage_options` gate as the + * rest of the form-admin surface — there is no point offering a CTA to + * users who cannot create forms). + * - Current screen is the block editor and not the SureForms form CPT + * (we never run on the form editor itself — the source `
` only + * appears on host posts/pages). + * + * @package sureforms. + */ + +namespace SRFM\Inc\Admin; + +use SRFM\Inc\Abilities\Forms\Create_Form; +use SRFM\Inc\AI_Form_Builder\AI_Helper; +use SRFM\Inc\Helper; +use SRFM\Inc\Traits\Get_Instance; +use WP_Error; +use WP_REST_Request; +use WP_REST_Server; + +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + +/** + * HTML form detector handler. + * + * @since 2.10.0 + */ +class Html_Form_Detector { + use Get_Instance; + + /** + * Confidence level below which we route the raw HTML through the AI + * middleware instead of trusting the local parser output. + * + * @since 2.10.0 + */ + public const AI_FALLBACK_CONFIDENCE = 'low'; + + /** + * Hard cap on the size of raw HTML accepted by the conversion endpoint. + * + * Anything larger is almost certainly the entire page rather than a + * single `` and would waste an AI roundtrip on noise. Matches the + * upper bound the AI middleware tolerates for `query` payloads. + * + * @since 2.10.0 + */ + public const MAX_HTML_BYTES = 32768; + + /** + * Constructor. + * + * Registers the REST route only on admin / REST-dispatch requests + * — that is the only context where the route is reachable, and + * gating registration narrows the blast radius if the shared + * `Helper::get_items_permissions_check` is ever loosened by an + * unrelated change. The endpoint also re-checks `manage_options` + * inside the handler so authorization survives both contexts. + * + * @since 2.10.0 + */ + public function __construct() { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + + // Register the REST endpoint unconditionally. The constructor runs on + // the `init` hook (see plugin-loader.php), which fires *before* + // `parse_request` — the point at which WordPress defines + // `REST_REQUEST`. Gating on `REST_REQUEST` here meant the filter was + // never attached for the actual REST dispatch, and the endpoint 404'd. + // `apply_filters( 'srfm_rest_api_endpoints', ... )` is only invoked + // from `Rest_Api::register_endpoints()` on `rest_api_init`, so + // attaching this filter on non-REST requests has no runtime cost. + add_filter( 'srfm_rest_api_endpoints', [ $this, 'register_rest_endpoint' ] ); + } + + /** + * Decide whether the detector script should be loaded for the current request. + * + * @since 2.10.0 + * @return bool + */ + public function allow_load() { + if ( ! is_admin() ) { + return false; + } + + // Gate on the cap required to actually manage SureForms forms — same + // rationale as the Editor_Nudge: never surface a "Convert to + // SureForms" CTA to a user who cannot reach the form-creation flow. + if ( ! Helper::current_user_can( 'manage_options' ) ) { + return false; + } + + $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null; + + if ( ! $screen || ! method_exists( $screen, 'is_block_editor' ) || ! $screen->is_block_editor() ) { + return false; + } + + // Skip on the SureForms form editor itself — the source `` + // markup we look for only appears on host posts/pages. + if ( SRFM_FORMS_POST_TYPE === $screen->post_type ) { + return false; + } + + return true; + } + + /** + * Enqueue the detector script when allowed. + * + * @since 2.10.0 + * @return void + */ + public function enqueue_scripts() { + if ( ! $this->allow_load() ) { + return; + } + + $handle = SRFM_SLUG . '-html-form-detector'; + $asset_path = SRFM_DIR . 'assets/build/htmlFormDetector.asset.php'; + $asset = file_exists( $asset_path ) + ? include $asset_path + : [ + 'dependencies' => [ 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-hooks', 'wp-i18n' ], + 'version' => SRFM_VER, + ]; + + wp_enqueue_script( + $handle, + SRFM_URL . 'assets/build/htmlFormDetector.js', + $asset['dependencies'], + $asset['version'], + true + ); + + wp_localize_script( + $handle, + 'srfm_html_form_detector', + [ + 'rest_nonce' => wp_create_nonce( 'wp_rest' ), + ] + ); + + Helper::register_script_translations( $handle ); + } + + /** + * Register the conversion REST endpoint on the existing SureForms route map. + * + * Hooked into `srfm_rest_api_endpoints` so we land alongside the other + * `sureforms/v1/*` routes without touching `Rest_Api::get_endpoints()` — + * keeping every concern of the detector co-located in this class. + * + * @since 2.10.0 + * @param array> $endpoints Existing endpoints map. + * @return array> + */ + public function register_rest_endpoint( $endpoints ) { + if ( ! is_array( $endpoints ) ) { + $endpoints = []; + } + + $endpoints['convert-html-form'] = [ + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => [ $this, 'handle_convert_html_form' ], + 'permission_callback' => [ Helper::class, 'get_items_permissions_check' ], + 'args' => [ + 'parsed_fields' => [ + 'required' => false, + 'type' => 'array', + 'description' => __( 'Array of fields produced by the editor-side parser.', 'sureforms' ), + ], + 'submit_text' => [ + 'required' => false, + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'default' => '', + ], + 'confidence' => [ + 'required' => false, + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'default' => 'high', + ], + 'html' => [ + 'required' => false, + 'type' => 'string', + 'description' => __( 'Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware.', 'sureforms' ), + ], + 'form_title' => [ + 'required' => false, + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'default' => '', + ], + 'styling' => [ + 'required' => false, + 'type' => 'object', + 'description' => __( 'Best-effort styling descriptor (hex colors) extracted from inline styles on the source .', 'sureforms' ), + ], + ], + ]; + + return $endpoints; + } + + /** + * Convert a raw HTML form into a SureForms form. + * + * Flow: + * - If the editor-side parser returned `confidence === 'low'` AND raw + * HTML is supplied, send the HTML to the AI middleware and use the + * structured schema it returns (hybrid path — AI handles markup the + * deterministic parser could not confidently classify). + * - Otherwise trust the parsed fields and pass them straight to the + * existing `Create_Form` ability so the same code that creates AI- / + * MCP-generated forms also handles this conversion. Means a single + * code path produces the final `sureforms_form` CPT; no parallel + * insert logic to maintain. + * + * @since 2.10.0 + * @param WP_REST_Request $request REST request. + * @return array|\WP_Error + */ + public function handle_convert_html_form( $request ) { + // Capability check runs first — cheaper than `wp_verify_nonce`, + // and the REST framework's `permission_callback` already passed + // at this point, so a failure here means a `current_user_can` + // filter or capability-mapping shim was loosened between the + // permission callback and the handler. Bail early to keep + // the expensive AI middleware path off the table for users who + // could not legitimately complete the action. + if ( ! Helper::current_user_can( 'manage_options' ) ) { + return new WP_Error( + 'srfm_html_convert_forbidden', + __( 'You are not allowed to convert HTML forms.', 'sureforms' ), + [ 'status' => 403 ] + ); + } + + // Nonce check is CSRF defense for the legitimate + // `manage_options` user we just confirmed. Running it after the + // cap check means cap-less requests never pay the + // `hash_hmac`/session-lookup cost of nonce verification, and + // the error-code precedence is also more honest: a subscriber + // without `manage_options` gets `forbidden`, not the misleading + // `nonce_failed`. + $nonce = Helper::get_string_value( $request->get_header( 'X-WP-Nonce' ) ); + if ( ! wp_verify_nonce( sanitize_text_field( $nonce ), 'wp_rest' ) ) { + return new WP_Error( + 'srfm_html_convert_nonce_failed', + __( 'Security verification failed. Please refresh the page and try again.', 'sureforms' ), + [ 'status' => 403 ] + ); + } + + $raw_fields = $request->get_param( 'parsed_fields' ); + $confidence = Helper::get_string_value( $request->get_param( 'confidence' ) ); + $raw_html = Helper::get_string_value( $request->get_param( 'html' ) ); + $form_title = Helper::get_string_value( $request->get_param( 'form_title' ) ); + $submit_text = Helper::get_string_value( $request->get_param( 'submit_text' ) ); + $styling_in = $request->get_param( 'styling' ); + $styling_in = is_array( $styling_in ) ? $styling_in : []; + $used_ai = false; + + if ( '' === $form_title ) { + $form_title = __( 'Converted form', 'sureforms' ); + } + + // AI fallback path. We only invoke the middleware when the local + // parser flagged the input as ambiguous AND the caller actually + // supplied raw HTML — otherwise there is nothing useful to send. + if ( self::AI_FALLBACK_CONFIDENCE === $confidence && '' !== $raw_html ) { + if ( strlen( $raw_html ) > self::MAX_HTML_BYTES ) { + return new WP_Error( + 'srfm_html_convert_too_large', + __( 'The HTML form is too large to convert. Please simplify the markup or build the form manually.', 'sureforms' ), + [ 'status' => 413 ] + ); + } + + $ai_fields = $this->extract_fields_via_ai( $raw_html ); + if ( is_wp_error( $ai_fields ) ) { + return $ai_fields; + } + $raw_fields = $ai_fields; + $used_ai = true; + } + + if ( ! is_array( $raw_fields ) || empty( $raw_fields ) ) { + return new WP_Error( + 'srfm_html_convert_no_fields', + __( 'No fields could be derived from the supplied form.', 'sureforms' ), + [ 'status' => 400 ] + ); + } + + // Strip the parser-internal hints (`_groupName`, `_optionValue`, + // `confidence`) before handing fields to Create_Form — the schema + // for that ability rejects unknown keys via additionalProperties. + $clean_fields = $this->strip_internal_hints( $raw_fields ); + + /** + * Filter the field list before handing it to `Create_Form`. + * + * Lets extensions (notably SureForms Pro) re-inspect the raw + * source HTML and refine the parsed fields — e.g. promote a + * `` from a plain `input` to a `date-picker` + * block when the pro field type is registered. The JS parser + * cannot do this on its own because the pro field types are + * only valid when the pro plugin is active; gating that on the + * server is simpler and avoids leaking pro-specific behavior + * into the public block-editor bundle. + * + * @since 2.10.0 + * @param array> $clean_fields Sanitized field list ready for Create_Form. + * @param string $raw_html Original HTML of the source `` block. + * @param string $confidence Parser confidence (`high`/`medium`/`low`). + * + * SECURITY CONTRACT: callbacks MUST return values already + * sanitized for storage as block attributes. `Create_Form` + * re-sanitizes a hardcoded list of properties (label, + * placeholder, helpText, defaultValue, fieldOptions), but any + * property a callback introduces beyond that set — a pro + * field's `allowedFormats`, `dateFormat`, `step`, etc. — is NOT + * covered by the downstream sanitization pass. Strings should + * pass through `sanitize_text_field` / `wp_kses_post`, scalars + * through `absint` / `floatval`, arrays should have each leaf + * sanitized. The defensive `strip_unsafe_html_in_fields` pass + * below catches obvious raw-tag injection but is not a + * substitute for proper per-property sanitization. + */ + $clean_fields = apply_filters( 'srfm_html_form_detector_refine_fields', $clean_fields, $raw_html, $confidence ); + + // Defensive post-filter sweep: strip raw HTML tags from every + // string leaf in every field property. The filter contract + // above documents that callbacks must sanitize, but a sloppy + // callback could re-introduce attacker markup in properties + // `Create_Form` does not know to clean — at which point a + // later block renderer that emits the attribute as inner HTML + // becomes a stored-XSS sink. Stripping tags here is a narrow + // safety net that loses no legitimate value: form-field + // attributes are not HTML containers. + $clean_fields = $this->strip_unsafe_html_in_fields( $clean_fields ); + + $create_form = new Create_Form(); + $result = $create_form->execute( + [ + 'formTitle' => $form_title, + 'formFields' => $clean_fields, + 'formStatus' => 'publish', + 'formMetaData' => $this->build_form_metadata( $submit_text, $styling_in ), + ] + ); + + if ( is_wp_error( $result ) ) { + return $result; + } + + // Layer in the native form-card styling (background, padding, + // border radius). These live in `_srfm_forms_styling` and are + // exposed in the per-form Styling sidebar — the same UI users get + // when they build a form by hand — so populating them keeps the + // converted form fully editable post-creation instead of locking + // the look behind opaque custom CSS. + $form_id = isset( $result['form_id'] ) ? Helper::get_integer_value( $result['form_id'] ) : 0; + if ( $form_id > 0 ) { + $this->apply_native_card_styling( $form_id, $styling_in ); + + /** + * Fires after the converter writes its baseline form + * metadata, giving extensions a chance to layer in + * additional `_srfm_forms_styling` keys — e.g. a pro + * `form_theme` preset chosen from inline-style hints. + * + * @since 2.10.0 + * @param int $form_id Newly-created SureForms form ID. + * @param array $styling Parser styling descriptor (inline-style hints). + * @param string $raw_html Original HTML of the source `` block. + */ + do_action( 'srfm_html_form_detector_after_styling', $form_id, $styling_in, $raw_html ); + } + + // Compute the markup that survives once the source `` is + // removed from the original block — wrapping `
`s, a + // heading above the form, a post-submit paragraph below it, + // inline ` -``` - -### CSV (Comma-Separated Values) -File format for spreadsheet data. SureForms can export form entries as CSV. - -**Example:** -``` -Name,Email,Message -John Doe,john@example.com,Hello! -Jane Smith,jane@example.com,Question about... -``` - ---- - -## D - -### Database Table -MySQL table storing structured data. SureForms uses 4 custom tables: -- `wp_sureforms_entries` - Form submissions -- `wp_sureforms_payments` - Payment records -- `wp_sureforms_integrations` - OAuth credentials -- `wp_sureforms_save_resume` - Draft submissions (Pro) - -**Why custom tables?** -- Faster queries (indexed columns) -- More efficient than post meta -- Easier to export - -### Dynamic Block -Gutenberg block rendered server-side (PHP). Most SureForms field blocks are dynamic for security (server-side validation). - -**Example:** -```php -register_block_type('sureforms/email', [ - 'render_callback' => 'render_email_field' -]); -``` - ---- - -## E - -### Encryption -Converting data to unreadable format. SureForms encrypts OAuth credentials and API keys. - -**Algorithm:** AES-256-CTR - -**Example:** -```php -$encrypted = Encryption::encrypt($api_key); -// Stored in database: "base64encodedIV.encryptedData" -``` - -### Entry -Single form submission. Stored in `wp_sureforms_entries` table. - -**Contains:** -- Form ID -- User ID (if logged in) -- Field values (JSON) -- Metadata (IP, user agent, timestamp) -- Status (published, spam, trash) - -### Escaping (Output Escaping) -Converting special characters to prevent XSS. SureForms escapes all user data before display. - -**Functions:** -- `esc_html()` - For HTML content -- `esc_attr()` - For HTML attributes -- `esc_url()` - For URLs -- `esc_js()` - For JavaScript strings - -**Example:** -```php -echo '
' . esc_html($user_input) . '
'; -``` - ---- - -## F - -### Field Type -Type of input field (email, text, number, etc.). SureForms has 15+ field types. - -**Common types:** -- Text, Email, URL, Textarea -- Number, Phone -- Multiple Choice, Checkbox, Dropdown -- Address, Upload (Pro) - -### Filter (WordPress Hook) -Function that modifies data. SureForms provides 30+ filters for customization. - -**Example:** -```php -add_filter('sureforms_email_subject', function($subject, $form_id) { - return "[Form $form_id] $subject"; -}, 10, 2); -``` - ---- - -## G - -### GDPR (General Data Protection Regulation) -European privacy law. SureForms provides GDPR-compliance features (consent checkbox, data export/deletion). - -**Requirements:** -- Explicit consent for data collection -- Right to access data (export) -- Right to deletion -- Privacy policy link - -### Gutenberg -WordPress's block editor (officially called "Block Editor"). Named after Johannes Gutenberg, inventor of printing press. - -**Why "Gutenberg"?** -- Revolutionized content creation (like printing press) -- Blocks are reusable components - ---- - -## H - -### Honeypot -Anti-spam technique using hidden field. Bots fill all fields (including hidden), revealing themselves. - -**How it works:** -```html - - -``` - -**SureForms logic:** -```php -if (!empty($_POST['srfm-honeypot'])) { - // Spam detected -} -``` - -### Hook (WordPress) -Point where developers can inject custom code. Two types: actions and filters. - -**SureForms hooks:** -- 50+ action hooks (e.g., `sureforms_after_entry_save`) -- 30+ filter hooks (e.g., `sureforms_email_template`) - ---- - -## I - -### Integration (Native Integration) -Connection to third-party service. SureForms Pro has 24+ native integrations (Mailchimp, HubSpot, etc.). - -**Types:** -- **OAuth:** User authorizes connection (Mailchimp, Google) -- **API Key:** User provides key from service -- **Webhook:** SureForms sends POST request to URL - -### Instant Form -SureForms feature allowing forms to be published with unique URL (no embedding needed). - -**Example URL:** -``` -https://yoursite.com/?srfm_form=abc123 -``` - -**Use cases:** -- Email signatures -- Social media links -- QR codes - ---- - -## J - -### JSON (JavaScript Object Notation) -Data format for structured information. SureForms stores entry data and block attributes as JSON. - -**Example entry data:** -```json -{ - "email": "john@example.com", - "name": "John Doe", - "message": "Hello!" -} -``` - ---- - -## L - -### Localization (l10n) -Adapting software for specific language/region. SureForms supports translation. - -**Files:** -- `languages/sureforms-{locale}.po` - Translation strings -- `languages/sureforms-{locale}.mo` - Compiled translations - -**Functions:** -```php -__('Email', 'sureforms'); // Translate string -_e('Submit', 'sureforms'); // Translate and echo -``` - ---- - -## M - -### Middleware -Intermediate server between client and API. SureForms uses middleware for AI form generation (client → middleware → OpenAI). - -**Why middleware?** -- Hides API keys from client -- Rate limiting -- Request logging -- Caching - -### Multi-Step Form (Pro) -Form split into multiple pages/steps. Improves completion rate by reducing cognitive load. - -**Example:** -``` -Step 1: Personal Information (name, email) -Step 2: Address Details -Step 3: Payment Information -``` - ---- - -## N - -### Namespace -PHP feature to organize code and prevent name conflicts. SureForms uses namespaces. - -**Example:** -```php -namespace SRFM\Inc\Database\Tables; - -class Entries { - // ... -} -``` - -### Native Integration -Integration built into SureForms (not requiring Zapier or external connector). - -**Examples:** -- Mailchimp (OAuth) -- HubSpot (OAuth) -- Slack (Webhook URL) - -### Nonce (Number Used Once) -Security token to verify request came from your site. SureForms verifies nonces on all AJAX/REST requests. - -**Example:** -```php -// Generate nonce -$nonce = wp_create_nonce('srfm_submit_form'); - -// Verify nonce -if (!wp_verify_nonce($_POST['nonce'], 'srfm_submit_form')) { - die('Invalid nonce'); -} -``` - ---- - -## O - -### OAuth (Open Authorization) -Protocol for secure authorization. Used by SureForms integrations (Mailchimp, HubSpot, etc.). - -**Flow:** -1. User clicks "Connect to Mailchimp" -2. Redirected to Mailchimp login -3. User approves access -4. Mailchimp redirects back with token -5. SureForms stores encrypted token - ---- - -## P - -### Payment Gateway -Service that processes credit card payments. SureForms supports Stripe and PayPal. - -**Comparison:** -- **Stripe:** 2.9% + $0.30, better for US/Europe -- **PayPal:** 2.9% + $0.30, more global recognition - -### Payment Intent (Stripe) -Stripe object representing payment attempt. Created before customer enters card details. - -**States:** -- `requires_payment_method` - Awaiting card -- `requires_confirmation` - Card entered, needs confirm -- `succeeded` - Payment successful -- `canceled` - Payment canceled - -### PCI DSS (Payment Card Industry Data Security Standard) -Security standard for handling credit card data. SureForms is PCI-compliant (never stores card data). - -**Compliance:** -- Card data sent directly to Stripe/PayPal -- SureForms only stores transaction ID -- No PAN (Primary Account Number) stored - -### Placeholder -Example text shown in empty input field. Disappears when user types. - -**Example:** -```html - -``` - -**Accessibility note:** Never use placeholder as label (screen readers may miss it). - -### Post Meta -WordPress method for storing additional data with posts. SureForms **doesn't** use post meta (uses custom tables instead). - -**Why not post meta?** -- Slow queries (no indexes) -- Hard to search -- Not optimized for large datasets - -### Post Type (Custom Post Type) -WordPress content type. SureForms forms are stored as custom post type `sureforms_form`. - -**Advantages:** -- Uses WordPress admin UI -- Revision history -- Trash/restore functionality - ---- - -## R - -### reCAPTCHA -Google anti-spam service. SureForms supports reCAPTCHA v2 and v3. - -**Versions:** -- **v2:** "I'm not a robot" checkbox -- **v3:** Invisible, scores user behavior (0-1) - -**Setup:** -1. Get API keys from Google reCAPTCHA admin -2. Add to SureForms → Settings → Security -3. Enable on forms - -### REST API -HTTP API for accessing SureForms data. Used by frontend, mobile apps, integrations. - -**Base URL:** `/wp-json/sureforms/v1/` - -**Example endpoints:** -- `POST /submit-form` - Submit form -- `GET /forms/{id}` - Get form data -- `POST /generate-form` - AI form generation - -### RTL (Right-to-Left) -Text direction for languages like Arabic, Hebrew. SureForms supports RTL. - -**CSS:** -```css -.srfm-field { - margin-inline-start: 10px; /* Not margin-left */ -} -``` - ---- - -## S - -### Sanitization (Input Sanitization) -Cleaning user input to prevent attacks. SureForms sanitizes all input before storage. - -**Functions:** -- `sanitize_text_field()` - Remove HTML/PHP -- `sanitize_email()` - Validate email format -- `sanitize_url()` - Validate URL format -- `absint()` - Force integer - -**Example:** -```php -$email = sanitize_email($_POST['email']); -$id = absint($_POST['id']); -``` - -### Schema (Database Schema) -Structure of database table (columns, types, indexes). - -**Example (wp_sureforms_entries):** -```sql -CREATE TABLE wp_sureforms_entries ( - id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, - form_id BIGINT UNSIGNED NOT NULL, - user_id BIGINT UNSIGNED, - entry_data LONGTEXT NOT NULL, - status VARCHAR(20) DEFAULT 'published', - created_at DATETIME NOT NULL, - INDEX idx_form_id (form_id), - INDEX idx_created_at (created_at) -); -``` - -### Shortcode -WordPress feature for embedding content. SureForms forms can be embedded via shortcode. - -**Syntax:** -``` -[sureforms id="123"] -``` - -**Parameters:** -- `id` - Form ID (required) -- `title` - Show title (true/false) -- `description` - Show description (true/false) - -### SQL Injection -Attack injecting malicious SQL into queries. SureForms prevents with `$wpdb->prepare()`. - -**Vulnerable code (DON'T DO THIS):** -```php -$id = $_GET['id']; -$wpdb->query("DELETE FROM table WHERE id = $id"); -// Attack: ?id=1 OR 1=1 (deletes all records!) -``` - -**Safe code:** -```php -$id = absint($_GET['id']); -$wpdb->query($wpdb->prepare("DELETE FROM table WHERE id = %d", $id)); -``` - -### Subscription -Recurring payment. SureForms supports subscriptions via Stripe and PayPal. - -**Intervals:** -- Daily -- Weekly -- Monthly -- Yearly - ---- - -## T - -### Template (Form Template) -Pre-built form configuration. SureForms provides 100+ templates (contact, registration, survey, etc.). - -**Structure:** -```json -{ - "name": "Contact Form", - "fields": [ - { "type": "text", "label": "Name" }, - { "type": "email", "label": "Email" }, - { "type": "textarea", "label": "Message" } - ] -} -``` - -### Transient -WordPress temporary cache. SureForms uses transients for AI rate limiting and API responses. - -**Example:** -```php -// Store for 1 hour -set_transient('srfm_ai_rate_limit_' . $user_id, true, HOUR_IN_SECONDS); - -// Check -if (get_transient('srfm_ai_rate_limit_' . $user_id)) { - // Rate limited -} -``` - ---- - -## U - -### User Agent -String identifying browser/device. SureForms logs user agent for spam detection. - -**Example:** -``` -Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 -``` - ---- - -## V - -### Validation (Form Validation) -Checking if user input meets requirements. SureForms validates both client-side (JavaScript) and server-side (PHP). - -**Types:** -- **Required:** Field must not be empty -- **Format:** Email/URL must be valid -- **Range:** Number within min/max -- **Length:** String length constraints - -**Example:** -```php -if (empty($email) || !is_email($email)) { - $errors[] = 'Please enter a valid email'; -} -``` - ---- - -## W - -### Webhook -HTTP callback sent when event occurs. SureForms can send webhooks on form submission (Pro). - -**Flow:** -``` -User submits form - ↓ -SureForms processes submission - ↓ -Sends POST to webhook URL - ↓ -External service receives data -``` - -**Example payload:** -```json -{ - "event": "form_submit", - "form_id": 123, - "entry_id": 456, - "fields": { ... } -} -``` - -### WordPress Coding Standards (WPCS) -PHP coding style guide for WordPress. SureForms follows WPCS. - -**Key rules:** -- Tabs for indentation (not spaces) -- Yoda conditions: `if ( 'value' === $variable )` -- Braces required for all control structures -- Space after control keywords: `if (` not `if(` - -**Check compliance:** -```bash -composer lint -``` - ---- - -## X - -### XSS (Cross-Site Scripting) -Attack injecting malicious JavaScript into pages. SureForms prevents with output escaping. - -**Vulnerable code (DON'T DO THIS):** -```php -echo '
' . $_POST['name'] . '
'; -// Attack: -``` - -**Safe code:** -```php -echo '
' . esc_html($_POST['name']) . '
'; -// Output: <script>steal(document.cookie)</script> -``` - ---- - -## Z - -### Zapier -Third-party automation service. SureForms doesn't have native Zapier integration but supports webhooks (which Zapier can consume). - -**Alternative:** Use SureForms webhooks to trigger Zapier zaps. - ---- - -## Acronyms Quick Reference - -| Acronym | Full Term | Meaning | -|---------|-----------|---------| -| AJAX | Asynchronous JavaScript and XML | Update page without reload | -| API | Application Programming Interface | Methods to interact with software | -| CSRF | Cross-Site Request Forgery | Attack tricking users into unwanted actions | -| CSV | Comma-Separated Values | Spreadsheet file format | -| GDPR | General Data Protection Regulation | EU privacy law | -| JSON | JavaScript Object Notation | Data format | -| OAuth | Open Authorization | Secure authorization protocol | -| PCI DSS | Payment Card Industry Data Security Standard | Credit card security | -| REST | Representational State Transfer | Web API architecture | -| RTL | Right-to-Left | Text direction (Arabic, Hebrew) | -| SQL | Structured Query Language | Database query language | -| URL | Uniform Resource Locator | Web address | -| WCAG | Web Content Accessibility Guidelines | Accessibility standards | -| WPCS | WordPress Coding Standards | PHP coding style | -| XSS | Cross-Site Scripting | JavaScript injection attack | - ---- - -## Common Abbreviations - -| Abbr | Full Term | -|------|-----------| -| Pro | SureForms Pro (premium plugin) | -| CRM | Customer Relationship Management | -| UI | User Interface | -| UX | User Experience | -| CPT | Custom Post Type | -| DB | Database | -| WP | WordPress | -| PHP | PHP: Hypertext Preprocessor | -| JS | JavaScript | -| CSS | Cascading Style Sheets | - ---- - -**Next:** [Maintenance](maintenance.md) diff --git a/internal-docs/maintenance.md b/internal-docs/maintenance.md deleted file mode 100644 index 71c2f2604..000000000 --- a/internal-docs/maintenance.md +++ /dev/null @@ -1,842 +0,0 @@ -# Documentation Maintenance Guide - -**Version:** 2.5.0 - ---- - -## Purpose - -This guide explains how to keep SureForms internal documentation accurate and useful. - -**Goal:** Documentation should always reflect current reality. - -**Principle:** Update docs when code changes, not as afterthought. - ---- - -## When to Update Documentation - -### Always Update - -**1. New Feature Added** -- Update: `architecture.md`, `apis.md`, `product-vision.md` -- Add: Code examples to `ai-agent-guide.md` -- Update: Onboarding guide if workflow changes - -**2. API Changes** -- Update: `apis.md` (new endpoints, hooks, parameters) -- Update: Code examples in all docs referencing changed API -- Mark deprecated APIs in `apis.md` - -**3. Database Schema Changes** -- Update: `architecture.md` (database section) -- Update: `codebase-map.md` (new files) -- Update: Migration guide if schema change requires migration - -**4. Security Fix** -- Update: `ai-agent-guide.md` (add to common pitfalls) -- Update: `troubleshooting.md` if fix addresses known issue -- Add example of vulnerable pattern to avoid - -**5. Breaking Changes** -- Update: `README.md` (migration guide) -- Update: `onboarding.md` (new workflows) -- Update: `faq.md` (address upgrade questions) - ---- - -### Update if Needed - -**6. Bug Fixes** -- Update: `troubleshooting.md` if common issue -- Add: To FAQ if frequently asked - -**7. Performance Improvements** -- Update: `architecture.md` if architecture changed -- Update: Benchmarks in `README.md` - -**8. UI/UX Changes** -- Update: `ui-and-copy.md` (new patterns, copy) -- Update: `onboarding.md` (user journeys) - ---- - -### Don't Update - -**9. Code Refactoring (No Behavior Change)** -- No doc update unless internal architecture significantly changed - -**10. Minor Copy Changes** -- No doc update unless it changes UX patterns - -**11. Version Bumps** -- Update version number at top of each doc -- That's it (unless other changes) - ---- - -## How to Update Documentation - -### Step 1: Identify Affected Docs - -**Use this decision tree:** - -``` -Did you change... - -┌─ Database schema? -│ └─> Update: architecture.md, codebase-map.md -│ -┌─ REST API? -│ └─> Update: apis.md, ai-agent-guide.md (examples) -│ -┌─ AJAX handlers? -│ └─> Update: apis.md -│ -┌─ Hooks/filters? -│ └─> Update: apis.md, ai-agent-guide.md (patterns) -│ -┌─ User-facing UI? -│ └─> Update: ui-and-copy.md, onboarding.md -│ -┌─ Security patterns? -│ └─> Update: ai-agent-guide.md, coding-standards.md -│ -┌─ Build process? -│ └─> Update: README.md, onboarding.md -│ -└─ New file/folder? - └─> Update: codebase-map.md -``` - ---- - -### Step 2: Read Existing Doc - -**Before editing:** -1. Read entire document -2. Identify outdated sections -3. Check for consistency with your changes - -**Don't:** -- Blindly add new section without reading context -- Create duplicate information -- Use different terminology than existing docs - ---- - -### Step 3: Make Minimal Changes - -**Best practices:** - -**Do:** -- Update only what changed -- Keep existing structure -- Match existing tone and style -- Add code examples if helpful - -**Don't:** -- Rewrite entire document (unless necessary) -- Change unrelated sections -- Reorganize without discussion -- Remove information (mark deprecated instead) - ---- - -### Step 4: Verify Examples Still Work - -**All code examples must be tested:** - -**PHP examples:** -```bash -# Create test file -cat > /tmp/test-example.php << 'EOF' - [ - ['key' => 'form_id', 'value' => 123, 'compare' => '='] - ], - 'limit' => 20 -]); -``` - -**❌ Bad:** -```php -// Vague, generic -$data = SomeClass::get_stuff($args); -``` - ---- - -### Cross-Referencing - -**Internal links:** -```markdown -See [Architecture Guide](architecture.md) for details. -See [Database Schema](architecture.md#database-schema) for table structure. -``` - -**External links:** -```markdown -Read [WordPress Coding Standards](https://developer.wordpress.org/coding-standards/). -``` - -**Code references:** -```markdown -See `inc/form-submit.php:88-119` for nonce verification. -``` - ---- - -### Code Block Guidelines - -**Always specify language:** - -````markdown -```php -// PHP code here -``` - -```javascript -// JavaScript here -``` - -```bash -# Shell commands here -``` - -```sql --- SQL queries here -``` -```` - -**Include comments:** -```php -// Good: Explain what code does -$entries = Entries::get_all([ - 'where' => [ - ['key' => 'status', 'value' => 'published', 'compare' => '='] - ] -]); -``` - -**Show output if helpful:** -```bash -wp plugin list --status=active -# Output: -# sureforms active -# sureforms-pro active -``` - ---- - -## Deprecation Process - -**When removing features:** - -### Step 1: Mark as Deprecated - -**In code:** -```php -/** - * Old function. - * - * @deprecated 2.5.0 Use new_function() instead. - */ -function old_function() { - _deprecated_function(__FUNCTION__, '2.5.0', 'new_function'); - return new_function(); -} -``` - -**In docs:** -```markdown -## ~~Old Feature~~ (Deprecated) - -**Deprecated in:** 2.5.0 -**Removed in:** 3.0.0 -**Replacement:** [New Feature](#new-feature) - -This feature is deprecated and will be removed in version 3.0.0. -Use [New Feature](#new-feature) instead. - -~~Old documentation here...~~ -``` - ---- - -### Step 2: Update Migration Guide - -**In README.md:** - -```markdown -## Upgrading from 2.4.x to 2.5.0 - -### Breaking Changes - -**Old Feature Deprecated:** -- **What changed:** `old_function()` is now deprecated -- **Action required:** Replace with `new_function()` -- **Code example:** - ```php - // Old (deprecated) - old_function($data); - - // New (recommended) - new_function($data); - ``` -``` - ---- - -### Step 3: Remove After Major Version - -**On next major version (3.0.0):** -1. Remove deprecated code -2. Remove ~~strikethrough~~ docs -3. Update changelog - ---- - -## Changelog Management - -**Keep CHANGELOG.md updated:** - -### Format - -```markdown -# Changelog - -## [2.5.1] - 2026-02-15 - -### Added -- New REST endpoint: `/sureforms/v1/forms/{id}/duplicate` -- Support for custom date formats in email notifications - -### Changed -- Improved performance of entry queries (20% faster) -- Updated Stripe API to v2024-01-01 - -### Deprecated -- `old_function()` - Use `new_function()` instead - -### Fixed -- Bug where conditional logic didn't work with checkboxes -- Memory leak in AI form generation - -### Security -- Fixed XSS vulnerability in admin settings (CVE-2026-0001) - -## [2.5.0] - 2026-02-01 - -... -``` - -**Categories:** -- **Added:** New features -- **Changed:** Changes to existing features -- **Deprecated:** Features marked for removal -- **Removed:** Features removed -- **Fixed:** Bug fixes -- **Security:** Security fixes - ---- - -## Documentation Review Checklist - -**Before committing doc changes:** - -### Content -- [ ] Information is accurate (tested code examples) -- [ ] No outdated information (double-checked) -- [ ] Cross-references updated (links work) -- [ ] Version number updated -- [ ] Terminology consistent with other docs - -### Style -- [ ] Clear and concise (no fluff) -- [ ] Code examples formatted correctly -- [ ] Spelling and grammar correct -- [ ] Tone matches existing docs - -### Technical -- [ ] All code examples tested -- [ ] All commands verified (on dev environment) -- [ ] All links work (no 404s) -- [ ] File paths correct (checked in codebase) - -### Accessibility -- [ ] Headings in logical order (H1 → H2 → H3) -- [ ] Code blocks have language specified -- [ ] Alt text for images (if any) -- [ ] Tables have headers - ---- - -## Automation & Tools - -### Linting Documentation - -**Check Markdown syntax:** - -```bash -# Install markdownlint -npm install -g markdownlint-cli - -# Lint all docs -cd internal-docs/ -markdownlint *.md -``` - -**Common issues caught:** -- Inconsistent heading levels -- Trailing whitespace -- Missing blank lines around code blocks - ---- - -### Link Checking - -**Verify all links work:** - -```bash -# Install markdown-link-check -npm install -g markdown-link-check - -# Check links -markdown-link-check internal-docs/*.md -``` - -**Fix broken links:** -- Update to correct URL -- Remove if resource no longer exists -- Use Internet Archive if critical resource - ---- - -### Spell Checking - -**Use spell checker:** - -```bash -# Install aspell -brew install aspell # macOS -apt install aspell # Linux - -# Check spelling -aspell check internal-docs/README.md -``` - -**Custom dictionary:** - -Create `.aspell.en.pws`: -``` -personal_ws-1.1 en 50 -SureForms -WordPress -Gutenberg -Mailchimp -PayPal -``` - ---- - -## Documentation Templates - -### New Feature Documentation Template - -**When adding new feature:** - -```markdown -## [Feature Name] - -**Since:** [version] -**Type:** [Free/Pro] - -### Overview - -[2-3 sentence description of what feature does and why it exists] - -### Use Cases - -- [Use case 1] -- [Use case 2] -- [Use case 3] - -### How to Use - -**Step 1: [Action]** - -[Description] - -```php -// Code example -``` - -**Step 2: [Action]** - -[Description] - -### Configuration - -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `option_name` | string | 'default' | What this does | - -### API Reference - -**REST Endpoint:** -``` -POST /sureforms/v1/feature -``` - -**Parameters:** -- `param1` (string, required) - Description -- `param2` (integer, optional) - Description - -**Response:** -```json -{ - "success": true, - "data": { ... } -} -``` - -### Examples - -**Example 1: [Use case]** -```php -// Code here -``` - -**Example 2: [Use case]** -```php -// Code here -``` - -### Troubleshooting - -**Issue:** [Common problem] -**Solution:** [How to fix] - -### Related - -- [Related feature 1](link) -- [Related feature 2](link) -``` - ---- - -### Bug Fix Documentation Template - -**When fixing bug:** - -**In troubleshooting.md:** - -```markdown -### [Issue Description] - -**Symptom:** [What user sees] - -**Diagnosis:** - -[How to identify the issue] - -```bash -# Commands to diagnose -``` - -**Fixes:** - -**Option 1: [Fix description]** -```php -// Code or command -``` - -**Option 2: [Alternative fix]** -```php -// Alternative code -``` - -**Prevents:** [What this prevents] - -**See also:** [Related issues] -``` - ---- - -## Review & Approval Process - -### Before Merging Docs - -**Self-review:** -1. Read your changes out loud -2. Test all code examples -3. Run linters -4. Check cross-references - -**Peer review:** -1. Request review from team member -2. Address feedback -3. Update based on comments - -**Final checks:** -1. Rebase on main branch -2. Verify no conflicts -3. One last proofread - ---- - -### Documentation Pull Request Template - -**PR description:** - -```markdown -## Documentation Update - -**Plugin Version:** 2.5.1 -**Docs Changed:** [List files] - -### Changes Made - -- [ ] Added documentation for [feature] -- [ ] Updated [section] in [file] -- [ ] Fixed typos in [file] - -### Verification - -- [x] All code examples tested -- [x] All links checked -- [x] Spelling checked -- [x] Cross-references updated -- [x] Version numbers updated - -### Related - -- Related PR: #123 -- Related Issue: #456 -``` - ---- - -## Documentation Metrics - -**Track documentation quality:** - -### Metrics to Monitor - -**Coverage:** -- % of features documented -- % of APIs documented -- % of code examples tested - -**Freshness:** -- Days since last update -- Number of outdated sections -- Deprecated content count - -**Quality:** -- Broken link count -- Spelling error count -- User-reported doc issues - -**Engagement:** -- Doc views (if analytics enabled) -- Time spent reading -- Bounce rate (if high, docs unclear) - ---- - -## Long-Term Maintenance - -### Quarterly Review - -**Every 3 months:** - -1. **Audit all docs:** - - Read each document start to finish - - Test all code examples - - Verify all links - - Update outdated info - -2. **User feedback:** - - Review GitHub issues tagged "documentation" - - Survey users about doc clarity - - Identify gaps in coverage - -3. **Reorganize if needed:** - - Move sections to better fit structure - - Split large docs if too long - - Merge duplicate information - ---- - -### Annual Review - -**Every year:** - -1. **Major cleanup:** - - Remove deprecated content - - Archive old versions - - Rewrite outdated sections - -2. **Structure evaluation:** - - Does structure still make sense? - - Should we add/remove files? - - Are cross-references clear? - -3. **Voice & tone:** - - Is tone consistent? - - Is it still beginner-friendly? - - Does it match product evolution? - ---- - -## Questions? - -**For documentation questions:** -- Create GitHub issue: `[Docs] Your question` -- Tag: `documentation` -- Assign: Documentation maintainer - -**For urgent doc bugs:** -- Ping in Slack: `#sureforms-docs` -- Include: File name, line number, issue description - ---- - -## Conclusion - -**Documentation is code.** - -Treat it with same care: -- Test before committing -- Review changes -- Keep it DRY (Don't Repeat Yourself) -- Refactor when needed - -**Good documentation:** -- Saves support time -- Accelerates onboarding -- Prevents bugs -- Shows we care - -**Thank you for maintaining SureForms docs!** 📚 - ---- - -**Version:** 2.5.0 -**Last Updated:** 2026-02-12 -**Maintainer:** SureForms Team diff --git a/internal-docs/onboarding.md b/internal-docs/onboarding.md deleted file mode 100644 index ab5b83ad3..000000000 --- a/internal-docs/onboarding.md +++ /dev/null @@ -1,1086 +0,0 @@ -# Developer Onboarding - -**Version:** 2.5.0 - ---- - -## Welcome to SureForms - -This guide helps you become productive quickly, whether you have 1 hour, 1 day, or 1 week. - -**What you're working on:** -- **SureForms Free:** AI-powered WordPress form builder (219 PHP files, 50+ blocks) -- **SureForms Pro:** Premium extension (206 PHP files, payments, integrations, advanced features) - -**Architecture:** WordPress + Gutenberg blocks + React 18 + Custom database - ---- - -## Prerequisites - -Before starting: -- [ ] WordPress 6.4+ installed locally -- [ ] Node.js 18+ and npm 8+ -- [ ] PHP 7.4+ with Composer -- [ ] Git configured -- [ ] IDE with PHP/JavaScript support -- [ ] Both plugins cloned from GitHub - -**Test environment:** -```bash -# If using Local by Flywheel or similar -http://localhost:10003/wp-admin/ -Username: admin -Password: admin -``` - ---- - -## 1-Hour Quick Start - -**Goal:** Make your first successful change - -### Step 1: Get Code Running (15 min) - -```bash -# Clone repositories (if not already) -cd /path/to/wp-content/plugins/ -git clone https://github.com/brainstormforce/sureforms.git -git clone https://github.com/brainstormforce/sureforms-pro.git - -# Install dependencies - SureForms Free -cd sureforms/ -npm install -composer install - -# Build assets -npm run build - -# Install dependencies - SureForms Pro -cd ../sureforms-pro/ -npm install -composer install -npm run build -``` - -**Verify installation:** -```bash -# In WordPress admin -wp plugin activate sureforms sureforms-pro -wp plugin list | grep sureforms -``` - -### Step 2: Create Your First Form (15 min) - -**Via WordPress admin:** -1. Go to **SureForms → Add New** -2. Click **Create with AI** or **Start from Blank** -3. Add fields: Email, Name, Message -4. Click **Publish** -5. Add to a page with the SureForms block - -**Via WP-CLI:** -```bash -# Create form programmatically -wp post create \ - --post_type=sureforms_form \ - --post_title="Test Contact Form" \ - --post_status=publish \ - --post_content='' -``` - -### Step 3: Make a Simple Change (20 min) - -**Task:** Change the submit button text - -**Files to modify:** -``` -src/blocks/form/edit.js ← React component -inc/blocks/form/block.php ← Server-side rendering -``` - -**Change 1: Edit the React component** - -Open `src/blocks/form/edit.js`: - -```javascript -// Find around line 45-50 -const { submitButtonText } = attributes; - -// Change default value -const defaultSubmitText = __('Send Message', 'sureforms'); // ← Change this -``` - -**Change 2: Rebuild** - -```bash -npm run build -``` - -**Verify:** Create new form, check if default button text changed. - -### Step 4: Debug Your Change (10 min) - -**Enable debugging:** - -Edit `wp-config.php`: -```php -define('WP_DEBUG', true); -define('WP_DEBUG_LOG', true); -define('WP_DEBUG_DISPLAY', false); -define('SCRIPT_DEBUG', true); // Loads unminified JS -``` - -**Check debug log:** -```bash -tail -f wp-content/debug.log -``` - -**Browser console:** -- Open DevTools → Console -- Look for JavaScript errors -- Check Network tab for AJAX failures - ---- - -## 1-Day Deep Dive - -**Goal:** Understand architecture and make meaningful contributions - -### Morning: Core Concepts (4 hours) - -#### Hour 1: Architecture Overview - -**Read these docs first:** -1. [README.md](README.md) - Project overview -2. [architecture.md](architecture.md) - System design -3. [codebase-map.md](codebase-map.md) - File structure - -**Key concepts to understand:** -- **Gutenberg blocks:** React components that render forms -- **Custom post type:** `sureforms_form` stores form configurations -- **Custom database tables:** `wp_sureforms_entries`, `wp_sureforms_payments` -- **REST API:** Handles form submissions, AI generation -- **AJAX handlers:** Payment processing, file uploads - -**Test your understanding:** -- Where is form submission data saved? (Answer: `wp_sureforms_entries` table) -- How does AI form generation work? (Answer: REST endpoint → external middleware → GPT API) -- What's the difference between Free and Pro? (Answer: Pro adds payments, integrations, conditional logic) - -#### Hour 2: Data Flow - -**Trace a form submission from start to finish:** - -``` -User fills form → Frontend validation → AJAX request - ↓ -inc/form-submit.php (Line 88-119: Nonce verification) - ↓ -Field validation (inc/field-validation.php) - ↓ -Sanitization (inc/helper.php::sanitize_by_field_type()) - ↓ -Database insert (inc/database/tables/entries.php::insert()) - ↓ -Email notification (inc/email/email-handler.php) - ↓ -Confirmation message (or redirect) -``` - -**Hands-on exercise:** -1. Enable MySQL query logging -2. Submit a test form -3. Check `wp_sureforms_entries` table -4. Verify entry data matches submission - -```bash -# View recent entries -wp db query "SELECT * FROM wp_sureforms_entries ORDER BY id DESC LIMIT 5;" -``` - -#### Hour 3: Payment Processing - -**Understand Stripe payment flow:** - -``` -User clicks "Pay" → Frontend creates payment intent - ↓ -AJAX: wp_ajax_nopriv_srfm_create_payment_intent - ↓ -inc/payments/front-end.php (Line 77-83: Create Stripe PaymentIntent) - ↓ -Stripe API processes payment - ↓ -Webhook received: sureforms/webhook_test - ↓ -inc/payments/stripe/stripe-webhook.php (Line 220-637: Handle events) - ↓ -Update wp_sureforms_payments table - ↓ -Send confirmation email -``` - -**Hands-on exercise:** -1. Set up Stripe test keys -2. Create a payment form -3. Use Stripe test card: `4242 4242 4242 4242` -4. Check `wp_sureforms_payments` table for payment record - -#### Hour 4: Pro Features - -**Explore key Pro additions:** - -**1. User Registration:** -- File: `inc/business/user-registration/processor.php` -- Creates WordPress user accounts from form submissions -- Handles login/password reset - -**2. Native Integrations:** -- Folder: `inc/pro/native-integrations/integrations/` -- 24+ services: Mailchimp, Brevo, HubSpot, Salesforce, etc. -- OAuth authentication with encrypted token storage - -**3. Conditional Logic:** -- Frontend: `src/pro/conditional-logic/` -- Show/hide fields based on user selections -- Real-time UI updates - -**Hands-on exercise:** -1. Create form with registration block -2. Submit form, verify user created: `wp user list` -3. Enable Mailchimp integration (test mode) -4. Submit form, check integration logs - -### Afternoon: Build Your First Feature (4 hours) - -**Challenge:** Add a new field type - -**Example: "Star Rating" field** - -#### Step 1: Plan (30 min) - -**Requirements:** -- Display 5 stars (clickable) -- Save selected rating (1-5) -- Validate: Required if configured -- Display in entries table - -**Files to create/modify:** -``` -src/blocks/star-rating/ ← New React component -inc/blocks/star-rating/block.php ← Server-side rendering -inc/helper.php ← Add sanitization -inc/field-validation.php ← Add validation -``` - -#### Step 2: Create Block Structure (1 hour) - -**Create block files:** - -```bash -# Create directories -mkdir -p src/blocks/star-rating -mkdir -p inc/blocks/star-rating - -# Copy from existing field (Phone is a good template) -cp -r src/blocks/phone/* src/blocks/star-rating/ -cp inc/blocks/phone/block.php inc/blocks/star-rating/ -``` - -**Edit `src/blocks/star-rating/block.json`:** - -```json -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 3, - "name": "sureforms/star-rating", - "title": "Star Rating", - "category": "sureforms", - "icon": "star-filled", - "description": "Display a star rating input", - "attributes": { - "label": { - "type": "string", - "default": "Rate your experience" - }, - "required": { - "type": "boolean", - "default": false - }, - "maxRating": { - "type": "number", - "default": 5 - } - }, - "supports": { - "html": false - } -} -``` - -**Edit `src/blocks/star-rating/edit.js`:** - -```javascript -import { __ } from '@wordpress/i18n'; -import { useBlockProps } from '@wordpress/block-editor'; -import { TextControl, ToggleControl, RangeControl } from '@wordpress/components'; - -export default function Edit({ attributes, setAttributes }) { - const { label, required, maxRating } = attributes; - - return ( -
- setAttributes({ label: value })} - /> - setAttributes({ required: value })} - /> - setAttributes({ maxRating: value })} - min={1} - max={10} - /> -
- {[...Array(maxRating)].map((_, i) => ( - - ))} -
-
- ); -} -``` - -#### Step 3: Server-Side Rendering (45 min) - -**Edit `inc/blocks/star-rating/block.php`:** - -```php - [__CLASS__, 'render'], - ] - ); - } - - public static function render($attributes) { - $label = esc_html($attributes['label'] ?? 'Rate your experience'); - $required = !empty($attributes['required']); - $max_rating = absint($attributes['maxRating'] ?? 5); - $field_name = 'srfm-star-rating-' . uniqid(); - - ob_start(); - ?> -
- -
- - - ★ - - -
- > -
- { - const stars = container.querySelectorAll('.srfm-star'); - const input = container.nextElementSibling; - const maxRating = parseInt(container.dataset.max); - - stars.forEach(star => { - star.addEventListener('click', function() { - const value = parseInt(this.dataset.value); - input.value = value; - - // Visual update - stars.forEach((s, index) => { - if (index < value) { - s.classList.add('selected'); - } else { - s.classList.remove('selected'); - } - }); - }); - - // Hover effect - star.addEventListener('mouseenter', function() { - const value = parseInt(this.dataset.value); - stars.forEach((s, index) => { - if (index < value) { - s.classList.add('hover'); - } else { - s.classList.remove('hover'); - } - }); - }); - }); - - container.addEventListener('mouseleave', function() { - stars.forEach(s => s.classList.remove('hover')); - }); - }); -}); -``` - -#### Step 5: Register Block (15 min) - -**Edit `inc/blocks/register.php`:** - -```php -// Add to existing blocks registration -Star_Rating\Block::register(); -``` - -**Edit `src/blocks/star-rating/index.js`:** - -```javascript -import { registerBlockType } from '@wordpress/blocks'; -import edit from './edit'; -import metadata from './block.json'; - -registerBlockType(metadata.name, { - edit, - save: () => null, // Server-side rendering -}); -``` - -#### Step 6: Add Sanitization & Validation (30 min) - -**Edit `inc/helper.php`:** - -Find `sanitize_by_field_type()` method and add: - -```php -case 'star-rating': - $value = absint($value); - // Ensure value is between 1 and max rating - return ($value >= 1 && $value <= 10) ? $value : 0; -``` - -**Edit `inc/field-validation.php`:** - -Find validation logic and add: - -```php -if ($field_type === 'star-rating' && $is_required && empty($value)) { - $errors[] = __('Please select a rating', 'sureforms'); -} -``` - -#### Step 7: Build & Test (30 min) - -```bash -# Build assets -npm run build - -# Test in browser -# 1. Create new form -# 2. Add "Star Rating" block -# 3. Configure settings (label, required, max stars) -# 4. Publish form -# 5. Submit test entry -# 6. Verify data saved correctly - -# Check database -wp db query "SELECT * FROM wp_sureforms_entries ORDER BY id DESC LIMIT 1;" -``` - ---- - -## 1-Week Mastery - -**Goal:** Expert-level understanding and complex feature development - -### Day 1: Architecture Deep Dive - -**Morning:** -- Complete 1-day onboarding -- Read all internal docs thoroughly -- Map data flow for all major features - -**Afternoon:** -- Trace payment processing end-to-end -- Understand webhook verification -- Study integration architecture - -### Day 2: Security & Best Practices - -**Focus areas:** -1. **Input sanitization:** Understand all 15+ sanitization methods -2. **Output escaping:** When to use `esc_html()`, `esc_attr()`, `esc_url()` -3. **SQL injection prevention:** Always use `$wpdb->prepare()` -4. **CSRF protection:** Nonce verification patterns -5. **Authorization:** `current_user_can()` checks - -**Hands-on exercises:** -- Review `inc/form-submit.php` (Lines 88-119: Security checks) -- Study `inc/helper.php` sanitization methods -- Find and fix intentional security bugs in test code - -**Read:** -- [coding-standards.md](coding-standards.md) -- [ai-agent-guide.md](ai-agent-guide.md) - Security section - -### Day 3: React & Gutenberg Blocks - -**Topics:** -1. **Block architecture:** How Gutenberg blocks work -2. **Attributes:** Data storage and retrieval -3. **Inspector controls:** Settings sidebar -4. **Block variations:** Different field configurations -5. **Dynamic blocks:** Server-side rendering - -**Build complex block:** -- **Multi-step form block** (if not using Pro feature) -- Add step navigation -- Save progress between steps -- Implement validation per step - -**Resources:** -- Official Gutenberg docs: https://developer.wordpress.org/block-editor/ -- Example: Study `src/blocks/phone/` for complex field - -### Day 4: Database & REST API - -**Morning: Database operations** - -**Study these classes:** -- `inc/database/base.php` - Base table class -- `inc/database/tables/entries.php` - Entries CRUD -- `inc/database/tables/payments.php` - Payment records - -**Practice:** -```php -// Create custom query -use SRFM\Inc\Database\Tables\Entries; - -$entries = Entries::get_all([ - 'where' => [ - ['key' => 'form_id', 'value' => 123, 'compare' => '='], - ['key' => 'status', 'value' => 'published', 'compare' => '='] - ], - 'orderby' => 'created_at', - 'order' => 'DESC', - 'limit' => 20 -]); -``` - -**Afternoon: REST API development** - -**Create custom endpoint:** - -```php -// In new file: inc/rest-api-custom.php -namespace SRFM\Inc; - -class Rest_API_Custom { - public function register_routes() { - register_rest_route('sureforms/v1', '/custom-stats', [ - 'methods' => 'GET', - 'callback' => [$this, 'get_stats'], - 'permission_callback' => [$this, 'check_permissions'] - ]); - } - - public function check_permissions() { - return current_user_can('manage_options'); - } - - public function get_stats($request) { - // Your logic here - return ['success' => true, 'data' => []]; - } -} -``` - -### Day 5: Pro Features & Integrations - -**Morning: Payment processing** - -**Study both gateways:** -- Stripe: `inc/payments/stripe/` -- PayPal (Pro): `inc/business/payments/pay-pal/` - -**Understand webhook handling:** -- Signature verification -- Event processing -- Database updates -- Error handling - -**Afternoon: Build custom integration** - -**Example: Slack integration** - -1. Create integration folder: -``` -inc/pro/native-integrations/integrations/slack/ -├── config.json -└── actions/ - └── send-message.php -``` - -2. Define config: -```json -{ - "name": "Slack", - "slug": "slack", - "auth_method": "webhook_url", - "actions": [ - { - "name": "Send Message", - "slug": "send-message", - "endpoint": "chat.postMessage" - } - ] -} -``` - -3. Implement action: -```php -format_message($form_data); - - $response = wp_remote_post($webhook_url, [ - 'body' => json_encode(['text' => $message]), - 'headers' => ['Content-Type' => 'application/json'] - ]); - - if (is_wp_error($response)) { - return ['success' => false, 'error' => $response->get_error_message()]; - } - - return ['success' => true]; - } - - private function format_message($form_data) { - // Format form data as Slack message - return "New form submission:\n" . print_r($form_data, true); - } -} -``` - ---- - -## Testing Your Changes - -### Local Testing - -**PHP Unit Tests:** -```bash -# Run all tests -composer test - -# Run specific test file -vendor/bin/phpunit tests/unit/test-helper.php - -# Run with coverage -composer test-coverage -``` - -**JavaScript Tests:** -```bash -# Run all JS tests -npm run test:unit - -# Watch mode -npm run test:unit:watch - -# Coverage -npm run test:unit:coverage -``` - -### E2E Testing (Playwright) - -```bash -# Start test environment -npm run play:up - -# Run E2E tests -npm run play:run - -# Interactive mode (see browser) -npm run play:run:interactive - -# Stop environment -npm run play:down -``` - -### Manual Testing Checklist - -Before submitting PR: -- [ ] Form creation works -- [ ] Form submission saves entry -- [ ] Email notifications sent -- [ ] Payment processing works (if touched) -- [ ] No JavaScript console errors -- [ ] No PHP errors in debug.log -- [ ] Works in latest WordPress version -- [ ] Works in Firefox, Chrome, Safari -- [ ] Mobile responsive -- [ ] Accessibility: keyboard navigation works - ---- - -## Code Review Process - -### Before Creating PR - -**Self-review:** -1. Run linters: -```bash -composer lint # PHP_CodeSniffer -npm run lint-js # ESLint -``` - -2. Auto-fix minor issues: -```bash -composer format # phpcbf -npm run lint-js:fix # ESLint --fix -``` - -3. Check for common issues: -- [ ] All inputs sanitized -- [ ] All outputs escaped -- [ ] SQL queries use `prepare()` -- [ ] Nonces verified for AJAX/forms -- [ ] Capabilities checked for admin actions -- [ ] No hardcoded strings (use `__()` for i18n) - -### Creating PR - -**Branch naming:** -```bash -git checkout -b feat/star-rating-field -git checkout -b fix/payment-webhook-error -git checkout -b refactor/database-queries -``` - -**Commit message format:** -``` -type(scope): brief description - -Longer explanation if needed. - -Co-Authored-By: Your Name -``` - -**Types:** feat, fix, docs, style, refactor, test, chore - -**Example:** -``` -feat(blocks): add star rating field - -- Add new star-rating block -- Implement frontend JavaScript -- Add sanitization and validation -- Update docs with new field type - -Co-Authored-By: Claude Sonnet 4.5 -``` - -### PR Checklist - -- [ ] Tests pass: `composer test && npm run test:unit` -- [ ] Linting passes: `composer lint && npm run lint-js` -- [ ] No console errors -- [ ] Database migrations documented (if any) -- [ ] Breaking changes documented -- [ ] Changelog updated -- [ ] Screenshots attached (for UI changes) - ---- - -## Common Tasks & Patterns - -### Add New AJAX Handler - -**Pattern:** -```php -// In controller file -public function register_ajax_actions() { - add_action('wp_ajax_srfm_my_action', [$this, 'handle_my_action']); - add_action('wp_ajax_nopriv_srfm_my_action', [$this, 'handle_my_action']); -} - -public function handle_my_action() { - // CRITICAL: Always verify nonce - check_ajax_referer('srfm_my_action_nonce', 'security'); - - // Check permissions if needed - if (!current_user_can('manage_options')) { - wp_send_json_error(['message' => 'Insufficient permissions']); - } - - // Sanitize inputs - $data = Helper::sanitize_array_recursively($_POST['data'] ?? []); - - // Process... - - wp_send_json_success(['result' => $result]); -} -``` - -### Add New REST Endpoint - -**Pattern:** -```php -// In inc/rest-api.php -public function register_routes() { - register_rest_route('sureforms/v1', '/my-endpoint', [ - 'methods' => 'POST', - 'callback' => [$this, 'handle_request'], - 'permission_callback' => [$this, 'check_permissions'] - ]); -} - -public function check_permissions() { - return current_user_can('manage_options'); -} - -public function handle_request($request) { - // Always verify nonce - $nonce = $request->get_header('X-WP-Nonce'); - if (!wp_verify_nonce($nonce, 'wp_rest')) { - return new \WP_Error('invalid_nonce', 'Invalid nonce', ['status' => 403]); - } - - // Get and sanitize parameters - $params = $request->get_params(); - $clean_params = Helper::sanitize_array_recursively($params); - - // Process... - - return ['success' => true, 'data' => $result]; -} -``` - -### Add WordPress Hook - -**Action hook (notify about event):** -```php -// Trigger action after entry save -do_action('sureforms_after_entry_save', $entry_id, $form_id, $entry_data); - -// Other plugins/themes can listen: -add_action('sureforms_after_entry_save', function($entry_id, $form_id, $data) { - // Custom logic -}, 10, 3); -``` - -**Filter hook (modify data):** -```php -// Allow filtering of email subject -$subject = apply_filters('sureforms_email_subject', $subject, $form_id, $entry_data); - -// Other plugins/themes can modify: -add_filter('sureforms_email_subject', function($subject, $form_id, $data) { - return "[Form $form_id] $subject"; -}, 10, 3); -``` - -### Database Operations - -**Insert entry:** -```php -use SRFM\Inc\Database\Tables\Entries; - -$entry_id = Entries::insert([ - 'form_id' => 123, - 'user_id' => get_current_user_id(), - 'status' => 'published', - 'entry_data' => wp_json_encode($form_data) -]); -``` - -**Update entry:** -```php -Entries::update($entry_id, [ - 'status' => 'spam' -]); -``` - -**Delete entry:** -```php -Entries::delete($entry_id); -``` - -**Query entries:** -```php -$entries = Entries::get_all([ - 'where' => [ - ['key' => 'form_id', 'value' => 123, 'compare' => '='] - ], - 'limit' => 20, - 'offset' => 0 -]); -``` - ---- - -## Debugging Tips - -### Enable Debug Mode - -**wp-config.php:** -```php -define('WP_DEBUG', true); -define('WP_DEBUG_LOG', true); -define('WP_DEBUG_DISPLAY', false); -define('SCRIPT_DEBUG', true); -define('SAVEQUERIES', true); -``` - -### Check Debug Log - -```bash -# Real-time log monitoring -tail -f wp-content/debug.log - -# Search for errors -grep "SureForms" wp-content/debug.log -``` - -### JavaScript Debugging - -**Browser console:** -```javascript -// Check global object -console.log(window.sureforms); - -// Check block attributes -wp.data.select('core/block-editor').getBlocks(); - -// Check form data -document.querySelector('form').addEventListener('submit', (e) => { - console.log('Form data:', new FormData(e.target)); -}); -``` - -### Database Queries - -**Install Query Monitor plugin:** -```bash -wp plugin install query-monitor --activate -``` - -**Check slow queries:** -- Visit any admin page -- Click "Query Monitor" in admin bar -- View "Queries" tab -- Sort by time -- Optimize slow queries - -**Manual query inspection:** -```php -// Add to code temporarily -global $wpdb; -$wpdb->show_errors(); -$wpdb->print_error(); -``` - -### AJAX Debugging - -**Check network tab:** -1. Open DevTools → Network -2. Filter: XHR -3. Submit form -4. Click request -5. Check Response tab for errors - -**Add debug output:** -```php -public function handle_ajax() { - error_log('AJAX data: ' . print_r($_POST, true)); - // ... rest of code -} -``` - ---- - -## Resources - -### Internal Documentation -- [README.md](README.md) - Quick start -- [architecture.md](architecture.md) - System design -- [codebase-map.md](codebase-map.md) - File structure -- [apis.md](apis.md) - API reference -- [coding-standards.md](coding-standards.md) - Code standards -- [ai-agent-guide.md](ai-agent-guide.md) - AI agent guidance -- [troubleshooting.md](troubleshooting.md) - Common problems - -### External Resources -- **WordPress Codex:** https://codex.wordpress.org/ -- **Block Editor Handbook:** https://developer.wordpress.org/block-editor/ -- **REST API Handbook:** https://developer.wordpress.org/rest-api/ -- **React Docs:** https://react.dev/ -- **WP-CLI:** https://wp-cli.org/ - -### Community -- **GitHub Issues:** Report bugs, request features -- **Facebook Group:** https://www.facebook.com/groups/surecart -- **Support:** https://support.brainstormforce.com/ - ---- - -## Next Steps - -After completing onboarding: - -1. **Pick a starter issue:** - - Look for "good first issue" label on GitHub - - Start with documentation or small bug fixes - - Work up to features - -2. **Read code:** - - Pick a feature you use - - Trace it from UI to database - - Understand every line - -3. **Write tests:** - - For code you touch - - Increases confidence - - Helps others understand your changes - -4. **Ask questions:** - - Don't hesitate to ask - - Better to ask than assume - - Document answers for others - -**Welcome to the team!** 🚀 diff --git a/internal-docs/product-vision.md b/internal-docs/product-vision.md deleted file mode 100644 index f41f1951c..000000000 --- a/internal-docs/product-vision.md +++ /dev/null @@ -1,688 +0,0 @@ -# Product Vision - -**Version:** 2.5.0 - ---- - -## Mission - -**Empower anyone to build beautiful, high-converting forms without code.** - -SureForms exists to solve a fundamental problem: creating forms on WordPress is unnecessarily complex, resulting in ugly forms that hurt conversion rates. - ---- - -## The Problem We Solve - -### Pain Points (Before SureForms) - -**1. Complexity** -- Learning curve: New interfaces, proprietary builders -- Time waste: Hours configuring simple contact forms -- Technical barriers: Requires developer for custom fields - -**2. Design Limitations** -- Generic templates that don't match site design -- Limited styling options without CSS knowledge -- Mobile responsiveness as afterthought - -**3. Low Engagement** -- Long, intimidating single-page forms -- No personalization or conditional logic -- High abandonment rates (avg 67% for long forms) - -**4. Spam & Security** -- Constant bot submissions -- Security vulnerabilities in popular plugins -- GDPR compliance challenges - -**5. Integration Friction** -- Payment processing requires multiple plugins -- Manual data export/import to CRMs -- Webhook setup requires developer knowledge - ---- - -## Our Solution - -### Core Differentiators - -**1. Native WordPress (Gutenberg)** -- **Why:** Users already know the interface -- **Benefit:** Zero learning curve, instant productivity -- **Technical:** React blocks, no proprietary builder - -**2. AI-Powered Form Building** -- **Innovation:** First AI form builder for WordPress -- **How:** Natural language → complete functional form in seconds -- **Examples:** - - "Create a job application form" → 12-field form with file upload - - "Simple contact form" → 3 fields, perfectly styled - - "Event RSVP with dietary restrictions" → Conditional logic auto-configured - -**3. Built-in Payments** -- **Why:** No WooCommerce, no add-ons required -- **Gateways:** Stripe (Free), PayPal (Pro) -- **Features:** One-time, subscriptions, custom amounts -- **Security:** PCI-compliant, encrypted credentials - -**4. Mobile-First Design** -- **Approach:** Responsive by default, not opt-in -- **Testing:** Every block tested on iOS/Android -- **Performance:** Fast load times on 3G networks - -**5. Engagement Features (Pro)** -- **Conversational Forms:** Chat-like, one question at a time -- **Multi-Step Forms:** Break long forms into digestible steps -- **Conditional Logic:** Show/hide based on answers -- **Result:** 3x higher completion rates vs single-page forms - ---- - -## Target Users - -### Primary Personas - -#### 1. Website Owner (40% of users) -**Profile:** -- Small business owner or solopreneur -- Limited technical skills -- DIY mentality -- Budget-conscious - -**Needs:** -- Contact forms, quote requests, bookings -- Easy setup (< 10 minutes) -- Professional appearance -- Spam protection - -**Pain Points:** -- Frustrated with complex form builders -- Can't afford developer -- Generic templates don't match brand - -**How SureForms Helps:** -- AI creates form in 30 seconds -- Instant Form feature (no embedding needed) -- Built-in anti-spam (reCAPTCHA, Honeypot) -- Modern, customizable design - ---- - -#### 2. WordPress Designer (30% of users) -**Profile:** -- Freelancer or agency designer -- Strong design skills, basic code knowledge -- Builds sites for clients -- Values aesthetics and UX - -**Needs:** -- Forms that match site design -- Custom styling without CSS -- Fast deployment -- Client-friendly interface - -**Pain Points:** -- Form plugins look "generic" -- CSS overrides are tedious -- Clients can't update forms themselves -- Other plugins don't use Gutenberg - -**How SureForms Helps:** -- Gutenberg-native (feels like page building) -- Extensive styling options in UI -- Client can edit without breaking design -- Block patterns for reusability - ---- - -#### 3. WordPress Developer (20% of users) -**Profile:** -- Full-stack developer -- Builds custom WordPress solutions -- Values clean code and extensibility -- Performance-conscious - -**Needs:** -- Developer-friendly APIs -- Hooks and filters -- Custom field types -- Database access -- Integration capabilities - -**Pain Points:** -- Other plugins have messy codebases -- Limited extensibility -- Poor documentation -- Performance issues (N+1 queries, bloat) - -**How SureForms Helps:** -- Clean, modern codebase (PSR-12-inspired) -- Extensive hooks: 50+ actions/filters -- Well-documented APIs -- Optimized queries (custom tables, not post meta) -- GitHub access for contributions - ---- - -#### 4. E-commerce Store Owner (10% of users) -**Profile:** -- Runs WooCommerce or custom store -- Needs payment forms (not full checkout) -- Sells services, memberships, donations -- Wants simplicity - -**Needs:** -- Accept payments without WooCommerce -- Subscription billing -- Custom pricing fields -- Receipt emails - -**Pain Points:** -- WooCommerce is overkill for simple payments -- Other payment forms require add-ons -- Can't customize payment flow -- Poor mobile checkout experience - -**How SureForms Helps:** -- Built-in Stripe/PayPal (no plugins) -- Subscription support included -- Custom amount fields (donations, tips) -- Mobile-optimized payment UI - ---- - -## Feature Philosophy - -### Design Principles - -**1. Simplicity Over Features** -- Don't add features just because competitors have them -- Every feature must solve real user problem -- Hide complexity behind smart defaults - -**Example:** -- ❌ Bad: 50 font options overwhelming users -- ✅ Good: 5 curated fonts + custom font option - -**2. Progressive Disclosure** -- Show basic options first -- Advanced settings collapsed by default -- Help text on hover, not always visible - -**Example:** -- Default form settings: 4 essential options -- Advanced panel: 15+ options (collapsed) - -**3. Convention Over Configuration** -- Smart defaults based on common use cases -- Zero config for 80% of users -- Power users can customize - -**Example:** -- Email notification auto-configured with sensible template -- User can override if needed - -**4. Performance First** -- Lazy load non-critical assets -- Minimize HTTP requests -- Database queries optimized (no N+1) -- CSS/JS minified and cached - -**Metrics:** -- Page load impact: < 50KB additional assets -- Time to Interactive: < 2 seconds on 3G -- Database queries: Max 5 per form render - -**5. Accessibility Built-In** -- WCAG 2.1 Level AA compliance -- Keyboard navigation -- Screen reader support -- Focus indicators - -**Testing:** -- Every block tested with NVDA/JAWS -- Keyboard-only testing required -- Color contrast checked - ---- - -## Free vs Pro Strategy - -### Free Plugin (Core Experience) - -**Philosophy:** Full-featured, not crippled trial - -**Included:** -- Unlimited forms -- Unlimited submissions -- All 15+ field types -- Email notifications -- Spam protection (reCAPTCHA, Honeypot) -- Stripe payments (one-time, subscriptions) -- Form analytics -- Export entries (CSV) -- GDPR compliance -- Instant Forms - -**Limitations:** -- No PayPal -- No native integrations (Mailchimp, etc.) -- No conditional logic -- No multi-step/conversational forms -- No user registration -- No PDF generation - -**Goal:** Provide genuine value, build trust, convert 5-10% to Pro - ---- - -### Pro Plugin (Power Features) - -**Philosophy:** Advanced features for serious users - -**Added Value:** -- **Payments:** PayPal (one-time, subscriptions) -- **Integrations:** 24+ native (Mailchimp, Brevo, HubSpot, Salesforce, etc.) -- **Logic:** Conditional show/hide, calculations -- **Forms:** Multi-step, conversational, save & resume -- **Users:** Registration, login, password reset -- **Output:** PDF generation from submissions -- **Advanced Fields:** Upload (images, files), signature, calculator -- **Priority Support:** < 24hr response time - -**Pricing Tiers:** -- **Essential:** $99/year (3 sites) -- **Plus:** $199/year (20 sites) -- **Agency:** $299/year (unlimited sites) - -**Conversion Strategy:** -- Free users see "Pro" badge on locked features -- No nag screens or popups -- Upgrade CTA in logical places (when user needs feature) -- 14-day money-back guarantee - ---- - -## Competitive Landscape - -### Direct Competitors - -**1. Gravity Forms** -- **Strengths:** Mature, extensive add-ons, trusted -- **Weaknesses:** Old UI, not Gutenberg-native, expensive -- **Our Advantage:** Modern interface, AI builder, lower cost - -**2. WPForms** -- **Strengths:** Beginner-friendly, drag-and-drop -- **Weaknesses:** Generic designs, limited styling -- **Our Advantage:** Better design flexibility, Gutenberg-native - -**3. Formidable Forms** -- **Strengths:** Advanced features, views/reporting -- **Weaknesses:** Steep learning curve, performance issues -- **Our Advantage:** Simpler, faster, AI-assisted - -**4. Fluent Forms** -- **Strengths:** Conversational forms, modern UI -- **Weaknesses:** Not Gutenberg-native, separate builder -- **Our Advantage:** Native Gutenberg, simpler UX - -**5. Contact Form 7** -- **Strengths:** Free, lightweight, popular -- **Weaknesses:** No UI, requires shortcodes, ugly default styles -- **Our Advantage:** Visual builder, beautiful defaults, AI - ---- - -### Market Positioning - -**SureForms:** The AI-powered Gutenberg form builder - -**Tagline:** "Beautiful forms without code" - -**Positioning Statement:** -> For WordPress users who want high-converting forms without complexity, SureForms is the AI-powered form builder that creates beautiful, mobile-first forms in seconds—unlike outdated plugins that require hours of configuration and result in generic-looking forms. - -**Why Users Choose SureForms:** -1. **Speed:** AI creates forms in 30 seconds vs 30 minutes -2. **Design:** Modern, mobile-first vs generic templates -3. **Ease:** Gutenberg-native vs proprietary builder -4. **Value:** Built-in payments vs add-ons required - ---- - -## Product Roadmap - -### Current Focus (2026 Q1) - -**Theme:** Stability & Performance - -**Priorities:** -1. Bug fixes from user reports -2. Performance optimization (lazy loading, query optimization) -3. Security hardening (code audit, penetration testing) -4. Documentation improvements -5. Accessibility compliance (WCAG 2.2 Level AA) - ---- - -### Near-Term (2026 Q2-Q3) - -**Theme:** Advanced Features & Integrations - -**Planned:** -1. **More Integrations:** - - Google Sheets (native, no Zapier) - - Airtable - - Notion - - Slack (native) - -2. **Field Types:** - - Star rating - - Matrix/grid (Pro) - - File upload enhancements (drag & drop, preview) - -3. **Conditional Logic Enhancements (Pro):** - - Show/hide blocks (not just fields) - - Calculation fields (price quotes, BMI calculators) - - Conditional email notifications - -4. **Analytics:** - - Conversion funnel visualization - - A/B testing (form variations) - - Heatmaps (where users drop off) - -5. **Templates:** - - 100+ pre-built form templates - - Industry-specific (real estate, healthcare, education) - - Import/export custom templates - ---- - -### Long-Term Vision (2027+) - -**Theme:** AI-Driven Personalization - -**Research Areas:** -1. **AI Form Optimization:** - - Auto-suggest field improvements based on completion rates - - Predictive text for common fields - - Smart field ordering (ML-driven) - -2. **Advanced Conversational Forms:** - - Voice input support - - Natural language processing for responses - - Branching logic based on sentiment - -3. **Global Expansion:** - - Multi-language support (WPML, Polylang) - - Currency localization - - Regional compliance (CCPA, PIPEDA, etc.) - -4. **Enterprise Features:** - - Team collaboration (roles, permissions) - - Advanced approval workflows - - Audit logs - - White-label options - -5. **Mobile App:** - - iOS/Android app for managing entries - - Push notifications for new submissions - - Offline form viewing - ---- - -## Success Metrics - -### North Star Metric -**Active Forms:** Number of forms receiving at least 1 submission per month - -**Why:** Indicates genuine usage, not just installs - -**Target:** 100,000 active forms by end of 2026 - ---- - -### Secondary Metrics - -**Growth:** -- New installations per month: 50,000+ -- Activation rate: 60% (user creates first form within 7 days) -- Retention: 80% still active after 30 days - -**Engagement:** -- Forms created per user: 3.5 average -- Submissions per form: 25/month average -- Feature adoption (Pro): 40% use conditional logic - -**Conversion:** -- Free → Pro conversion: 5-7% -- Trial → Paid: 25% -- Annual renewal rate: 85% - -**Quality:** -- Support ticket volume: < 2% of active users -- Bug reports: < 0.5% of installations -- 4.5+ star rating on WordPress.org - -**Performance:** -- Average page load impact: < 40KB -- Time to first form submission: < 5 minutes (from install) -- Support response time: < 12 hours - ---- - -## User Feedback Integration - -### How We Listen - -**1. Support Tickets** -- Every ticket tagged by topic -- Monthly review of common issues -- Feature requests tracked in GitHub - -**2. User Surveys** -- Annual user satisfaction survey -- Post-purchase survey (Pro users) -- Exit survey (churned Pro users) - -**3. Analytics** -- Feature usage tracking (opt-in) -- Error logging (anonymized) -- Performance metrics - -**4. Community** -- Facebook group discussions -- GitHub issues and discussions -- WordPress.org support forum - -**5. Direct Outreach** -- User interviews (quarterly) -- Beta tester program -- Power user advisory board - ---- - -### Decision Framework - -**Feature Requests Evaluation:** - -**Criteria:** -1. **Impact:** How many users need this? (1-10) -2. **Effort:** Development complexity? (1-10) -3. **Strategic Fit:** Aligns with vision? (Yes/No) -4. **Competitive:** Do competitors have it? (Yes/No) -5. **Revenue:** Drives conversions? (Yes/No) - -**Scoring:** -- Impact / Effort = Priority score -- Strategic Fit = multiplier (2x if yes) -- Build if score > 5 - -**Example:** -- Feature: "Drag & drop file upload" -- Impact: 8 (many requests) -- Effort: 4 (moderate complexity) -- Strategic Fit: Yes (better UX) -- Score: (8/4) × 2 = 4 → **Build later** - ---- - -## Brand & Voice - -### Brand Personality - -**Adjectives:** -- Approachable (not intimidating) -- Modern (not trendy) -- Reliable (not boring) -- Empowering (not condescending) - -**Tone:** -- Friendly but professional -- Clear over clever -- Helpful without being pushy -- Honest about limitations - ---- - -### Writing Guidelines - -**Do:** -- Use "you" (conversational) -- Short sentences -- Active voice -- Explain "why" not just "how" - -**Don't:** -- Jargon without explanation -- Marketing fluff ("revolutionary", "game-changing") -- Passive voice ("the form was created") -- Unnecessary exclamation marks!!!! - -**Examples:** - -❌ Bad: "SureForms revolutionizes form building with cutting-edge AI technology!" - -✅ Good: "SureForms uses AI to create forms in seconds. Describe what you need, and we'll build it." - ---- - -❌ Bad: "The form submission process has been optimized for maximum conversion potential." - -✅ Good: "We designed our forms to load fast and look great on mobile, so more people complete them." - ---- - -## Technical Vision - -### Architecture Goals - -**1. Performance** -- Custom database tables (not post meta) -- Lazy loading for non-critical assets -- Query optimization (no N+1) -- CDN-friendly (static assets versioned) - -**2. Scalability** -- Handle 100,000+ submissions per form -- Efficient database queries (indexed columns) -- Background processing for heavy tasks (webhooks, PDFs) -- Caching strategy (transients, object cache) - -**3. Security** -- Input sanitization (all user data) -- Output escaping (all rendered content) -- Nonce verification (all AJAX/REST) -- SQL injection prevention (prepared statements) -- Regular security audits - -**4. Extensibility** -- 50+ hooks (actions and filters) -- Clean, documented APIs -- Developer-friendly codebase -- Backward compatibility promise - -**5. Maintainability** -- WordPress coding standards (PHP_CodeSniffer) -- ESLint for JavaScript -- Automated testing (PHPUnit, Playwright) -- Clear documentation (inline and external) - ---- - -## Values & Principles - -**1. User Privacy** -- No tracking without consent -- GDPR compliance built-in -- Data portability (easy export) -- Clear privacy policy - -**2. Open Source (Free Plugin)** -- Public GitHub repository -- Accept community contributions -- Transparent roadmap -- Active maintenance - -**3. Quality Over Speed** -- Test thoroughly before release -- Fix bugs before adding features -- Code review required for all changes -- No "move fast and break things" - -**4. Accessibility** -- WCAG 2.1 Level AA minimum -- Keyboard navigation always -- Screen reader testing required -- Color contrast compliance - -**5. Sustainability** -- Reasonable pricing (not subscription trap) -- Long-term support commitment -- No vendor lock-in (data always exportable) -- Transparent upgrade policies - ---- - -## What We Won't Do - -**Out of Scope:** - -**1. Full CRM System** -- Why: Bloat, complexity, competing with specialists -- Alternative: Integrate with existing CRMs (HubSpot, Salesforce) - -**2. Email Marketing Platform** -- Why: Already solved by Mailchimp, Brevo, etc. -- Alternative: Native integrations with 24+ email platforms - -**3. Complete E-commerce Solution** -- Why: WooCommerce exists, does it well -- Alternative: Simple payment forms (our niche) - -**4. Website Builder** -- Why: Outside core competency (forms) -- Alternative: Work seamlessly with any page builder - -**5. Survey & Quiz Builder** -- Why: Different use case, different UX requirements -- Alternative: Forms work for simple surveys - ---- - -## Conclusion - -**Core Belief:** -Forms are critical touchpoints between businesses and customers. They should be beautiful, fast, and easy to create. - -**Our Promise:** -We'll keep building tools that make form creation accessible to everyone, without sacrificing power or flexibility. - -**For Developers:** -Your feedback shapes this product. Keep the issues and PRs coming. We're listening. - ---- - -**Next:** [UI & Copy Guidelines](ui-and-copy.md) diff --git a/internal-docs/troubleshooting.md b/internal-docs/troubleshooting.md deleted file mode 100644 index b7f256af5..000000000 --- a/internal-docs/troubleshooting.md +++ /dev/null @@ -1,1031 +0,0 @@ -# Troubleshooting Guide - -**Version:** 2.5.0 - ---- - -## Quick Diagnostic - -**Before diving deep, check these common issues:** - -```bash -# 1. WordPress & PHP versions -wp core version -php -v - -# 2. Plugin status -wp plugin list | grep sureforms - -# 3. Theme compatibility -wp theme list --status=active - -# 4. Recent errors -tail -50 wp-content/debug.log | grep -i "sureforms\|fatal\|error" - -# 5. Database tables exist -wp db query "SHOW TABLES LIKE '%sureforms%';" -``` - ---- - -## Installation & Activation Issues - -### Plugin Won't Activate - -**Symptom:** "Plugin activation failed" or white screen - -**Common Causes:** - -**1. PHP Version Too Old** -```bash -php -v -# Required: PHP 7.4+ -``` - -**Fix:** -```bash -# Update PHP (contact host if shared hosting) -# Or add to wp-config.php temporarily to see error: -define('WP_DEBUG', true); -define('WP_DEBUG_DISPLAY', true); -``` - -**2. WordPress Version Too Old** -```bash -wp core version -# Required: WordPress 6.4+ -``` - -**Fix:** -```bash -wp core update -``` - -**3. Conflicting Plugin** - -**Check for conflicts:** -```bash -# Deactivate all other plugins -wp plugin deactivate --all --exclude=sureforms,sureforms-pro - -# Try activating SureForms -wp plugin activate sureforms - -# Reactivate plugins one by one -wp plugin activate plugin-name -``` - -**Common conflicts:** -- Old caching plugins (W3 Total Cache < 2.0) -- Security plugins with aggressive rules -- Other form builders (namespace collisions) - -**4. Memory Limit Too Low** - -**Check current limit:** -```bash -wp eval 'echo WP_MEMORY_LIMIT;' -``` - -**Fix (wp-config.php):** -```php -define('WP_MEMORY_LIMIT', '256M'); -``` - ---- - -### Pro Plugin Shows "Base Plugin Required" - -**Symptom:** SureForms Pro won't activate - -**Diagnosis:** -```bash -wp plugin list | grep sureforms -# Ensure both sureforms AND sureforms-pro are installed -``` - -**Fix:** -1. Install SureForms Free first -2. Activate SureForms Free -3. Then activate SureForms Pro - -**Check version compatibility:** -```bash -# Free and Pro versions should match -# Both should be 2.5.0 (or same major.minor) -``` - ---- - -### Database Tables Not Created - -**Symptom:** Form submissions fail, entries not showing - -**Check tables exist:** -```bash -wp db query "SHOW TABLES LIKE '%sureforms%';" -``` - -**Expected output:** -``` -wp_sureforms_entries -wp_sureforms_payments -wp_sureforms_integrations -wp_sureforms_save_resume -``` - -**Fix: Force database creation** -```bash -# Deactivate plugin -wp plugin deactivate sureforms sureforms-pro - -# Delete plugin (backup first!) -wp plugin delete sureforms - -# Reinstall -wp plugin install sureforms --activate - -# Tables should be created on activation -``` - -**Manual creation (last resort):** - -Read schema from: -- `inc/database/tables/entries.php` -- `inc/database/tables/payments.php` - -Run CREATE TABLE statements manually. - ---- - -## Form Builder (Editor) Issues - -### Forms Won't Load in Editor - -**Symptom:** Blank screen or infinite loading spinner - -**Diagnosis:** - -**1. Check browser console:** -``` -Open DevTools → Console -Look for JavaScript errors -``` - -**Common errors:** - -**a) "wp.blockEditor is undefined"** -- **Cause:** Outdated WordPress version -- **Fix:** `wp core update` - -**b) "React version mismatch"** -- **Cause:** Another plugin using old React version -- **Fix:** Deactivate other plugins one by one to find conflict - -**c) "Uncaught SyntaxError"** -- **Cause:** JavaScript file corrupted or not minified correctly -- **Fix:** Rebuild assets: `npm run build` in plugin directory - -**2. Check network tab:** -``` -DevTools → Network -Filter: JS -Look for failed requests (red, 404, 500) -``` - -**Common failures:** -- `form-editor.js` (404) → Rebuild assets -- `chunk-vendors.js` (500) → Server misconfiguration - -**3. Enable SCRIPT_DEBUG:** - -In `wp-config.php`: -```php -define('SCRIPT_DEBUG', true); -``` - -This loads unminified JS, easier to debug. - ---- - -### Blocks Not Appearing in Inserter - -**Symptom:** SureForms blocks missing from block library - -**Diagnosis:** -```bash -# Check if blocks are registered -wp eval "print_r(get_option('srfm_blocks_registration'));" -``` - -**Fixes:** - -**1. Re-register blocks:** -```bash -wp plugin deactivate sureforms -wp plugin activate sureforms -``` - -**2. Clear block cache:** -```bash -wp cache flush -wp transient delete --all -``` - -**3. Check block.json files exist:** -```bash -find wp-content/plugins/sureforms/inc/blocks -name "block.json" -# Should return multiple files -``` - ---- - -### Form Preview Shows "Invalid Block" - -**Symptom:** Form renders as "This block contains unexpected or invalid content" - -**Cause:** Block HTML structure changed, saved form has old structure - -**Fix:** - -**Option 1: Update block (preserves data):** -1. Click "Attempt Block Recovery" -2. Verify content looks correct -3. Update form - -**Option 2: Clear and rebuild:** -1. Delete the invalid block -2. Add fresh block -3. Reconfigure settings - -**Prevention:** -- Always test after plugin updates -- Keep staging environment for testing - ---- - -## Form Submission Issues - -### Form Submissions Not Saving - -**Symptom:** User submits form, success message shows, but no entry in database - -**Diagnosis:** - -**1. Check debug log:** -```bash -tail -f wp-content/debug.log -# Submit form while watching log -``` - -**Common errors:** -- "Database insert failed" → Check table permissions -- "Nonce verification failed" → Caching issue (see below) -- "Call to undefined method" → PHP version or missing dependency - -**2. Check database directly:** -```bash -# Get latest entry -wp db query "SELECT * FROM wp_sureforms_entries ORDER BY id DESC LIMIT 1;" -``` - -**3. Test with minimal form:** -Create form with ONLY: -- Email field -- Submit button - -If this works, issue is with specific field type. - -**Fixes:** - -**Database Permissions:** -```bash -# Check MySQL user has INSERT privilege -wp db query "SHOW GRANTS;" -``` - -**Fix permissions (MySQL):** -```sql -GRANT INSERT, UPDATE, DELETE ON database_name.* TO 'wp_user'@'localhost'; -FLUSH PRIVILEGES; -``` - -**Caching Interference:** - -Caching plugins cache nonce values, causing verification failures. - -**Fix:** -1. Exclude `/wp-admin/admin-ajax.php` from cache -2. Exclude REST API `/wp-json/` from cache -3. Or disable caching temporarily to test - ---- - -### Email Notifications Not Sending - -**Symptom:** Form submitted successfully, but no email received - -**Diagnosis:** - -**1. Check if emails are being sent at all:** -```bash -# Install WP Mail SMTP or similar -wp plugin install wp-mail-smtp --activate - -# Or test with simple command: -wp eval "wp_mail('your@email.com', 'Test', 'Testing SureForms');" -``` - -**2. Check SureForms email settings:** -```bash -# View form meta -wp post meta list | grep email -``` - -**3. Check spam folder** -- WordPress default `from` address: `wordpress@yourdomain.com` -- Often flagged as spam - -**Fixes:** - -**Configure SMTP:** - -Install WP Mail SMTP plugin: -```bash -wp plugin install wp-mail-smtp --activate -``` - -Configure with: -- Gmail -- SendGrid -- Mailgun -- Amazon SES - -**Check email template:** - -In form settings → Email Notification: -- Verify "To" address is correct -- Check "From" address is valid domain -- Test with simple subject/message - -**Server mail() function:** - -Some hosts disable PHP `mail()` function. - -Test: -```bash -php -r "mail('test@example.com', 'Test', 'Test message');" -``` - -If no email received, `mail()` is disabled. Use SMTP. - ---- - -### Form Validation Not Working - -**Symptom:** Form submits even with empty required fields - -**Causes:** - -**1. JavaScript disabled** (frontend validation skipped) -**2. Theme CSS hiding error messages** -**3. Custom JavaScript conflict** - -**Diagnosis:** - -**Check browser console:** -``` -Look for JavaScript errors -Check if srfm-validation.js loaded -``` - -**Test with default theme:** -```bash -wp theme activate twentytwentythree -# Submit form again -``` - -If works with default theme → Theme conflict. - -**Fixes:** - -**Theme conflict:** - -Add to theme's `functions.php`: -```php -add_action('wp_enqueue_scripts', function() { - // Ensure SureForms scripts load - wp_enqueue_script('srfm-frontend'); -}, 20); -``` - -**CSS hiding errors:** - -Check if theme has: -```css -.srfm-error { display: none !important; } -``` - -Remove or override. - ---- - -## Payment Processing Issues - -### Stripe Payments Failing - -**Symptom:** "Payment failed" error after entering card details - -**Diagnosis:** - -**1. Check Stripe API keys:** -```bash -# In WordPress admin: SureForms → Settings → Payments → Stripe -# Verify: -# - Using correct keys (test vs live) -# - Keys match Stripe dashboard -``` - -**2. Check Stripe webhook:** -```bash -# In Stripe Dashboard → Developers → Webhooks -# Verify webhook URL is: -https://yoursite.com/wp-json/sureforms/webhook_test - -# Check recent webhook deliveries for errors -``` - -**3. Check browser console:** -``` -DevTools → Console -Look for Stripe.js errors -``` - -**Common Errors:** - -**"Invalid API Key"** -- Using test key in live mode (or vice versa) -- API key revoked in Stripe dashboard -- Fix: Copy fresh keys from Stripe - -**"Payment Intent creation failed"** -- Amount is $0 or negative -- Currency mismatch -- Fix: Check form configuration, amount field - -**"Webhook signature verification failed"** -- Webhook secret incorrect -- Middleware issue -- Fix: Copy webhook signing secret from Stripe, update settings - -**Fixes:** - -**Test mode checklist:** -```bash -# 1. Use test API keys (starts with pk_test_ / sk_test_) -# 2. Test card: 4242 4242 4242 4242 -# 3. Any future expiry date -# 4. Any 3-digit CVC -``` - -**Live mode checklist:** -```bash -# 1. Use live API keys (starts with pk_live_ / sk_live_) -# 2. SSL certificate valid (https://) -# 3. Webhook verified in Stripe dashboard -# 4. Test with real card (refund immediately) -``` - ---- - -### PayPal Payments Failing (Pro) - -**Symptom:** Redirected to PayPal but payment doesn't process - -**Diagnosis:** - -**Check PayPal credentials:** -```bash -# SureForms → Settings → Payments → PayPal -# Verify: -# - Client ID matches PayPal dashboard -# - Secret matches -# - Using sandbox for testing, live for production -``` - -**Check webhook endpoint:** -```bash -# PayPal Dashboard → Apps & Credentials → Webhooks -# Webhook URL should be: -https://yoursite.com/wp-json/sureforms-pro/paypal-live-webhook -``` - -**Fixes:** - -**Test in sandbox mode first:** -1. Create PayPal sandbox account: https://developer.paypal.com/ -2. Use sandbox credentials in SureForms -3. Test with sandbox buyer account - -**Common issues:** -- **Wrong environment:** Using sandbox credentials in live mode -- **Webhook not subscribed:** Must subscribe to payment events in PayPal dashboard -- **SSL certificate:** PayPal requires valid HTTPS - ---- - -## Integration Issues (Pro) - -### Native Integration Not Connecting - -**Symptom:** "Connection failed" when adding integration (Mailchimp, HubSpot, etc.) - -**Diagnosis:** - -**1. Check OAuth redirect URL:** - -For OAuth integrations (Mailchimp, HubSpot, Salesforce): -``` -Redirect URL must be: -https://yoursite.com/wp-json/sureforms-pro/v1/oauth/callback -``` - -**2. Test API credentials:** - -For API key integrations (Brevo, etc.): -```bash -# Test API key directly -curl -X GET "https://api.brevo.com/v3/account" \ - -H "api-key: YOUR_API_KEY" -``` - -Should return account info, not error. - -**3. Check error logs:** -```bash -tail -f wp-content/debug.log | grep -i "integration\|oauth" -``` - -**Fixes:** - -**OAuth issues:** -- Ensure site uses HTTPS (required for OAuth) -- Whitelist redirect URL in service's developer console -- Check OAuth app has correct permissions/scopes - -**API key issues:** -- Regenerate key in service dashboard -- Copy entire key (no spaces, no quotes) -- Check key has required permissions (read/write) - ---- - -### Webhook Not Firing - -**Symptom:** Form submitted, but data not sent to integrated service - -**Diagnosis:** - -**Check webhook logs:** - -Install Query Monitor plugin: -```bash -wp plugin install query-monitor --activate -``` - -Submit form, check "HTTP API Calls" panel for webhook requests. - -**Manually trigger webhook:** -```bash -# Find integration ID -wp db query "SELECT * FROM wp_sureforms_integrations;" - -# Trigger webhook manually (developer test) -wp eval "do_action('sureforms_after_entry_save', 123, 456, []);" -``` - -**Fixes:** - -**Webhook URL validation:** - -In `inc/pro/integrations/webhooks.php`, ensure URL is valid: -- HTTPS only (no HTTP) -- No localhost (unless testing) -- Responds with 200 OK - -**Timeout issues:** - -Increase timeout in `wp-config.php`: -```php -define('WP_HTTP_BLOCK_EXTERNAL', false); -define('WP_ACCESSIBLE_HOSTS', 'api.mailchimp.com,api.hubspot.com'); -``` - ---- - -## Performance Issues - -### Form Editor Slow to Load - -**Symptom:** Takes 10+ seconds to load form in editor - -**Diagnosis:** - -**1. Check database size:** -```bash -wp db query "SELECT COUNT(*) FROM wp_sureforms_entries;" -# If > 100,000 entries, database may be slow -``` - -**2. Check server resources:** -```bash -# Memory usage -free -h - -# CPU usage -top - -# Disk I/O -iostat -``` - -**3. Profile with Query Monitor:** -```bash -wp plugin install query-monitor --activate -# Open form editor, check QM panel for slow queries -``` - -**Fixes:** - -**Optimize database:** -```bash -# Clean old entries (backup first!) -wp db query "DELETE FROM wp_sureforms_entries WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);" - -# Optimize tables -wp db optimize -``` - -**Increase PHP limits:** - -In `php.ini` or `.htaccess`: -``` -max_execution_time = 300 -memory_limit = 256M -``` - -**Enable object caching:** - -Install Redis or Memcached: -```bash -wp plugin install redis-cache --activate -wp redis enable -``` - ---- - -### Frontend Form Loads Slowly - -**Symptom:** Form takes 5+ seconds to appear on page - -**Diagnosis:** - -**Check asset loading:** -``` -DevTools → Network → Slow 3G simulation -Watch which assets are slow -``` - -**Common bottlenecks:** -- Google Fonts loading slowly -- Large CSS/JS files -- Unoptimized images in form - -**Fixes:** - -**Lazy load non-critical assets:** - -In `functions.php`: -```php -add_filter('script_loader_tag', function($tag, $handle) { - if ($handle === 'srfm-frontend') { - return str_replace(' src', ' defer src', $tag); - } - return $tag; -}, 10, 2); -``` - -**Use CDN for Google Fonts:** - -In form settings → Design → Typography: -- Limit to 1-2 font families -- Use system fonts for faster load (e.g., -apple-system) - -**Minify and combine assets:** -```bash -npm run build # Ensures assets are minified -``` - -**Enable caching:** - -Install caching plugin: -```bash -wp plugin install wp-super-cache --activate -``` - -Configure to cache pages with forms. - ---- - -## Block Compatibility Issues - -### Form Breaks After Theme Update - -**Symptom:** Form displays incorrectly or not at all after theme update - -**Diagnosis:** - -**Compare theme CSS:** - -Check if new theme has conflicting styles: -```css -/* Common conflicts */ -.srfm-form input { /* Theme override */ } -.srfm-field { /* Theme override */ } -``` - -**Test with default theme:** -```bash -wp theme activate twentytwentythree -``` - -If works → Theme issue. - -**Fixes:** - -**Add theme compatibility CSS:** - -In child theme `style.css`: -```css -/* Reset SureForms blocks */ -.srfm-form, -.srfm-field, -.srfm-form input, -.srfm-form textarea { - all: revert; -} - -/* Then apply minimal SureForms styles */ -``` - -**Use !important (last resort):** - -In SureForms settings → Custom CSS: -```css -.srfm-form input { - border: 1px solid #ccc !important; - padding: 10px !important; -} -``` - ---- - -### Conflicts with Page Builders - -**Symptom:** Forms don't work inside Elementor/Divi/Beaver Builder - -**Common Issues:** - -**1. JavaScript conflicts:** -- Page builder loads own jQuery version -- Conflicts with SureForms scripts - -**Fix:** -```php -// In functions.php -add_action('wp_enqueue_scripts', function() { - if (class_exists('Elementor\Plugin')) { - wp_dequeue_script('jquery'); - wp_enqueue_script('jquery'); - } -}, 100); -``` - -**2. CSS specificity:** -- Page builder CSS overrides SureForms - -**Fix:** - -Use SureForms settings → Custom CSS with higher specificity: -```css -.elementor-widget-container .srfm-form input { - /* Your styles */ -} -``` - ---- - -## Database & Query Issues - -### "Too many connections" Error - -**Symptom:** Site crashes during high form submission volume - -**Diagnosis:** -```bash -wp db query "SHOW STATUS LIKE 'max_used_connections';" -wp db query "SHOW VARIABLES LIKE 'max_connections';" -``` - -**Fixes:** - -**Increase max connections (MySQL):** - -In `my.cnf`: -``` -[mysqld] -max_connections = 500 -``` - -**Use persistent connections:** - -In `wp-config.php`: -```php -define('DB_CHARSET', 'utf8mb4'); -define('DB_COLLATE', ''); -define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_PERSISTENT); -``` - -**Add connection pooling:** - -Use ProxySQL or PgBouncer for connection pooling. - ---- - -### Slow Query: "SELECT * FROM wp_sureforms_entries" - -**Symptom:** Admin page very slow when viewing entries - -**Diagnosis:** -```bash -wp plugin install query-monitor --activate -# View entries page, check QM for slow queries -``` - -**Fixes:** - -**Add database indexes:** -```sql -ALTER TABLE wp_sureforms_entries -ADD INDEX idx_form_id (form_id), -ADD INDEX idx_created_at (created_at), -ADD INDEX idx_status (status); -``` - -**Limit entries displayed:** - -In admin, reduce entries per page from 100 to 20. - -**Paginate large result sets:** - -Ensure code uses `LIMIT` and `OFFSET`: -```php -$entries = Entries::get_all([ - 'limit' => 20, - 'offset' => ($page - 1) * 20 -]); -``` - ---- - -## WordPress.org Review Issues - -### Plugin Rejected for Security - -**Common reasons:** - -**1. Direct database calls without prepare():** -```php -// ❌ Bad -$wpdb->query("DELETE FROM table WHERE id = $id"); - -// ✅ Good -$wpdb->query($wpdb->prepare("DELETE FROM table WHERE id = %d", $id)); -``` - -**2. Unsanitized user input:** -```php -// ❌ Bad -echo $_POST['name']; - -// ✅ Good -echo esc_html(sanitize_text_field($_POST['name'] ?? '')); -``` - -**3. Missing nonce verification:** -```php -// ❌ Bad -if (isset($_POST['action'])) { do_action(); } - -// ✅ Good -if (isset($_POST['action']) && check_ajax_referer('my_action_nonce')) { - do_action(); -} -``` - -**Fix:** - -Run WordPress Coding Standards checker: -```bash -composer require --dev wp-coding-standards/wpcs -vendor/bin/phpcs --standard=WordPress inc/ -``` - -Fix all errors before resubmitting. - ---- - -## Getting Help - -### Before Asking for Help - -**Gather this information:** - -```bash -# 1. WordPress & PHP versions -wp core version -php -v - -# 2. Plugin version -wp plugin list | grep sureforms - -# 3. Active theme -wp theme list --status=active - -# 4. Other active plugins -wp plugin list --status=active - -# 5. Recent errors -tail -50 wp-content/debug.log - -# 6. Browser/OS (if frontend issue) -# Example: Chrome 120 on macOS 14 -``` - -### Where to Get Help - -**1. Documentation** (check first) -- This troubleshooting guide -- [FAQ](faq.md) -- [Architecture](architecture.md) - -**2. GitHub Issues** (bugs & feature requests) -- Search existing issues first -- Provide minimal reproduction steps -- Include system info from above - -**3. Support Portal** (Pro users) -- https://support.brainstormforce.com/ -- < 24hr response time for Pro users - -**4. Community** -- Facebook group: https://www.facebook.com/groups/surecart -- WordPress.org forum (Free only) - ---- - -## Still Stuck? - -If none of the above solutions work: - -**Create detailed bug report:** - -```markdown -**Environment:** -- WordPress: 6.4.2 -- PHP: 8.1 -- SureForms: 2.5.0 (Free/Pro) -- Theme: Astra 4.5.0 -- Browser: Chrome 120 - -**Steps to Reproduce:** -1. Create form with email field -2. Mark field as required -3. Submit form with empty email -4. [Describe unexpected behavior] - -**Expected:** Validation error shows -**Actual:** Form submits anyway - -**Debug Log:** -[Paste relevant errors from debug.log] - -**Screenshots:** -[Attach if visual issue] -``` - -Submit to: https://github.com/brainstormforce/sureforms/issues - ---- - -**Next:** [FAQ](faq.md) diff --git a/internal-docs/ui-and-copy.md b/internal-docs/ui-and-copy.md deleted file mode 100644 index e12a9a45a..000000000 --- a/internal-docs/ui-and-copy.md +++ /dev/null @@ -1,1077 +0,0 @@ -# UI & Copy Guidelines - -**Version:** 2.5.0 - ---- - -## User Experience Philosophy - -**Principle:** Every word and interaction should make the user feel capable, not confused. - -**User Mindset:** -- "I just want to create a form quickly" -- "I don't have time to read documentation" -- "I'm not a developer" - -**Our Responsibility:** -- Make obvious what to do next -- Explain why, not just how -- Never blame the user - ---- - -## User Journeys - -### Journey 1: First-Time User Creates Contact Form - -**Goal:** Create and publish first form in < 5 minutes - -**Steps:** - -**1. Plugin Activation (30 seconds)** - -``` -User activates plugin - ↓ -Redirect to welcome screen - ↓ -Show 2 options: - [Create with AI] [Start from Blank] -``` - -**Copy:** -``` -Welcome to SureForms! - -Let's create your first form. - -[Create with AI] ← Recommended for beginners - Let AI build your form from a simple description - -[Start from Blank] - Build your form block-by-block -``` - -**Design notes:** -- Large, friendly buttons -- "Recommended" badge on AI option -- No walls of text - ---- - -**2. AI Form Creation (2 minutes)** - -``` -User clicks "Create with AI" - ↓ -Modal appears with text input - ↓ -User types: "simple contact form" - ↓ -AI generates form (3-5 seconds) - ↓ -Form opens in editor, ready to publish -``` - -**Copy:** - -``` -Create Form with AI - -Describe the form you need: -┌─────────────────────────────────────┐ -│ Example: "job application with │ -│ file upload" or "event RSVP" │ -└─────────────────────────────────────┘ - -[Cancel] [Generate Form →] -``` - -**Loading state:** -``` -✨ Creating your form... - -AI is adding fields based on your description. -This usually takes 3-5 seconds. -``` - -**Success state:** -``` -✅ Your form is ready! - -We added: -• Name field -• Email field -• Message field -• Submit button - -You can add, remove, or rearrange fields below. - -[Publish Form] -``` - -**Design notes:** -- Loading spinner + encouraging message -- Success message lists what was created -- Clear next action (Publish) - ---- - -**3. Form Publishing (1 minute)** - -``` -User clicks "Publish" - ↓ -Gutenberg publish panel opens - ↓ -SureForms shows additional options -``` - -**Copy in publish panel:** - -``` -📋 Form Settings - -Where should submissions be sent? - -Email: [admin@yoursite.com ▼] - -After submission, show: -○ Confirmation message -○ Redirect to page -● Confirmation message (selected by default) - -Message: -┌─────────────────────────────────────┐ -│ Thank you! We'll respond within │ -│ 24 hours. │ -└─────────────────────────────────────┘ - -[Publish Form] -``` - -**Design notes:** -- Sensible defaults (confirmation message, admin email) -- Inline editing (no separate settings page) -- Jargon-free labels - ---- - -**4. Embedding Form (30 seconds)** - -``` -User wants to add form to page - ↓ -Edit page in Gutenberg - ↓ -Add SureForms block - ↓ -Select form from dropdown -``` - -**Copy in block inserter:** - -``` -SureForms - -Display a form on your page. - -📝 No form yet? Create one in SureForms > Add New -``` - -**Copy in block settings:** - -``` -Form - -Select a form: -[Contact Form ▼] [Create New] - -Display settings: -☑ Show form title -☑ Show form description -☐ Hide labels (show placeholders only) -``` - -**Design notes:** -- Help text guides to form creation if needed -- Checkbox labels explain what they do -- Preview updates in real-time - ---- - -### Journey 2: Pro User Sets Up Payment Form - -**Goal:** Create payment form and collect first payment - -**Complexity:** Higher (involves Stripe setup) - -**Steps:** - -**1. Payment Gateway Setup (5 minutes)** - -``` -User navigates to: -SureForms → Settings → Payments → Stripe -``` - -**Copy:** - -``` -Stripe Payments - -Accept credit card payments with Stripe. - -🔒 Secure: We never store card details. Payments are processed directly by Stripe. - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Test Mode (for testing) - -☑ Enable test mode - -Use these while testing: - Test card: 4242 4242 4242 4242 - Any future expiry, any CVC - -Publishable Key (starts with pk_test_) -┌─────────────────────────────────────┐ -│ │ -└─────────────────────────────────────┘ - -Secret Key (starts with sk_test_) -┌─────────────────────────────────────┐ -│ •••••••••••••••••••••••••••••••• │ -└─────────────────────────────────────┘ - -Where to get keys: -→ Stripe Dashboard > Developers > API Keys - https://dashboard.stripe.com/apikeys - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Live Mode (for real payments) - -⚠️ Only use after testing - -Publishable Key (starts with pk_live_) -┌─────────────────────────────────────┐ -│ │ -└─────────────────────────────────────┘ - -Secret Key (starts with sk_live_) -┌─────────────────────────────────────┐ -│ │ -└─────────────────────────────────────┘ - -[Save Settings] -``` - -**Design notes:** -- Test mode emphasized first -- Clear instructions where to get keys -- Security reassurance ("We never store") -- Direct link to Stripe dashboard - ---- - -**2. Creating Payment Form (3 minutes)** - -``` -User creates new form - ↓ -Adds "Payment" block - ↓ -Configures amount and currency -``` - -**Copy in Payment block settings:** - -``` -Payment Details - -Amount -○ Fixed amount - ┌──────┐ - │ 50 │ USD ▼ - └──────┘ - -● Let user choose amount - Min: [10] Max: [1000] USD ▼ - Default: [50] - -Payment Type -● One-time payment -○ Subscription - Interval: [Monthly ▼] - -Button Text -┌─────────────────────────────────────┐ -│ Pay Now │ -└─────────────────────────────────────┘ -``` - -**Design notes:** -- Radio buttons for mutually exclusive options -- Currency dropdown next to amount -- Clear labels (no "recurring" jargon, use "subscription") - ---- - -**3. Testing Payment (2 minutes)** - -**Copy on frontend form:** - -``` -Payment Information - -Amount: $50.00 - -Card Number -┌─────────────────────────────────────┐ -│ 1234 5678 9012 3456 │ [Card icon] -└─────────────────────────────────────┘ - -Expiry CVC -┌──────────┐ ┌─────┐ -│ MM / YY │ │ 123 │ -└──────────┘ └─────┘ - -🔒 Secure payment powered by Stripe - Your card details are encrypted and never stored. - -[Pay $50.00] -``` - -**Success message after payment:** - -``` -✅ Payment Successful! - -Receipt sent to: john@example.com - -Transaction ID: ch_1A2B3C4D5E6F - -[View Receipt] [Back to Home] -``` - -**Error message if payment fails:** - -``` -❌ Payment Failed - -Your card was declined. - -Common reasons: -• Insufficient funds -• Incorrect card number or expiry date -• Card requires 3D Secure verification - -Please try again or use a different card. - -[Try Again] -``` - -**Design notes:** -- Security reassurance prominent -- Success message includes receipt email and transaction ID -- Error message explains why and how to fix - ---- - -### Journey 3: Power User Builds Conditional Logic Form (Pro) - -**Goal:** Show/hide fields based on user selection - -**Example:** Event RSVP with dietary restrictions (only show if attending) - -**Steps:** - -**1. Creating Base Form (2 minutes)** - -``` -User adds fields: - - "Will you attend?" (Multiple Choice: Yes/No) - - "Dietary restrictions" (Dropdown) -``` - -**2. Adding Conditional Logic (3 minutes)** - -``` -User clicks "Dietary restrictions" block - ↓ -Opens block settings panel - ↓ -Enables conditional logic -``` - -**Copy in block settings:** - -``` -Conditional Logic - -Show this field only when certain conditions are met. - -☑ Enable conditional logic - -Show this field when: - -[Will you attend? ▼] [is ▼] [Yes ▼] - -[+ Add Condition] - -Logic: -● Show if ALL conditions match (AND) -○ Show if ANY condition matches (OR) -``` - -**Design notes:** -- Toggle to enable -- Dropdown-based condition builder (no code) -- Visual feedback: field grays out in editor preview when hidden - ---- - -**3. Testing Logic (1 minute)** - -**Copy in editor preview mode:** - -``` -💡 Preview Mode - -This is how your form will appear to users. - -Try selecting different options to see conditional logic in action. - -[Exit Preview] -``` - -**Behavior:** -- User selects "Yes" → Dietary field appears -- User selects "No" → Dietary field disappears - -**Design notes:** -- Clear indication of preview mode -- Real-time updates (no reload) - ---- - -## Microcopy Guidelines - -### Field Labels - -**Be concise and conversational** - -❌ Bad: "Please enter your electronic mail address" -✅ Good: "Email" - -❌ Bad: "Input telephone number (optional)" -✅ Good: "Phone (optional)" - -**Use sentence case, not title case** - -❌ Bad: "First Name" -✅ Good: "First name" - -❌ Bad: "Company Name (If Applicable)" -✅ Good: "Company name (if applicable)" - ---- - -### Help Text - -**Explain why or provide examples** - -**Email field:** -❌ Bad: "Enter email" -✅ Good: "We'll send a confirmation to this email" - -**Phone field:** -❌ Bad: "Phone number" -✅ Good: "We'll only call if there's an issue with your order" - -**File upload:** -❌ Bad: "Upload file" -✅ Good: "Upload your resume (PDF or DOCX, max 10MB)" - ---- - -### Error Messages - -**Be specific and actionable** - -**Email validation:** -❌ Bad: "Invalid email" -✅ Good: "Please enter a valid email (e.g., name@example.com)" - -**Required field:** -❌ Bad: "This field is required" -✅ Good: "Please enter your name" - -**File size:** -❌ Bad: "File too large" -✅ Good: "File must be under 10MB. Yours is 15MB. Try compressing it." - -**Payment failed:** -❌ Bad: "Transaction error" -✅ Good: "Your card was declined. Please check your card details or try a different card." - ---- - -### Success Messages - -**Be enthusiastic but not over-the-top** - -**Form submission:** -❌ Bad: "Form submitted" -✅ Good: "Thanks! We'll get back to you within 24 hours." - -**Payment successful:** -❌ Bad: "Payment processed successfully. Transaction ID: 1234." -✅ Good: "✅ Payment received! Receipt sent to your email." - -**Registration:** -❌ Bad: "Account created. Please log in." -✅ Good: "Welcome! Check your email to verify your account." - ---- - -### Button Labels - -**Use verbs that describe the action** - -❌ Bad: "Submit" -✅ Good: "Send Message" - -❌ Bad: "Click Here" -✅ Good: "Download Receipt" - -❌ Bad: "Proceed" -✅ Good: "Continue to Payment" - -**For payment buttons, include amount** - -❌ Bad: "Pay" -✅ Good: "Pay $50.00" - -❌ Bad: "Subscribe" -✅ Good: "Subscribe for $9.99/month" - ---- - -### Settings & Options - -**Explain consequences, not just features** - -**Email notification:** -❌ Bad: "Send email notification" -✅ Good: "Email me when someone submits this form" - -**Required field:** -❌ Bad: "Required" -✅ Good: "Make this field required" (checkbox label) - -**Conditional logic:** -❌ Bad: "Enable conditional logic" -✅ Good: "Show or hide this field based on other answers" - ---- - -## Visual Design Patterns - -### Empty States - -**When user has no forms yet:** - -``` -┌─────────────────────────────────────────┐ -│ │ -│ 📝 │ -│ │ -│ No forms yet │ -│ │ -│ Forms help you collect information │ -│ from your website visitors. │ -│ │ -│ [Create Your First Form] │ -│ │ -└─────────────────────────────────────────┘ -``` - -**Copy principles:** -- Icon relevant to context -- 1-sentence explanation -- Clear call-to-action button - ---- - -**When form has no submissions:** - -``` -┌─────────────────────────────────────────┐ -│ │ -│ 📭 │ -│ │ -│ No submissions yet │ -│ │ -│ Share this form to start collecting │ -│ responses. │ -│ │ -│ [Copy Form Link] [Embed on Page] │ -│ │ -└─────────────────────────────────────────┘ -``` - -**Design notes:** -- Actionable next steps -- Multiple options (link vs embed) - ---- - -### Loading States - -**Form submission in progress:** - -``` -┌─────────────────────────────────────┐ -│ ⏳ Sending... │ -│ │ -│ Please don't close this page. │ -└─────────────────────────────────────┘ -``` - -**AI form generation:** - -``` -┌─────────────────────────────────────┐ -│ ✨ Creating your form... │ -│ │ -│ [████████░░] 80% │ -│ │ -│ Adding email validation... │ -└─────────────────────────────────────┘ -``` - -**Design notes:** -- Spinner or progress indicator -- Explain what's happening -- Show progress if possible - ---- - -### Confirmation Dialogs - -**Deleting a form:** - -``` -┌─────────────────────────────────────┐ -│ Delete "Contact Form"? │ -│ │ -│ This will permanently delete: │ -│ • The form │ -│ • 47 submissions │ -│ • All settings │ -│ │ -│ This cannot be undone. │ -│ │ -│ [Cancel] [Delete Form] │ -└─────────────────────────────────────┘ -``` - -**Design notes:** -- Specific about what will be deleted -- Use red/destructive style for delete button -- Cancel button should be default (easier to accidentally click) - ---- - -### Tooltips & Hints - -**When to use:** -- Explaining technical terms -- Providing examples -- Showing keyboard shortcuts - -**Format:** - -``` -Field Name [?] - ↓ (on hover) -┌─────────────────────────────────────┐ -│ This is the internal name used in │ -│ the database. │ -│ │ -│ Example: "first_name" │ -└─────────────────────────────────────┘ -``` - -**Guidelines:** -- Keep under 2 sentences -- Provide example if helpful -- Don't repeat the label - ---- - -## Accessibility - -### Screen Reader Text - -**Form structure:** - -```html - -
-

Personal Information

- -
- -``` - -**Error announcements:** - -```html -
- Please fix 2 errors before submitting. -
- - - - Please enter a valid email address - -``` - ---- - -### Keyboard Navigation - -**Required interactions:** -- Tab through all fields -- Space to toggle checkboxes/radio buttons -- Enter to submit form -- Escape to close modals - -**Visual focus indicators:** - -```css -.srfm-field input:focus { - outline: 2px solid #0073aa; - outline-offset: 2px; -} -``` - -**Never:** -```css -:focus { - outline: none; /* ❌ Never remove focus outline */ -} -``` - ---- - -### Color Contrast - -**WCAG 2.1 Level AA Requirements:** -- Normal text: 4.5:1 minimum -- Large text (18pt+): 3:1 minimum -- UI components: 3:1 minimum - -**Test tools:** -- WebAIM Contrast Checker -- Chrome DevTools (Lighthouse) - -**Safe color combinations:** -- White text on dark backgrounds (#333 or darker) -- Dark text on light backgrounds (#F0F0F0 or lighter) -- Avoid gray text on gray backgrounds - ---- - -## Tone & Voice - -### Voice Characteristics - -**Friendly but professional** -- Use "we" and "you" -- Conversational, not formal -- Helpful, not condescending - -**Example:** -❌ Formal: "The system has detected an error in your input." -✅ Friendly: "Oops! We couldn't save that. Check for any errors above." - ---- - -**Clear over clever** -- Avoid puns and wordplay -- Be direct -- Technical accuracy over marketing fluff - -**Example:** -❌ Clever: "Houston, we have a problem!" -✅ Clear: "Something went wrong. Please try again." - ---- - -**Empowering, not blaming** -- Focus on solutions, not problems -- Use "we" for errors, "you" for successes - -**Example:** -❌ Blaming: "You entered an invalid email." -✅ Empowering: "Hmm, that email doesn't look quite right. Mind double-checking it?" - ---- - -### Writing for Different Contexts - -**First-time users:** -- More explanation -- Examples provided -- Encouraging tone - -**Example:** -``` -Welcome to SureForms! - -Creating your first form is easy. We'll walk you through each step. - -Let's start by choosing what kind of form you need. -``` - ---- - -**Power users:** -- Less explanation -- Assume knowledge -- Efficiency-focused - -**Example:** -``` -Advanced Settings - -Show field if: [condition builder] -Custom CSS class: [input] -``` - ---- - -**Error states:** -- Apologetic but not dramatic -- Specific about what went wrong -- Clear next steps - -**Example:** -``` -We couldn't save your changes. - -The connection to the server timed out. - -Please try again. If this keeps happening, check your internet connection. - -[Try Again] -``` - ---- - -**Success states:** -- Positive reinforcement -- What happens next -- Optional next action - -**Example:** -``` -✅ Form published! - -Your form is now live at: -https://yoursite.com/contact - -[View Form] [Create Another] -``` - ---- - -## Form Field Best Practices - -### Required vs Optional - -**Default:** Make fields optional - -**Require only when absolutely necessary:** -- Name (if sending personalized response) -- Email (if you need to contact them) -- Payment details (if collecting payment) - -**Label optional fields:** -``` -Phone (optional) -Company name (optional) -``` - -**Don't label required fields:** -❌ Bad: "Email (required)" -✅ Good: "Email" (with * indicator) - ---- - -### Field Order - -**Logical flow:** -1. Personal info (Name, Email) -2. Specific questions -3. Payment details (if applicable) -4. Submit button - -**Example contact form:** -``` -1. Name -2. Email -3. Subject -4. Message -5. [Submit] -``` - -**Example order form:** -``` -1. Name -2. Email -3. Product selection -4. Quantity -5. Payment details -6. [Complete Purchase] -``` - ---- - -### Placeholder Text - -**Use sparingly** - -Only for examples, not as labels: - -❌ Bad: -``` -Label: [empty] -Placeholder: "Enter your email" -``` - -✅ Good: -``` -Label: Email -Placeholder: "name@example.com" -``` - -**Never use placeholders as only label** (accessibility issue) - ---- - -### Multi-Step Forms (Pro) - -**Step indicators:** - -``` -Step 1 of 3: Your Information -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -●━━━━━━━━━━━━○━━━━━━━━━━━━━○ - -[Fields here] - -[Continue to Step 2 →] -``` - -**Navigation:** -- Show progress (Step 1 of 3) -- Visual progress bar -- Allow back navigation (not just forward) - -**Button labels:** -- Step 1: "Continue" (not "Next") -- Step 2: "Continue" -- Step 3: "Submit Form" (or "Complete Order") - ---- - -## Internationalization (i18n) - -### Text Translation - -**All user-facing strings must be translatable:** - -```php -// ✅ Good -__('Email', 'sureforms'); -_e('Submit Form', 'sureforms'); - -// ❌ Bad -echo 'Email'; // Hardcoded English -``` - -**Placeholders for dynamic content:** - -```php -// ✅ Good -sprintf(__('You have %d new submissions', 'sureforms'), $count); - -// ❌ Bad -echo "You have $count new submissions"; -``` - ---- - -### Date & Number Formatting - -**Use WordPress functions:** - -```php -// Dates -echo date_i18n(get_option('date_format'), $timestamp); - -// Numbers -echo number_format_i18n($number); - -// Currency -echo '$' . number_format_i18n($amount, 2); -``` - ---- - -### RTL Support - -**CSS for right-to-left languages:** - -```css -/* Use logical properties */ -.srfm-field { - margin-inline-start: 10px; /* Not margin-left */ - padding-inline-end: 20px; /* Not padding-right */ -} -``` - -**Test with RTL languages:** -- Arabic -- Hebrew -- Persian - ---- - -## Quality Checklist - -Before shipping UI copy: - -- [ ] Spell check passed -- [ ] Grammar correct -- [ ] Tone matches guidelines -- [ ] Actionable error messages -- [ ] Examples provided where helpful -- [ ] Accessibility: screen reader friendly -- [ ] Accessibility: color contrast ≥ 4.5:1 -- [ ] Keyboard navigation works -- [ ] i18n: All strings translatable -- [ ] RTL languages supported -- [ ] Tested with real users (if major UI) - ---- - -**Next:** [FAQ](faq.md) diff --git a/jsconfig.json b/jsconfig.json index aa7b99a73..8c5c55505 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -10,7 +10,8 @@ "@Svg/*": [ "assets/svg/*" ], "@Attributes/*": [ "src/blocks-attributes/*" ], "@Image/*": [ "images/*" ], - "@IncBlocks/*": [ "inc/blocks/*" ] + "@IncBlocks/*": [ "inc/blocks/*" ], + "@Store/*": [ "src/store/*" ] } }, "exclude": [ diff --git a/languages/sureforms-de_DE-1cb9ecd067cd971ff5d9db0b4dae2891.json b/languages/sureforms-de_DE-1cb9ecd067cd971ff5d9db0b4dae2891.json index a4c13c747..04377d44b 100644 --- a/languages/sureforms-de_DE-1cb9ecd067cd971ff5d9db0b4dae2891.json +++ b/languages/sureforms-de_DE-1cb9ecd067cd971ff5d9db0b4dae2891.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formular"],"Fields":["Felder"],"Image":["Bild"],"Activated":["Aktiviert"],"Activate":["Aktivieren"],"Submit":["Einreichen"],"Global Settings":["Globale Einstellungen"],"This field is required.":["Dieses Feld ist erforderlich."],"Form Title":["Formulartitel"],"Edit":["Bearbeiten"],"Please enter a valid URL.":["Bitte geben Sie eine g\u00fcltige URL ein."],"Desktop":["Desktop"],"Medium":["Mittel"],"Mobile":["Mobil"],"Repeat":["Wiederholen"],"Scroll":["Scrollen"],"Signature":["Unterschrift"],"Tablet":["Tablet"],"Upload":["Hochladen"],"Basic":["Grundlegend"],"Form Settings":["Formulareinstellungen"],"General":["Allgemein"],"Style":["Stil"],"Advanced":["Fortgeschritten"],"No tags available":["Keine Tags verf\u00fcgbar"],"Device":["Ger\u00e4t"],"Select Shortcodes":["Shortcodes ausw\u00e4hlen"],"Page Break Label":["Seitenumbruch-Label"],"Next":["Weiter"],"Back":["Zur\u00fcck"],"Reset":["Zur\u00fccksetzen"],"Generic tags":["Allgemeine Tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Einheiten ausw\u00e4hlen"],"%s units":["%s Einheiten"],"Margin":["Marge"],"None":["Keine"],"Custom":["Benutzerdefiniert"],"Please add a option props to MultiButtonsControl":["Bitte f\u00fcgen Sie eine Option props zu MultiButtonsControl hinzu"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"Processing\u2026":["Verarbeitung\u2026"],"Select Video":["Video ausw\u00e4hlen"],"Change Video":["Video \u00e4ndern"],"Select Lottie Animation":["Lottie-Animation ausw\u00e4hlen"],"Change Lottie Animation":["Lottie-Animation \u00e4ndern"],"Upload SVG":["SVG hochladen"],"Change SVG":["SVG \u00e4ndern"],"Select Image":["Bild ausw\u00e4hlen"],"Change Image":["Bild \u00e4ndern"],"Upload SVG?":["SVG hochladen?"],"Upload SVG can be potentially risky. Are you sure?":["Das Hochladen von SVG kann potenziell riskant sein. Bist du sicher?"],"Upload Anyway":["Trotzdem hochladen"],"Full Width":["Volle Breite"],"Install":["Installieren"],"Plugin Installation failed, Please try again later.":["Plugin-Installation fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Plugin activation failed, Please try again later.":["Plugin-Aktivierung fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Integrations":["Integrationen"],"%s Removed from Quick Action Bar.":["%s wurde aus der Schnellzugriffsleiste entfernt."],"Add to Quick Action Bar":["Zur Schnellzugriffsleiste hinzuf\u00fcgen"],"%s Added to Quick Action Bar.":["%s zur Schnellzugriffsleiste hinzugef\u00fcgt."],"Already Present in Quick Action Bar":["Bereits in der Schnellzugriffsleiste vorhanden"],"No results found.":["Keine Ergebnisse gefunden."],"data object is empty":["Datenobjekt ist leer"],"Add blocks to Quick Action Bar":["Bl\u00f6cke zur Schnellzugriffsleiste hinzuf\u00fcgen"],"Re-arrange block inside Quick Action Bar":["Block im Schnellaktionsbereich neu anordnen"],"Upgrade":["Aktualisieren"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installieren & Aktivieren"],"Compliance Settings":["Compliance-Einstellungen"],"Enable GDPR Compliance":["Aktivieren Sie die DSGVO-Konformit\u00e4t"],"Never store entry data after form submission":["Speichern Sie niemals Eingabedaten nach dem Absenden des Formulars"],"When enabled this form will never store Entries.":["Wenn aktiviert, speichert dieses Formular niemals Eintr\u00e4ge."],"Automatically delete entries":["Eintr\u00e4ge automatisch l\u00f6schen"],"When enabled this form will automatically delete entries after a certain period of time.":["Wenn aktiviert, wird dieses Formular Eintr\u00e4ge nach einer bestimmten Zeitspanne automatisch l\u00f6schen."],"Entries older than the days set will be deleted automatically.":["Eintr\u00e4ge, die \u00e4lter sind als die festgelegten Tage, werden automatisch gel\u00f6scht."],"Custom CSS":["Benutzerdefiniertes CSS"],"The following CSS styles added below will only apply to this form container.":["Die folgenden unten hinzugef\u00fcgten CSS-Stile gelten nur f\u00fcr diesen Formularcontainer."],"Visual":["Visuell"],"HTML":["HTML"],"All Data":["Alle Daten"],"Add Shortcode":["Shortcode hinzuf\u00fcgen"],"Form input tags":["Formulareingabetags"],"Comma separated values are also accepted.":["Kommagetrennte Werte werden ebenfalls akzeptiert."],"Email Notification":["E-Mail-Benachrichtigung"],"Name":["Name"],"Send Email To":["E-Mail senden an"],"Subject":["Betreff"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Antworten an"],"Add Notification":["Benachrichtigung hinzuf\u00fcgen"],"Email Notification disabled successfully.":["E-Mail-Benachrichtigung erfolgreich deaktiviert."],"Email Notification enabled successfully.":["E-Mail-Benachrichtigung erfolgreich aktiviert."],"Add Key":["Schl\u00fcssel hinzuf\u00fcgen"],"Add Value":["Wert hinzuf\u00fcgen"],"Add":["Hinzuf\u00fcgen"],"Confirmation Message":["Best\u00e4tigungsnachricht"],"After Form Submission":["Nach dem Absenden des Formulars"],"Hide Form":["Formular ausblenden"],"Reset Form":["Formular zur\u00fccksetzen"],"Custom URL":["Benutzerdefinierte URL"],"Add Query Parameters":["Abfrageparameter hinzuf\u00fcgen"],"Select if you want to add key-value pairs for form fields to include in query parameters":["W\u00e4hlen Sie, ob Sie Schl\u00fcssel-Wert-Paare f\u00fcr Formularfelder hinzuf\u00fcgen m\u00f6chten, die in Abfrageparametern enthalten sein sollen"],"Query Parameters":["Abfrageparameter"],"Please select a page.":["Bitte w\u00e4hlen Sie eine Seite aus."],"Suggestion: URL should use HTTPS":["Vorschlag: Die URL sollte HTTPS verwenden"],"Success Message":["Erfolgsmeldung"],"Redirect":["Weiterleiten"],"Redirect to":["Weiterleiten zu"],"Page":["Seite"],"Form Confirmation":["Formularbest\u00e4tigung"],"Confirmation Type":["Best\u00e4tigungstyp"],"Use Labels as Placeholders":["Verwenden Sie Labels als Platzhalter"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Diese Einstellung platziert die Beschriftungen innerhalb der Felder als Platzhalter (wo m\u00f6glich). Diese Einstellung wirkt sich nur auf der Live-Seite aus, nicht in der Editor-Vorschau."],"Page Break":["Seitenumbruch"],"Show Labels":["Etiketten anzeigen"],"First Page Label":["Erstes Seitenetikett"],"Progress Indicator":["Fortschrittsanzeige"],"Progress Bar":["Fortschrittsbalken"],"Connector":["Verbinder"],"Steps":["Schritte"],"Next Button Text":["Text der Schaltfl\u00e4che \"Weiter\""],"Back Button Text":["Zur\u00fcck-Schaltfl\u00e4chentext"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Sind Sie sicher, dass Sie schlie\u00dfen m\u00f6chten? Ihre nicht gespeicherten \u00c4nderungen gehen verloren, da Sie einige Validierungsfehler haben."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Es gibt einige nicht gespeicherte \u00c4nderungen. Bitte speichern Sie Ihre \u00c4nderungen, um die Aktualisierungen zu \u00fcbernehmen."],"Form Behavior":["Formverhalten"],"Clear":["Klar"],"Select Color":["Farbe ausw\u00e4hlen"],"Primary Color":["Prim\u00e4rfarbe"],"Text Color":["Textfarbe"],"Text Color on Primary":["Textfarbe auf Prim\u00e4r"],"Field Spacing":["Feldabstand"],"Small":["Klein"],"Large":["Gro\u00df"],"Left":["Links"],"Center":["Zentrum"],"Right":["Richtig"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Unsichtbar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Datumsauswahl"],"Time Picker":["Zeitw\u00e4hler"],"Hidden":["Versteckt"],"Slider":["Schieberegler"],"Rating":["Bewertung"],"Upgrade to Unlock These Fields":["Upgrade, um diese Felder freizuschalten"],"Add Block":["Block hinzuf\u00fcgen"],"Customize with SureForms":["Anpassen mit SureForms"],"Page break":["Seitenumbruch"],"Previous":["Zur\u00fcck"],"Thank you":["Danke"],"Form submitted successfully!":["Formular erfolgreich eingereicht!"],"Instant Form":["Sofortformular"],"Enable Instant Form":["Sofortformular aktivieren"],"Enable Preview":["Vorschau aktivieren"],"Show Title":["Titel anzeigen"],"Site Logo":["Seitenlogo"],"Banner Background":["Banner-Hintergrund"],"Color":["Farbe"],"Upload Image":["Bild hochladen"],"Background Color":["Hintergrundfarbe"],"Use banner as page background":["Verwenden Sie das Banner als Seitenhintergrund"],"Form Width":["Formularbreite"],"URL":["URL"],"URL Slug":["URL-Slug"],"The last part of the URL.":["Der letzte Teil der URL."],"Learn more.":["Erfahren Sie mehr."],"SureForms Description":["SureForms Beschreibung"],"Form Options":["Formularoptionen"],"Form Shortcode":["Formular-Kurzcode"],"Paste this shortcode on the page or post to render this form.":["F\u00fcgen Sie diesen Shortcode auf der Seite oder im Beitrag ein, um dieses Formular anzuzeigen."],"Spam Protection":["Spam-Schutz"],"Auto":["Auto"],"Normal":["Normal"],"%":["%"],"Top":["Oben"],"Bottom":["Unten"],"Solid":["Fest"],"Width":["Breite"],"Size":["Gr\u00f6\u00dfe"],"EM":["EM"],"Padding":["Polsterung"],"Color 1":["Farbe 1"],"Color 2":["Farbe 2"],"Type":["Typ"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Standort 1"],"Location 2":["Standort 2"],"Angle":["Winkel"],"Classic":["Klassisch"],"Gradient":["Gradient"],"Background":["Hintergrund"],"Cover":["Abdeckung"],"Contain":["Enthalten"],"Overlay":["\u00dcberlagerung"],"No Repeat":["Keine Wiederholung"],"Overlay Opacity":["\u00dcberlagerungsdeckkraft"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Klassennamen sollten durch Leerzeichen getrennt werden. Jeder Klassenname darf nicht mit einer Ziffer, einem Bindestrich oder einem Unterstrich beginnen. Sie d\u00fcrfen nur Buchstaben (einschlie\u00dflich Unicode-Zeichen), Zahlen, Bindestriche und Unterstriche enthalten."],"Conversational Layout":["Konversationelles Layout"],"Unlock Conversational Forms":["Konversationelle Formulare freischalten"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Mit dem SureForms Pro Plan k\u00f6nnen Sie Ihre Formulare in ansprechende, dialogorientierte Layouts verwandeln, um ein nahtloses Benutzererlebnis zu schaffen."],"Premium":["Premium"],"Overlay Type":["Overlay-Typ"],"Image Overlay Color":["Bild\u00fcberlagerungsfarbe"],"Image Position":["Bildposition"],"Attachment":["Anhang"],"Fixed":["Fest"],"Blend Mode":["Mischmodus"],"Multiply":["Multiplizieren"],"Screen":["Bildschirm"],"Darken":["Verdunkeln"],"Lighten":["Erleichtern"],"Color Dodge":["Farb-Abwedeln"],"Saturation":["S\u00e4ttigung"],"Repeat-x":["Wiederholen-x"],"Repeat-y":["Wiederhole-y"],"PX":["PX"],"Button":["Schaltfl\u00e4che"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Mit OttoKit verbinden"],"SUREFORMS PREMIUM FIELDS":["SUREFORMS PREMIUM-FELDER"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%1$s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen \u00fcbereinstimmt (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden."],"We strongly recommend that you install the free ":["Wir empfehlen Ihnen dringend, die kostenlose"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["Plugin! Der Einrichtungsassistent macht es einfach, Ihre E-Mails zu reparieren."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativ k\u00f6nnen Sie versuchen, eine Absenderadresse zu verwenden, die mit Ihrer Website-Domain \u00fcbereinstimmt (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Bitte geben Sie eine g\u00fcltige E-Mail-Adresse ein. Ihre Benachrichtigungen werden nicht gesendet, wenn das Feld nicht korrekt ausgef\u00fcllt ist."],"From Name":["Von Name"],"From Email":["Von E-Mail"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Die aktuelle 'Von-E-Mail'-Adresse stimmt m\u00f6glicherweise nicht mit Ihrem Website-Domainnamen (%1$s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen \u00fcbereinstimmt (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Die aktuelle 'Von-E-Mail'-Adresse stimmt m\u00f6glicherweise nicht mit Ihrem Website-Domainnamen (%s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden."],"Border Radius":["Randradius"],"Form Theme":["Formular-Thema"],"Instant Form Padding":["Sofortige Formularpolsterung"],"Instant Form Border Radius":["Sofortige Formular-Randradius"],"Select Gradient":["Gradient ausw\u00e4hlen"],"Upgrade Now":["Jetzt upgraden"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Eintr\u00e4ge, die \u00e4lter als die ausgew\u00e4hlten Tage sind, werden gel\u00f6scht."],"Entries Time Period":["Eintr\u00e4ge Zeitraum"],"Custom CSS Panel":["Benutzerdefiniertes CSS-Panel"],"Notifications can use only one From Email so please enter a single address.":["Benachrichtigungen k\u00f6nnen nur eine Absender-E-Mail verwenden, daher geben Sie bitte eine einzelne Adresse ein."],"Email Notifications":["E-Mail-Benachrichtigungen"],"Actions":["Aktionen"],"Duplicate":["Duplikat"],"Delete":["L\u00f6schen"],"Select Page to redirect":["Seite zum Weiterleiten ausw\u00e4hlen"],"Search for a page":["Suche nach einer Seite"],"Select a page":["W\u00e4hlen Sie eine Seite aus"],"reCAPTCHA v2":["reCAPTCHA v2"],"Login":["Anmelden"],"Register":["Registrieren"],"Date":["Datum"],"Advanced Settings":["Erweiterte Einstellungen"],"Form Restriction":["Formulareinschr\u00e4nkung"],"Maximum Number of Entries":["Maximale Anzahl von Eintr\u00e4gen"],"Maximum Entries":["Maximale Eintr\u00e4ge"],"The Time Period setting works according to your WordPress site's time zone.
Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["Die Einstellung des Zeitraums funktioniert gem\u00e4\u00df der Zeitzone Ihrer WordPress-Website. Klicken Sie hier<\/a>, um Ihre allgemeinen WordPress-Einstellungen zu \u00f6ffnen, wo Sie diese \u00fcberpr\u00fcfen und aktualisieren k\u00f6nnen."],"Click here":["Klicken Sie hier"],"Response Description After Maximum Entries":["Antwortbeschreibung nach maximalen Eintr\u00e4gen"],"All changes will be saved automatically when you press back.":["Alle \u00c4nderungen werden automatisch gespeichert, wenn Sie zur\u00fcck dr\u00fccken."],"Repeater":["Wiederholer"],"OttoKit Settings":["OttoKit-Einstellungen"],"Get Started":["Loslegen"],"Connect Native Integrations with SureForms":["Native Integrationen mit SureForms verbinden"],"Expected format for emails - email@sureforms.com or John Doe ":["Erwartetes Format f\u00fcr E-Mails - email@sureforms.com oder John Doe "],"Payment":["Zahlung"],"%s - Order ID":["%s - Bestell-ID"],"%s - Amount":["%s - Betrag"],"%s - Customer Email":["%s - Kunden-E-Mail"],"%s - Customer Name":["%s - Kundenname"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["F\u00fcgen Sie benutzerdefinierte CSS-Regeln hinzu, um dieses spezielle Formular unabh\u00e4ngig von globalen Stilen zu gestalten."],"Spam Protection Type":["Spam-Schutztyp"],"Select Security Type":["Sicherheitstyp ausw\u00e4hlen"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Hinweis: Die Verwendung verschiedener reCAPTCHA-Versionen (V2-Checkbox und V3) auf derselben Seite f\u00fchrt zu Konflikten zwischen den Versionen. Bitte vermeiden Sie die Verwendung unterschiedlicher Versionen auf derselben Seite."],"Select Version":["Version ausw\u00e4hlen"],"Please configure the API keys correctly from the settings":["Bitte konfigurieren Sie die API-Schl\u00fcssel korrekt in den Einstellungen."],"Control email alerts sent to admins or users after a form submission.":["Steuern Sie E-Mail-Benachrichtigungen, die nach einer Formular\u00fcbermittlung an Administratoren oder Benutzer gesendet werden."],"Customize the confirmation message or redirect the users after submitting the form.":["Passen Sie die Best\u00e4tigungsnachricht an oder leiten Sie die Benutzer nach dem Absenden des Formulars weiter."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Legen Sie fest, wie oft ein Formular eingereicht werden kann, und verwalten Sie Compliance-Optionen, einschlie\u00dflich DSGVO und Datenaufbewahrung."],"Go to OttoKit Settings":["Gehe zu den OttoKit-Einstellungen"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Verbinden Sie SureForms mit Ihren Lieblings-Apps, um Aufgaben zu automatisieren und Daten nahtlos zu synchronisieren."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Schalten Sie leistungsstarke Integrationen im Premium-Plan frei, um Ihre Arbeitsabl\u00e4ufe zu automatisieren und SureForms direkt mit Ihren Lieblingstools zu verbinden."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Senden Sie Formular\u00fcbermittlungen direkt an CRMs, E-Mail- und Marketingplattformen."],"Automate repetitive tasks with seamless data syncing.":["Automatisiere repetitive Aufgaben mit nahtloser Datensynchronisierung."],"Access exclusive native integrations for faster workflows.":["Zugriff auf exklusive native Integrationen f\u00fcr schnellere Arbeitsabl\u00e4ufe."],"PDF Generation":["PDF-Erstellung"],"Generate and customize PDF copies of form submissions.":["Erstellen und anpassen von PDF-Kopien von Formulareinsendungen."],"Generate Submission PDFs":["Einreichungs-PDFs erstellen"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Verwandeln Sie jeden Formulareintrag in eine polierte PDF-Datei, die sich perfekt f\u00fcr Berichte, Aufzeichnungen oder zum Teilen eignet."],"Automatically generate PDFs from your form submissions.":["Automatisch PDFs aus Ihren Formulareinsendungen erstellen."],"Customize PDF templates with your branding.":["Passen Sie PDF-Vorlagen mit Ihrem Branding an."],"Download or email PDFs instantly.":["Laden Sie PDFs sofort herunter oder senden Sie sie per E-Mail."],"User Registration":["Benutzerregistrierung"],"Onboard new users or update existing accounts through beautiful looking forms.":["Neue Benutzer an Bord nehmen oder bestehende Konten \u00fcber ansprechend gestaltete Formulare aktualisieren."],"Register Users with SureForms":["Benutzer mit SureForms registrieren"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Optimieren Sie den gesamten Benutzer-Onboarding-Prozess f\u00fcr Ihre Websites mit nahtlosen, formularbasierten Anmeldungen und Registrierungen."],"Register new users directly via your form submissions.":["Registrieren Sie neue Benutzer direkt \u00fcber Ihre Formular\u00fcbermittlungen."],"Create or update existing accounts by mapping form data to user fields.":["Erstellen oder aktualisieren Sie bestehende Konten, indem Sie Formulardaten auf Benutzerfelder abbilden."],"Assign roles and control access automatically.":["Rollen zuweisen und den Zugriff automatisch steuern."],"Post Feed":["Beitrags-Feed"],"Transform your form submission into WordPress posts.":["Verwandeln Sie Ihre Formular\u00fcbermittlung in WordPress-Beitr\u00e4ge."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Formulareinsendungen automatisch in WordPress-Beitr\u00e4ge, Seiten oder benutzerdefinierte Beitragstypen umwandeln. Sparen Sie viel Zeit und lassen Sie Ihre Formulare Inhalte direkt ver\u00f6ffentlichen."],"Create posts, pages, or CPTs from your form entries.":["Erstellen Sie Beitr\u00e4ge, Seiten oder CPTs aus Ihren Formulareintr\u00e4gen."],"Map form fields to your post fields easily.":["Ordnen Sie Formularfelder einfach Ihren Beitragsfeldern zu."],"Automate the content publishing flow with few simple steps.":["Automatisieren Sie den Ver\u00f6ffentlichungsprozess f\u00fcr Inhalte mit wenigen einfachen Schritten."],"Automations":["Automatisierungen"],"Unlock Advanced Styling":["Erweiterte Stiloptionen freischalten"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Erhalten Sie die volle Kontrolle \u00fcber das Erscheinungsbild Ihres Formulars mit benutzerdefinierten Farben, Schriftarten und Layouts."],"Button Alignment":["Schaltfl\u00e4chenanordnung"],"Add Custom CSS Class(es)":["Benutzerdefinierte CSS-Klasse(n) hinzuf\u00fcgen"],"Set the total number of submissions allowed for this form.":["Legen Sie die Gesamtanzahl der zul\u00e4ssigen Einreichungen f\u00fcr dieses Formular fest."],"Save & Progress":["Speichern & Fortfahren"],"Allow users to save their progress and continue form completion later.":["Erm\u00f6glichen Sie Benutzern, ihren Fortschritt zu speichern und die Formularausf\u00fcllung sp\u00e4ter fortzusetzen."],"Save & Progress in SureForms":["Speichern & Fortschritt in SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Geben Sie Ihren Nutzern die Flexibilit\u00e4t, Formulare in ihrem eigenen Tempo auszuf\u00fcllen, indem Sie ihnen erlauben, den Fortschritt zu speichern und jederzeit zur\u00fcckzukehren."],"Let users pause long or multi-step forms and continue later.":["Lassen Sie Benutzer lange oder mehrstufige Formulare pausieren und sp\u00e4ter fortsetzen."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Reduzieren Sie das Abbrechen von Formularen mit praktischen Wiederaufnahme-Links und greifen Sie von \u00fcberall auf deren Fortschritt zu."],"Improve user experience for lengthy, complex, or multi-page forms.":["Verbessern Sie die Benutzererfahrung f\u00fcr lange, komplexe oder mehrseitige Formulare."],"This form is not yet available. Please check back after the scheduled start time.":["Dieses Formular ist noch nicht verf\u00fcgbar. Bitte schauen Sie nach der geplanten Startzeit wieder vorbei."],"This form is no longer accepting submissions. The submission period has ended.":["Dieses Formular nimmt keine Einsendungen mehr an. Die Einreichungsfrist ist abgelaufen."],"The start date and time must be before the end date and time.":["Das Startdatum und die Startzeit m\u00fcssen vor dem Enddatum und der Endzeit liegen."],"Form Scheduling":["Formularplanung"],"Enable Form Scheduling":["Formularplanung aktivieren"],"Set a time period during which this form will be available for submissions.":["Legen Sie einen Zeitraum fest, in dem dieses Formular f\u00fcr Einreichungen verf\u00fcgbar sein wird."],"Start Date & Time":["Startdatum und -zeit"],"End Date & Time":["Enddatum & Uhrzeit"],"Response Description Before Start Date":["Antwortbeschreibung vor dem Startdatum"],"Response Description After End Date":["Antwortbeschreibung nach dem Enddatum"],"Conditional Confirmations":["Bedingte Best\u00e4tigungen"],"Set up the message or redirect users will see after submitting the form.":["Richten Sie die Nachricht ein oder leiten Sie die Benutzer weiter, die sie nach dem Absenden des Formulars sehen werden."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Zeigen Sie die richtige Nachricht dem richtigen Benutzer basierend darauf, wie sie reagieren. Personalisieren Sie Best\u00e4tigungen mit intelligenten Bedingungen und f\u00fchren Sie Benutzer automatisch zum n\u00e4chsten besten Schritt."],"Display different confirmation messages based on form responses.":["Zeigen Sie je nach Formularantworten unterschiedliche Best\u00e4tigungsnachrichten an."],"Redirect users to specific pages or URLs conditionally.":["Leiten Sie Benutzer bedingt auf bestimmte Seiten oder URLs weiter."],"Create personalized thank-you messages without extra forms.":["Erstellen Sie personalisierte Dankesnachrichten ohne zus\u00e4tzliche Formulare."],"Lost Password":["Passwort vergessen"],"Reset Password":["Passwort zur\u00fccksetzen"],"When enabled, this form will not store user IP, browser name, or device name in entries.":["Wenn aktiviert, speichert dieses Formular keine Benutzer-IP, keinen Browsernamen oder Ger\u00e4tenamen in den Eintr\u00e4gen."],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["W\u00e4hlen Sie einen Spam-Schutzdienst aus. Konfigurieren Sie API-Schl\u00fcssel in den globalen Einstellungen, bevor Sie ihn aktivieren."],"Send as Raw HTML":["Als Roh-HTML senden"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Wenn aktiviert, wird der HTML-Inhalt der E-Mail genau so beibehalten, wie er geschrieben wurde, und in eine professionelle E-Mail-Vorlage eingebettet."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Intelligente Tags, die auf vom Benutzer \u00fcbermittelte Felder verweisen, werden im Roh-HTML-Modus nicht maskiert. Vermeiden Sie es, nicht vertrauensw\u00fcrdige Feldwerte direkt in den E-Mail-Text einzuf\u00fcgen."],"Please provide a recipient email address and subject line.":["Bitte geben Sie eine Empf\u00e4nger-E-Mail-Adresse und eine Betreffzeile an."],"Email notification duplicated!":["E-Mail-Benachrichtigung dupliziert!"],"Are you sure you want to delete this email notification?":["Sind Sie sicher, dass Sie diese E-Mail-Benachrichtigung l\u00f6schen m\u00f6chten?"],"Email notification deleted!":["E-Mail-Benachrichtigung gel\u00f6scht!"],"URL is missing Top Level Domain (TLD).":["Die URL fehlt die Top-Level-Domain (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Dieses Formular ist jetzt geschlossen, da die maximale Anzahl an Eintr\u00e4gen erreicht wurde."],"Publish Your Form":["Ver\u00f6ffentlichen Sie Ihr Formular"],"Enable This to Instantly Publish the Form":["Aktivieren Sie dies, um das Formular sofort zu ver\u00f6ffentlichen"],"Style Your Instant Form Page Here":["Gestalten Sie hier Ihre Sofortformularseite"],"Quizzes":["Quizze"],"%s - Description":["%s - Beschreibung"],"Choose a spam protection method for this form to prevent unwanted submissions.":["W\u00e4hlen Sie eine Spam-Schutzmethode f\u00fcr dieses Formular, um unerw\u00fcnschte Einsendungen zu verhindern."],"Send entries to 100+ popular apps.":["Eintr\u00e4ge an \u00fcber 100 beliebte Apps senden."],"Build automated workflows that run instantly.":["Erstellen Sie automatisierte Workflows, die sofort ausgef\u00fchrt werden."],"Create custom app integrations using our Custom App feature.":["Erstellen Sie benutzerdefinierte App-Integrationen mit unserer benutzerdefinierten App-Funktion."],"Keep your tools in sync automatically.":["Halten Sie Ihre Werkzeuge automatisch synchron."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Dies wird OttoKit auf Ihrer WordPress-Seite installieren und aktivieren, um Automatisierungsfunktionen zu erm\u00f6glichen."],"Automate Your Forms with OttoKit":["Automatisieren Sie Ihre Formulare mit OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Jede Formular\u00fcbermittlung sollte etwas ausl\u00f6sen \u2014 eine Slack-Benachrichtigung, einen CRM-Lead, eine Follow-up-E-Mail oder eine neue Zeile in Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Erstellen Sie interaktive Quizze, um Ihr Publikum zu begeistern und Erkenntnisse zu gewinnen."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Entwerfen Sie ansprechende Quizze mit verschiedenen Fragetypen, personalisiertem Feedback und automatisierter Bewertung, um Ihr Publikum zu fesseln und wertvolle Einblicke zu gewinnen."],"Create interactive quizzes with multiple question types.":["Erstellen Sie interaktive Quizze mit verschiedenen Fragetypen."],"Provide personalized feedback based on user responses.":["Geben Sie personalisiertes Feedback basierend auf den Benutzerantworten."],"Automate scoring and lead segmentation for better insights.":["Automatisieren Sie die Bewertung und Lead-Segmentierung f\u00fcr bessere Einblicke."],"Heading 1":["\u00dcberschrift 1"],"Heading 2":["\u00dcberschrift 2"],"Heading 3":["\u00dcberschrift 3"],"Heading 4":["\u00dcberschrift 4"],"Heading 5":["\u00dcberschrift 5"],"Heading 6":["\u00dcberschrift 6"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formular"],"Fields":["Felder"],"Image":["Bild"],"Activated":["Aktiviert"],"Activate":["Aktivieren"],"Submit":["Einreichen"],"Global Settings":["Globale Einstellungen"],"Form Title":["Formulartitel"],"Edit":["Bearbeiten"],"Please enter a valid URL.":["Bitte geben Sie eine g\u00fcltige URL ein."],"Desktop":["Desktop"],"Medium":["Mittel"],"Mobile":["Mobil"],"Repeat":["Wiederholen"],"Scroll":["Scrollen"],"Signature":["Unterschrift"],"Tablet":["Tablet"],"Upload":["Hochladen"],"Basic":["Grundlegend"],"Form Settings":["Formulareinstellungen"],"General":["Allgemein"],"Style":["Stil"],"Advanced":["Fortgeschritten"],"No tags available":["Keine Tags verf\u00fcgbar"],"Device":["Ger\u00e4t"],"Select Shortcodes":["Shortcodes ausw\u00e4hlen"],"Page Break Label":["Seitenumbruch-Label"],"Next":["Weiter"],"Back":["Zur\u00fcck"],"Reset":["Zur\u00fccksetzen"],"Generic tags":["Allgemeine Tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Einheiten ausw\u00e4hlen"],"%s units":["%s Einheiten"],"Margin":["Marge"],"None":["Keine"],"Custom":["Benutzerdefiniert"],"Please add a option props to MultiButtonsControl":["Bitte f\u00fcgen Sie eine Option props zu MultiButtonsControl hinzu"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"Processing\u2026":["Verarbeitung\u2026"],"Select Video":["Video ausw\u00e4hlen"],"Change Video":["Video \u00e4ndern"],"Select Lottie Animation":["Lottie-Animation ausw\u00e4hlen"],"Change Lottie Animation":["Lottie-Animation \u00e4ndern"],"Upload SVG":["SVG hochladen"],"Change SVG":["SVG \u00e4ndern"],"Select Image":["Bild ausw\u00e4hlen"],"Change Image":["Bild \u00e4ndern"],"Upload SVG?":["SVG hochladen?"],"Upload SVG can be potentially risky. Are you sure?":["Das Hochladen von SVG kann potenziell riskant sein. Bist du sicher?"],"Upload Anyway":["Trotzdem hochladen"],"Full Width":["Volle Breite"],"Install":["Installieren"],"Plugin Installation failed, Please try again later.":["Plugin-Installation fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Plugin activation failed, Please try again later.":["Plugin-Aktivierung fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Integrations":["Integrationen"],"%s Removed from Quick Action Bar.":["%s wurde aus der Schnellzugriffsleiste entfernt."],"Add to Quick Action Bar":["Zur Schnellzugriffsleiste hinzuf\u00fcgen"],"%s Added to Quick Action Bar.":["%s zur Schnellzugriffsleiste hinzugef\u00fcgt."],"Already Present in Quick Action Bar":["Bereits in der Schnellzugriffsleiste vorhanden"],"No results found.":["Keine Ergebnisse gefunden."],"data object is empty":["Datenobjekt ist leer"],"Add blocks to Quick Action Bar":["Bl\u00f6cke zur Schnellzugriffsleiste hinzuf\u00fcgen"],"Re-arrange block inside Quick Action Bar":["Block im Schnellaktionsbereich neu anordnen"],"Upgrade":["Aktualisieren"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installieren & Aktivieren"],"Compliance Settings":["Compliance-Einstellungen"],"Enable GDPR Compliance":["Aktivieren Sie die DSGVO-Konformit\u00e4t"],"Never store entry data after form submission":["Speichern Sie niemals Eingabedaten nach dem Absenden des Formulars"],"When enabled this form will never store Entries.":["Wenn aktiviert, speichert dieses Formular niemals Eintr\u00e4ge."],"Automatically delete entries":["Eintr\u00e4ge automatisch l\u00f6schen"],"When enabled this form will automatically delete entries after a certain period of time.":["Wenn aktiviert, wird dieses Formular Eintr\u00e4ge nach einer bestimmten Zeitspanne automatisch l\u00f6schen."],"Entries older than the days set will be deleted automatically.":["Eintr\u00e4ge, die \u00e4lter sind als die festgelegten Tage, werden automatisch gel\u00f6scht."],"Custom CSS":["Benutzerdefiniertes CSS"],"The following CSS styles added below will only apply to this form container.":["Die folgenden unten hinzugef\u00fcgten CSS-Stile gelten nur f\u00fcr diesen Formularcontainer."],"Visual":["Visuell"],"HTML":["HTML"],"All Data":["Alle Daten"],"Add Shortcode":["Shortcode hinzuf\u00fcgen"],"Form input tags":["Formulareingabetags"],"Comma separated values are also accepted.":["Kommagetrennte Werte werden ebenfalls akzeptiert."],"Email Notification":["E-Mail-Benachrichtigung"],"Name":["Name"],"Send Email To":["E-Mail senden an"],"Subject":["Betreff"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Antworten an"],"Add Notification":["Benachrichtigung hinzuf\u00fcgen"],"Add Key":["Schl\u00fcssel hinzuf\u00fcgen"],"Add Value":["Wert hinzuf\u00fcgen"],"Add":["Hinzuf\u00fcgen"],"Confirmation Message":["Best\u00e4tigungsnachricht"],"After Form Submission":["Nach dem Absenden des Formulars"],"Hide Form":["Formular ausblenden"],"Reset Form":["Formular zur\u00fccksetzen"],"Custom URL":["Benutzerdefinierte URL"],"Add Query Parameters":["Abfrageparameter hinzuf\u00fcgen"],"Select if you want to add key-value pairs for form fields to include in query parameters":["W\u00e4hlen Sie, ob Sie Schl\u00fcssel-Wert-Paare f\u00fcr Formularfelder hinzuf\u00fcgen m\u00f6chten, die in Abfrageparametern enthalten sein sollen"],"Query Parameters":["Abfrageparameter"],"Please select a page.":["Bitte w\u00e4hlen Sie eine Seite aus."],"Suggestion: URL should use HTTPS":["Vorschlag: Die URL sollte HTTPS verwenden"],"Success Message":["Erfolgsmeldung"],"Redirect":["Weiterleiten"],"Redirect to":["Weiterleiten zu"],"Page":["Seite"],"Form Confirmation":["Formularbest\u00e4tigung"],"Confirmation Type":["Best\u00e4tigungstyp"],"Use Labels as Placeholders":["Verwenden Sie Labels als Platzhalter"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Diese Einstellung platziert die Beschriftungen innerhalb der Felder als Platzhalter (wo m\u00f6glich). Diese Einstellung wirkt sich nur auf der Live-Seite aus, nicht in der Editor-Vorschau."],"Page Break":["Seitenumbruch"],"Show Labels":["Etiketten anzeigen"],"First Page Label":["Erstes Seitenetikett"],"Progress Indicator":["Fortschrittsanzeige"],"Progress Bar":["Fortschrittsbalken"],"Connector":["Verbinder"],"Steps":["Schritte"],"Next Button Text":["Text der Schaltfl\u00e4che \"Weiter\""],"Back Button Text":["Zur\u00fcck-Schaltfl\u00e4chentext"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Sind Sie sicher, dass Sie schlie\u00dfen m\u00f6chten? Ihre nicht gespeicherten \u00c4nderungen gehen verloren, da Sie einige Validierungsfehler haben."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Es gibt einige nicht gespeicherte \u00c4nderungen. Bitte speichern Sie Ihre \u00c4nderungen, um die Aktualisierungen zu \u00fcbernehmen."],"Form Behavior":["Formverhalten"],"Clear":["Klar"],"Select Color":["Farbe ausw\u00e4hlen"],"Primary Color":["Prim\u00e4rfarbe"],"Text Color":["Textfarbe"],"Text Color on Primary":["Textfarbe auf Prim\u00e4r"],"Field Spacing":["Feldabstand"],"Small":["Klein"],"Large":["Gro\u00df"],"Left":["Links"],"Center":["Zentrum"],"Right":["Richtig"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Unsichtbar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Datumsauswahl"],"Time Picker":["Zeitw\u00e4hler"],"Hidden":["Versteckt"],"Slider":["Schieberegler"],"Rating":["Bewertung"],"Upgrade to Unlock These Fields":["Upgrade, um diese Felder freizuschalten"],"Add Block":["Block hinzuf\u00fcgen"],"Customize with SureForms":["Anpassen mit SureForms"],"Page break":["Seitenumbruch"],"Previous":["Zur\u00fcck"],"Thank you":["Danke"],"Form submitted successfully!":["Formular erfolgreich eingereicht!"],"Instant Form":["Sofortformular"],"Enable Instant Form":["Sofortformular aktivieren"],"Enable Preview":["Vorschau aktivieren"],"Show Title":["Titel anzeigen"],"Site Logo":["Seitenlogo"],"Banner Background":["Banner-Hintergrund"],"Color":["Farbe"],"Upload Image":["Bild hochladen"],"Background Color":["Hintergrundfarbe"],"Use banner as page background":["Verwenden Sie das Banner als Seitenhintergrund"],"Form Width":["Formularbreite"],"URL":["URL"],"URL Slug":["URL-Slug"],"The last part of the URL.":["Der letzte Teil der URL."],"Learn more.":["Erfahren Sie mehr."],"SureForms Description":["SureForms Beschreibung"],"Form Options":["Formularoptionen"],"Form Shortcode":["Formular-Kurzcode"],"Paste this shortcode on the page or post to render this form.":["F\u00fcgen Sie diesen Shortcode auf der Seite oder im Beitrag ein, um dieses Formular anzuzeigen."],"Spam Protection":["Spam-Schutz"],"Auto":["Auto"],"Normal":["Normal"],"%":["%"],"Top":["Oben"],"Bottom":["Unten"],"Solid":["Fest"],"Width":["Breite"],"Size":["Gr\u00f6\u00dfe"],"EM":["EM"],"Padding":["Polsterung"],"Color 1":["Farbe 1"],"Color 2":["Farbe 2"],"Type":["Typ"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Standort 1"],"Location 2":["Standort 2"],"Angle":["Winkel"],"Classic":["Klassisch"],"Gradient":["Gradient"],"Background":["Hintergrund"],"Cover":["Abdeckung"],"Contain":["Enthalten"],"Overlay":["\u00dcberlagerung"],"No Repeat":["Keine Wiederholung"],"Overlay Opacity":["\u00dcberlagerungsdeckkraft"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Klassennamen sollten durch Leerzeichen getrennt werden. Jeder Klassenname darf nicht mit einer Ziffer, einem Bindestrich oder einem Unterstrich beginnen. Sie d\u00fcrfen nur Buchstaben (einschlie\u00dflich Unicode-Zeichen), Zahlen, Bindestriche und Unterstriche enthalten."],"Conversational Layout":["Konversationelles Layout"],"Unlock Conversational Forms":["Konversationelle Formulare freischalten"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Mit dem SureForms Pro Plan k\u00f6nnen Sie Ihre Formulare in ansprechende, dialogorientierte Layouts verwandeln, um ein nahtloses Benutzererlebnis zu schaffen."],"Premium":["Premium"],"Overlay Type":["Overlay-Typ"],"Image Overlay Color":["Bild\u00fcberlagerungsfarbe"],"Image Position":["Bildposition"],"Attachment":["Anhang"],"Fixed":["Fest"],"Blend Mode":["Mischmodus"],"Multiply":["Multiplizieren"],"Screen":["Bildschirm"],"Darken":["Verdunkeln"],"Lighten":["Erleichtern"],"Color Dodge":["Farb-Abwedeln"],"Saturation":["S\u00e4ttigung"],"Repeat-x":["Wiederholen-x"],"Repeat-y":["Wiederhole-y"],"PX":["PX"],"Button":["Schaltfl\u00e4che"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Mit OttoKit verbinden"],"SUREFORMS PREMIUM FIELDS":["SUREFORMS PREMIUM-FELDER"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%1$s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen \u00fcbereinstimmt (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden."],"We strongly recommend that you install the free ":["Wir empfehlen Ihnen dringend, die kostenlose"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["Plugin! Der Einrichtungsassistent macht es einfach, Ihre E-Mails zu reparieren."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativ k\u00f6nnen Sie versuchen, eine Absenderadresse zu verwenden, die mit Ihrer Website-Domain \u00fcbereinstimmt (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Bitte geben Sie eine g\u00fcltige E-Mail-Adresse ein. Ihre Benachrichtigungen werden nicht gesendet, wenn das Feld nicht korrekt ausgef\u00fcllt ist."],"From Name":["Von Name"],"From Email":["Von E-Mail"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Die aktuelle 'Von-E-Mail'-Adresse stimmt m\u00f6glicherweise nicht mit Ihrem Website-Domainnamen (%1$s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen \u00fcbereinstimmt (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Die aktuelle 'Von-E-Mail'-Adresse stimmt m\u00f6glicherweise nicht mit Ihrem Website-Domainnamen (%s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden."],"Border Radius":["Randradius"],"Form Theme":["Formular-Thema"],"Instant Form Padding":["Sofortige Formularpolsterung"],"Instant Form Border Radius":["Sofortige Formular-Randradius"],"Select Gradient":["Gradient ausw\u00e4hlen"],"Upgrade Now":["Jetzt upgraden"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Eintr\u00e4ge, die \u00e4lter als die ausgew\u00e4hlten Tage sind, werden gel\u00f6scht."],"Entries Time Period":["Eintr\u00e4ge Zeitraum"],"Custom CSS Panel":["Benutzerdefiniertes CSS-Panel"],"Notifications can use only one From Email so please enter a single address.":["Benachrichtigungen k\u00f6nnen nur eine Absender-E-Mail verwenden, daher geben Sie bitte eine einzelne Adresse ein."],"Email Notifications":["E-Mail-Benachrichtigungen"],"Actions":["Aktionen"],"Duplicate":["Duplikat"],"Delete":["L\u00f6schen"],"Select Page to redirect":["Seite zum Weiterleiten ausw\u00e4hlen"],"Search for a page":["Suche nach einer Seite"],"Select a page":["W\u00e4hlen Sie eine Seite aus"],"reCAPTCHA v2":["reCAPTCHA v2"],"Save":["Speichern"],"Login":["Anmelden"],"Register":["Registrieren"],"Date":["Datum"],"Advanced Settings":["Erweiterte Einstellungen"],"Form Restriction":["Formulareinschr\u00e4nkung"],"Maximum Number of Entries":["Maximale Anzahl von Eintr\u00e4gen"],"Maximum Entries":["Maximale Eintr\u00e4ge"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["Die Einstellung des Zeitraums funktioniert gem\u00e4\u00df der Zeitzone Ihrer WordPress-Website. Klicken Sie hier<\/a>, um Ihre allgemeinen WordPress-Einstellungen zu \u00f6ffnen, wo Sie diese \u00fcberpr\u00fcfen und aktualisieren k\u00f6nnen."],"Click here":["Klicken Sie hier"],"Response Description After Maximum Entries":["Antwortbeschreibung nach maximalen Eintr\u00e4gen"],"All changes will be saved automatically when you press back.":["Alle \u00c4nderungen werden automatisch gespeichert, wenn Sie zur\u00fcck dr\u00fccken."],"Repeater":["Wiederholer"],"OttoKit Settings":["OttoKit-Einstellungen"],"Get Started":["Loslegen"],"Connect Native Integrations with SureForms":["Native Integrationen mit SureForms verbinden"],"Expected format for emails - email@sureforms.com or John Doe ":["Erwartetes Format f\u00fcr E-Mails - email@sureforms.com oder John Doe "],"delete":["l\u00f6schen"],"Please type \"%s\" in the input box":["Bitte geben Sie \"%s\" in das Eingabefeld ein"],"To confirm, type \"%s\" in the box below:":["Um zu best\u00e4tigen, geben Sie \"%s\" in das Feld unten ein:"],"Type \"%s\"":["Geben Sie \"%s\" ein"],"Payment":["Zahlung"],"%s - Order ID":["%s - Bestell-ID"],"%s - Amount":["%s - Betrag"],"%s - Customer Email":["%s - Kunden-E-Mail"],"%s - Customer Name":["%s - Kundenname"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["F\u00fcgen Sie benutzerdefinierte CSS-Regeln hinzu, um dieses spezielle Formular unabh\u00e4ngig von globalen Stilen zu gestalten."],"Spam Protection Type":["Spam-Schutztyp"],"Select Security Type":["Sicherheitstyp ausw\u00e4hlen"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Hinweis: Die Verwendung verschiedener reCAPTCHA-Versionen (V2-Checkbox und V3) auf derselben Seite f\u00fchrt zu Konflikten zwischen den Versionen. Bitte vermeiden Sie die Verwendung unterschiedlicher Versionen auf derselben Seite."],"Select Version":["Version ausw\u00e4hlen"],"Please configure the API keys correctly from the settings":["Bitte konfigurieren Sie die API-Schl\u00fcssel korrekt in den Einstellungen."],"Control email alerts sent to admins or users after a form submission.":["Steuern Sie E-Mail-Benachrichtigungen, die nach einer Formular\u00fcbermittlung an Administratoren oder Benutzer gesendet werden."],"Customize the confirmation message or redirect the users after submitting the form.":["Passen Sie die Best\u00e4tigungsnachricht an oder leiten Sie die Benutzer nach dem Absenden des Formulars weiter."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Legen Sie fest, wie oft ein Formular eingereicht werden kann, und verwalten Sie Compliance-Optionen, einschlie\u00dflich DSGVO und Datenaufbewahrung."],"Go to OttoKit Settings":["Gehe zu den OttoKit-Einstellungen"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Verbinden Sie SureForms mit Ihren Lieblings-Apps, um Aufgaben zu automatisieren und Daten nahtlos zu synchronisieren."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Schalten Sie leistungsstarke Integrationen im Premium-Plan frei, um Ihre Arbeitsabl\u00e4ufe zu automatisieren und SureForms direkt mit Ihren Lieblingstools zu verbinden."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Senden Sie Formular\u00fcbermittlungen direkt an CRMs, E-Mail- und Marketingplattformen."],"Automate repetitive tasks with seamless data syncing.":["Automatisiere repetitive Aufgaben mit nahtloser Datensynchronisierung."],"Access exclusive native integrations for faster workflows.":["Zugriff auf exklusive native Integrationen f\u00fcr schnellere Arbeitsabl\u00e4ufe."],"PDF Generation":["PDF-Erstellung"],"Generate and customize PDF copies of form submissions.":["Erstellen und anpassen von PDF-Kopien von Formulareinsendungen."],"Generate Submission PDFs":["Einreichungs-PDFs erstellen"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Verwandeln Sie jeden Formulareintrag in eine polierte PDF-Datei, die sich perfekt f\u00fcr Berichte, Aufzeichnungen oder zum Teilen eignet."],"Automatically generate PDFs from your form submissions.":["Automatisch PDFs aus Ihren Formulareinsendungen erstellen."],"Customize PDF templates with your branding.":["Passen Sie PDF-Vorlagen mit Ihrem Branding an."],"Download or email PDFs instantly.":["Laden Sie PDFs sofort herunter oder senden Sie sie per E-Mail."],"User Registration":["Benutzerregistrierung"],"Onboard new users or update existing accounts through beautiful looking forms.":["Neue Benutzer an Bord nehmen oder bestehende Konten \u00fcber ansprechend gestaltete Formulare aktualisieren."],"Register Users with SureForms":["Benutzer mit SureForms registrieren"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Optimieren Sie den gesamten Benutzer-Onboarding-Prozess f\u00fcr Ihre Websites mit nahtlosen, formularbasierten Anmeldungen und Registrierungen."],"Register new users directly via your form submissions.":["Registrieren Sie neue Benutzer direkt \u00fcber Ihre Formular\u00fcbermittlungen."],"Create or update existing accounts by mapping form data to user fields.":["Erstellen oder aktualisieren Sie bestehende Konten, indem Sie Formulardaten auf Benutzerfelder abbilden."],"Assign roles and control access automatically.":["Rollen zuweisen und den Zugriff automatisch steuern."],"Post Feed":["Beitrags-Feed"],"Transform your form submission into WordPress posts.":["Verwandeln Sie Ihre Formular\u00fcbermittlung in WordPress-Beitr\u00e4ge."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Formulareinsendungen automatisch in WordPress-Beitr\u00e4ge, Seiten oder benutzerdefinierte Beitragstypen umwandeln. Sparen Sie viel Zeit und lassen Sie Ihre Formulare Inhalte direkt ver\u00f6ffentlichen."],"Create posts, pages, or CPTs from your form entries.":["Erstellen Sie Beitr\u00e4ge, Seiten oder CPTs aus Ihren Formulareintr\u00e4gen."],"Map form fields to your post fields easily.":["Ordnen Sie Formularfelder einfach Ihren Beitragsfeldern zu."],"Automate the content publishing flow with few simple steps.":["Automatisieren Sie den Ver\u00f6ffentlichungsprozess f\u00fcr Inhalte mit wenigen einfachen Schritten."],"Automations":["Automatisierungen"],"Unlock Advanced Styling":["Erweiterte Stiloptionen freischalten"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Erhalten Sie die volle Kontrolle \u00fcber das Erscheinungsbild Ihres Formulars mit benutzerdefinierten Farben, Schriftarten und Layouts."],"Button Alignment":["Schaltfl\u00e4chenanordnung"],"Add Custom CSS Class(es)":["Benutzerdefinierte CSS-Klasse(n) hinzuf\u00fcgen"],"Set the total number of submissions allowed for this form.":["Legen Sie die Gesamtanzahl der zul\u00e4ssigen Einreichungen f\u00fcr dieses Formular fest."],"Save & Progress":["Speichern & Fortfahren"],"Allow users to save their progress and continue form completion later.":["Erm\u00f6glichen Sie Benutzern, ihren Fortschritt zu speichern und die Formularausf\u00fcllung sp\u00e4ter fortzusetzen."],"Save & Progress in SureForms":["Speichern & Fortschritt in SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Geben Sie Ihren Nutzern die Flexibilit\u00e4t, Formulare in ihrem eigenen Tempo auszuf\u00fcllen, indem Sie ihnen erlauben, den Fortschritt zu speichern und jederzeit zur\u00fcckzukehren."],"Let users pause long or multi-step forms and continue later.":["Lassen Sie Benutzer lange oder mehrstufige Formulare pausieren und sp\u00e4ter fortsetzen."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Reduzieren Sie das Abbrechen von Formularen mit praktischen Wiederaufnahme-Links und greifen Sie von \u00fcberall auf deren Fortschritt zu."],"Improve user experience for lengthy, complex, or multi-page forms.":["Verbessern Sie die Benutzererfahrung f\u00fcr lange, komplexe oder mehrseitige Formulare."],"This form is not yet available. Please check back after the scheduled start time.":["Dieses Formular ist noch nicht verf\u00fcgbar. Bitte schauen Sie nach der geplanten Startzeit wieder vorbei."],"This form is no longer accepting submissions. The submission period has ended.":["Dieses Formular nimmt keine Einsendungen mehr an. Die Einreichungsfrist ist abgelaufen."],"The start date and time must be before the end date and time.":["Das Startdatum und die Startzeit m\u00fcssen vor dem Enddatum und der Endzeit liegen."],"Form Scheduling":["Formularplanung"],"Enable Form Scheduling":["Formularplanung aktivieren"],"Set a time period during which this form will be available for submissions.":["Legen Sie einen Zeitraum fest, in dem dieses Formular f\u00fcr Einreichungen verf\u00fcgbar sein wird."],"Start Date & Time":["Startdatum und -zeit"],"End Date & Time":["Enddatum & Uhrzeit"],"Response Description Before Start Date":["Antwortbeschreibung vor dem Startdatum"],"Response Description After End Date":["Antwortbeschreibung nach dem Enddatum"],"Conditional Confirmations":["Bedingte Best\u00e4tigungen"],"Set up the message or redirect users will see after submitting the form.":["Richten Sie die Nachricht ein oder leiten Sie die Benutzer weiter, die sie nach dem Absenden des Formulars sehen werden."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Zeigen Sie die richtige Nachricht dem richtigen Benutzer basierend darauf, wie sie reagieren. Personalisieren Sie Best\u00e4tigungen mit intelligenten Bedingungen und f\u00fchren Sie Benutzer automatisch zum n\u00e4chsten besten Schritt."],"Display different confirmation messages based on form responses.":["Zeigen Sie je nach Formularantworten unterschiedliche Best\u00e4tigungsnachrichten an."],"Redirect users to specific pages or URLs conditionally.":["Leiten Sie Benutzer bedingt auf bestimmte Seiten oder URLs weiter."],"Create personalized thank-you messages without extra forms.":["Erstellen Sie personalisierte Dankesnachrichten ohne zus\u00e4tzliche Formulare."],"Lost Password":["Passwort vergessen"],"Reset Password":["Passwort zur\u00fccksetzen"],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["W\u00e4hlen Sie einen Spam-Schutzdienst aus. Konfigurieren Sie API-Schl\u00fcssel in den globalen Einstellungen, bevor Sie ihn aktivieren."],"Send as Raw HTML":["Als Roh-HTML senden"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Wenn aktiviert, wird der HTML-Inhalt der E-Mail genau so beibehalten, wie er geschrieben wurde, und in eine professionelle E-Mail-Vorlage eingebettet."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Intelligente Tags, die auf vom Benutzer \u00fcbermittelte Felder verweisen, werden im Roh-HTML-Modus nicht maskiert. Vermeiden Sie es, nicht vertrauensw\u00fcrdige Feldwerte direkt in den E-Mail-Text einzuf\u00fcgen."],"Please provide a recipient email address and subject line.":["Bitte geben Sie eine Empf\u00e4nger-E-Mail-Adresse und eine Betreffzeile an."],"Email notification duplicated!":["E-Mail-Benachrichtigung dupliziert!"],"Are you sure you want to delete this email notification?":["Sind Sie sicher, dass Sie diese E-Mail-Benachrichtigung l\u00f6schen m\u00f6chten?"],"Email notification deleted!":["E-Mail-Benachrichtigung gel\u00f6scht!"],"URL is missing Top Level Domain (TLD).":["Die URL fehlt die Top-Level-Domain (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Dieses Formular ist jetzt geschlossen, da die maximale Anzahl an Eintr\u00e4gen erreicht wurde."],"Publish Your Form":["Ver\u00f6ffentlichen Sie Ihr Formular"],"Enable This to Instantly Publish the Form":["Aktivieren Sie dies, um das Formular sofort zu ver\u00f6ffentlichen"],"Style Your Instant Form Page Here":["Gestalten Sie hier Ihre Sofortformularseite"],"Quizzes":["Quizze"],"%s - Description":["%s - Beschreibung"],"Send entries to 100+ popular apps.":["Eintr\u00e4ge an \u00fcber 100 beliebte Apps senden."],"Build automated workflows that run instantly.":["Erstellen Sie automatisierte Workflows, die sofort ausgef\u00fchrt werden."],"Create custom app integrations using our Custom App feature.":["Erstellen Sie benutzerdefinierte App-Integrationen mit unserer benutzerdefinierten App-Funktion."],"Keep your tools in sync automatically.":["Halten Sie Ihre Werkzeuge automatisch synchron."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Dies wird OttoKit auf Ihrer WordPress-Seite installieren und aktivieren, um Automatisierungsfunktionen zu erm\u00f6glichen."],"Automate Your Forms with OttoKit":["Automatisieren Sie Ihre Formulare mit OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Jede Formular\u00fcbermittlung sollte etwas ausl\u00f6sen \u2014 eine Slack-Benachrichtigung, einen CRM-Lead, eine Follow-up-E-Mail oder eine neue Zeile in Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Erstellen Sie interaktive Quizze, um Ihr Publikum zu begeistern und Erkenntnisse zu gewinnen."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Entwerfen Sie ansprechende Quizze mit verschiedenen Fragetypen, personalisiertem Feedback und automatisierter Bewertung, um Ihr Publikum zu fesseln und wertvolle Einblicke zu gewinnen."],"Create interactive quizzes with multiple question types.":["Erstellen Sie interaktive Quizze mit verschiedenen Fragetypen."],"Provide personalized feedback based on user responses.":["Geben Sie personalisiertes Feedback basierend auf den Benutzerantworten."],"Automate scoring and lead segmentation for better insights.":["Automatisieren Sie die Bewertung und Lead-Segmentierung f\u00fcr bessere Einblicke."],"Heading 1":["\u00dcberschrift 1"],"Heading 2":["\u00dcberschrift 2"],"Heading 3":["\u00dcberschrift 3"],"Heading 4":["\u00dcberschrift 4"],"Heading 5":["\u00dcberschrift 5"],"Heading 6":["\u00dcberschrift 6"],"Form settings saved.":["Formulareinstellungen gespeichert."],"The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature.":["Die Eingabebegrenzung st\u00fctzt sich auf gespeicherte Eintr\u00e4ge, um Einsendungen zu z\u00e4hlen. Solange in den Compliance-Einstellungen die Option \"Eingabedaten nach dem Absenden des Formulars niemals speichern\" aktiviert ist, wird dieses Limit nicht durchgesetzt. Deaktivieren Sie diese Option oder entfernen Sie die Eingabebegrenzung, um diese Funktion zu nutzen."],"Settings saved, but post attributes (password \/ title \/ content) failed to update. Retry to persist them.":["Einstellungen gespeichert, aber die Beitragseigenschaften (Passwort \/ Titel \/ Inhalt) konnten nicht aktualisiert werden. Versuchen Sie es erneut, um sie zu speichern."],"Failed to save form settings.":["Speichern der Formulareinstellungen fehlgeschlagen."],"Saving\u2026":["Speichern\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Wenn aktiviert, speichert dieses Formular die IP-Adresse des Benutzers, den Browsernamen und den Ger\u00e4tenamen nicht in den Eintr\u00e4gen."],"Failed to save. Please try again.":["Speichern fehlgeschlagen. Bitte versuchen Sie es erneut."],"reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.":["reCAPTCHA-API-Schl\u00fcssel f\u00fcr die ausgew\u00e4hlte Version sind nicht konfiguriert. Stellen Sie sie in den globalen Einstellungen ein."],"Please select a reCAPTCHA version.":["Bitte w\u00e4hlen Sie eine reCAPTCHA-Version aus."],"hCaptcha API keys are not configured. Set them in Global Settings.":["hCaptcha-API-Schl\u00fcssel sind nicht konfiguriert. Legen Sie sie in den globalen Einstellungen fest."],"Cloudflare Turnstile API keys are not configured. Set them in Global Settings.":["Cloudflare Turnstile-API-Schl\u00fcssel sind nicht konfiguriert. Legen Sie sie in den globalen Einstellungen fest."],"Form data":["Formulardaten"],"Some fields need attention":["Einige Felder ben\u00f6tigen Aufmerksamkeit"],"Unsaved changes":["Nicht gespeicherte \u00c4nderungen"],"A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.":["Eine Empf\u00e4nger-E-Mail-Adresse und eine Betreffzeile sind erforderlich, bevor diese Benachrichtigung gespeichert werden kann. Beheben Sie die hervorgehobenen Felder oder verwerfen Sie Ihre \u00c4nderungen, um zur\u00fcckzugehen."],"You have unsaved changes for this notification. Discard them to go back, or stay to save them.":["Sie haben ungespeicherte \u00c4nderungen f\u00fcr diese Benachrichtigung. Verwerfen Sie sie, um zur\u00fcckzugehen, oder bleiben Sie, um sie zu speichern."],"Discard & go back":["Verwerfen & zur\u00fcckgehen"],"Stay & fix":["Bleiben & reparieren"],"Keep editing":["Weiter bearbeiten"],"Please provide a recipient email address.":["Bitte geben Sie eine Empf\u00e4nger-E-Mail-Adresse an."],"Please provide a subject line.":["Bitte geben Sie eine Betreffzeile an."],"Please provide a custom URL.":["Bitte geben Sie eine benutzerdefinierte URL an."],"You have unsaved changes. Discard them to continue, or stay to save your changes.":["Sie haben ungespeicherte \u00c4nderungen. Verwerfen Sie diese, um fortzufahren, oder bleiben Sie, um Ihre \u00c4nderungen zu speichern."],"Discard & continue":["Verwerfen & fortfahren"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-de_DE-46b85b18ab0a35677f7beff46af30190.json b/languages/sureforms-de_DE-46b85b18ab0a35677f7beff46af30190.json new file mode 100644 index 000000000..ca973b60f --- /dev/null +++ b/languages/sureforms-de_DE-46b85b18ab0a35677f7beff46af30190.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/htmlFormDetector.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Converted form":["Umgewandelte Form"],"SureForms could not authenticate this request. Please reload the editor and try again.":["SureForms konnte diese Anfrage nicht authentifizieren. Bitte laden Sie den Editor neu und versuchen Sie es erneut."],"%s \u2014 Converted form":["%s \u2014 Umgewandelte Form"],"Form converted to SureForms using AI. Review the new form for any tweaks.":["Formular mit KI in SureForms umgewandelt. \u00dcberpr\u00fcfen Sie das neue Formular auf Anpassungen."],"Form converted to SureForms.":["Formular in SureForms umgewandelt."],"You do not have permission to convert this form.":["Sie haben keine Berechtigung, dieses Formular zu konvertieren."],"This form is too large to convert. Try simplifying the markup or building the form manually.":["Dieses Formular ist zu gro\u00df, um es zu konvertieren. Versuchen Sie, das Markup zu vereinfachen oder das Formular manuell zu erstellen."],"SureForms could not derive any fields from this form.":["SureForms konnte keine Felder aus diesem Formular ableiten."],"The SureForms AI service could not process this form. Please try again or build the form manually.":["Der SureForms AI-Dienst konnte dieses Formular nicht verarbeiten. Bitte versuchen Sie es erneut oder erstellen Sie das Formular manuell."],"SureForms received an unexpected response. Please try again.":["SureForms hat eine unerwartete Antwort erhalten. Bitte versuchen Sie es erneut."],"Could not convert this form to SureForms. Please try again.":["Dieses Formular konnte nicht in SureForms konvertiert werden. Bitte versuchen Sie es erneut."],"Converting\u2026":["Konvertieren\u2026"],"Convert to SureForms":["In SureForms umwandeln"]}}} \ No newline at end of file diff --git a/languages/sureforms-de_DE-4b62e3f004dea2c587b5a3069263d994.json b/languages/sureforms-de_DE-4b62e3f004dea2c587b5a3069263d994.json index 7984eb64c..6061bc5d1 100644 --- a/languages/sureforms-de_DE-4b62e3f004dea2c587b5a3069263d994.json +++ b/languages/sureforms-de_DE-4b62e3f004dea2c587b5a3069263d994.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Einstellungen"],"Search":["Suche"],"Fields":["Felder"],"Image":["Bild"],"Submit":["Einreichen"],"Required":["Erforderlich"],"Form Title":["Formulartitel"],"Show":["Zeigen"],"Hide":["Verbergen"],"Edit Form":["Formular bearbeiten"],"Icon":["Symbol"],"Desktop":["Desktop"],"Medium":["Mittel"],"Mobile":["Mobil"],"Repeat":["Wiederholen"],"Scroll":["Scrollen"],"Tablet":["Tablet"],"Basic":["Grundlegend"],"(no title)":["(kein Titel)"],"Select a Form":["W\u00e4hlen Sie ein Formular aus"],"No forms found\u2026":["Keine Formulare gefunden\u2026"],"Choose":["W\u00e4hlen"],"Create New":["Neu erstellen"],"Change Form":["Formular \u00e4ndern"],"This form has been deleted or is unavailable.":["Dieses Formular wurde gel\u00f6scht oder ist nicht verf\u00fcgbar."],"Form Settings":["Formulareinstellungen"],"Show Form Title on this Page":["Formulartitel auf dieser Seite anzeigen"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Hinweis: F\u00fcr die Bearbeitung von SureForms, bitte den SureForms-Editor verwenden -"],"Field preview":["Feldvorschau"],"General":["Allgemein"],"Style":["Stil"],"Advanced":["Fortgeschritten"],"No tags available":["Keine Tags verf\u00fcgbar"],"Device":["Ger\u00e4t"],"Select Shortcodes":["Shortcodes ausw\u00e4hlen"],"Page Break Label":["Seitenumbruch-Label"],"Next":["Weiter"],"Back":["Zur\u00fcck"],"Reset":["Zur\u00fccksetzen"],"Generic tags":["Allgemeine Tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Einheiten ausw\u00e4hlen"],"%s units":["%s Einheiten"],"Margin":["Marge"],"Attributes":["Attribute"],"Input Pattern":["Eingabemuster"],"None":["Keine"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27.08.2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27.08.2024 23:59:59"],"Custom":["Benutzerdefiniert"],"Custom Mask":["Benutzerdefinierte Maske"],"Please check the documentation to manage custom input pattern ":["Bitte \u00fcberpr\u00fcfen Sie die Dokumentation, um das benutzerdefinierte Eingabemuster zu verwalten"],"here":["hier"],"Default Value":["Standardwert"],"Error Message":["Fehlermeldung"],"Help Text":["Hilfetext"],"Number Format":["Zahlenformat"],"US Style (Eg: 9,999.99)":["US-Stil (z. B.: 9.999,99)"],"EU Style (Eg: 9.999,99)":["EU-Stil (z. B.: 9.999,99)"],"Minimum Value":["Mindestwert"],"Maximum Value":["Maximalwert"],"Please check the Minimum and Maximum value":["Bitte \u00fcberpr\u00fcfen Sie den Mindest- und H\u00f6chstwert"],"Enable Email Confirmation":["E-Mail-Best\u00e4tigung aktivieren"],"Checked by Default":["Standardm\u00e4\u00dfig aktiviert"],"Error message":["Fehlermeldung"],"Checked by default":["Standardm\u00e4\u00dfig ausgew\u00e4hlt"],"Please add a option props to MultiButtonsControl":["Bitte f\u00fcgen Sie eine Option props zu MultiButtonsControl hinzu"],"Icon Library":["Icon-Bibliothek"],"Close":["Schlie\u00dfen"],"All Icons":["Alle Symbole"],"Other":["Andere"],"No Icons Found":["Keine Symbole gefunden"],"Insert Icon":["Symbol einf\u00fcgen"],"Change Icon":["Symbol \u00e4ndern"],"Choose Icon":["Symbol ausw\u00e4hlen"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"Processing\u2026":["Verarbeitung\u2026"],"Select Video":["Video ausw\u00e4hlen"],"Change Video":["Video \u00e4ndern"],"Select Lottie Animation":["Lottie-Animation ausw\u00e4hlen"],"Change Lottie Animation":["Lottie-Animation \u00e4ndern"],"Upload SVG":["SVG hochladen"],"Change SVG":["SVG \u00e4ndern"],"Select Image":["Bild ausw\u00e4hlen"],"Change Image":["Bild \u00e4ndern"],"Upload SVG?":["SVG hochladen?"],"Upload SVG can be potentially risky. Are you sure?":["Das Hochladen von SVG kann potenziell riskant sein. Bist du sicher?"],"Upload Anyway":["Trotzdem hochladen"],"Bulk Add":["Massenhinzuf\u00fcgen"],"Bulk Add Options":["Optionen in gro\u00dfen Mengen hinzuf\u00fcgen"],"Enter each option on a new line.":["Geben Sie jede Option in einer neuen Zeile ein."],"Insert Options":["Optionen einf\u00fcgen"],"Full Width":["Volle Breite"],"Option Type":["Optionstyp"],"Edit Options":["Optionen bearbeiten"],"Add New Option":["Neue Option hinzuf\u00fcgen"],"ADD":["HINZUF\u00dcGEN"],"Enable Auto Country Detection":["Automatische L\u00e4nderdetektion aktivieren"],"%s Width":["%s Breite"],"Upgrade":["Aktualisieren"],"Clear":["Klar"],"Select Color":["Farbe ausw\u00e4hlen"],"Primary Color":["Prim\u00e4rfarbe"],"Text Color":["Textfarbe"],"Field Spacing":["Feldabstand"],"Small":["Klein"],"Large":["Gro\u00df"],"Left":["Links"],"Center":["Zentrum"],"Right":["Richtig"],"Color":["Farbe"],"Background Color":["Hintergrundfarbe"],"Auto":["Auto"],"Default":["Standard"],"Normal":["Normal"],"%":["%"],"Top":["Oben"],"Bottom":["Unten"],"Width":["Breite"],"Size":["Gr\u00f6\u00dfe"],"EM":["EM"],"Padding":["Polsterung"],"Color 1":["Farbe 1"],"Color 2":["Farbe 2"],"Type":["Typ"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Standort 1"],"Location 2":["Standort 2"],"Angle":["Winkel"],"Classic":["Klassisch"],"Gradient":["Gradient"],"Horizontal":["Horizontal"],"Vertical":["Vertikal"],"Background":["Hintergrund"],"Cover":["Abdeckung"],"Contain":["Enthalten"],"Layout":["Layout"],"Overlay":["\u00dcberlagerung"],"No Repeat":["Keine Wiederholung"],"Overlay Opacity":["\u00dcberlagerungsdeckkraft"],"Conditional Logic":["Bedingte Logik"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Wechseln Sie zum SureForms Starter-Plan, um dynamische Formulare zu erstellen, die sich basierend auf Benutzereingaben anpassen und ein personalisiertes und effizientes Formularerlebnis bieten."],"Enable Conditional Logic":["Bedingte Logik aktivieren"],"this field if":["dieses Feld, wenn"],"Configure Conditions":["Bedingungen konfigurieren"],"Premium":["Premium"],"Overlay Type":["Overlay-Typ"],"Image Overlay Color":["Bild\u00fcberlagerungsfarbe"],"Image Position":["Bildposition"],"Attachment":["Anhang"],"Fixed":["Fest"],"Blend Mode":["Mischmodus"],"Multiply":["Multiplizieren"],"Screen":["Bildschirm"],"Darken":["Verdunkeln"],"Lighten":["Erleichtern"],"Color Dodge":["Farb-Abwedeln"],"Saturation":["S\u00e4ttigung"],"Repeat-x":["Wiederholen-x"],"Repeat-y":["Wiederhole-y"],"PX":["PX"],"Button":["Schaltfl\u00e4che"],"Prefix Label":["Pr\u00e4fix-Label"],"Suffix Label":["Suffix-Label"],"Border Radius":["Randradius"],"Form Theme":["Formular-Thema"],"Select Gradient":["Gradient ausw\u00e4hlen"],"Unlock Conditional Logic Editor":["Conditional Logic Editor entsperren"],"Rich Text Editor":["Rich-Text-Editor"],"Read Only":["Nur Lesen"],"Select Country":["Land ausw\u00e4hlen"],"Default Country":["Standardland"],"Subscription":["Abonnement"],"One Time":["Einmal"],"Unique Entry":["Einzigartiger Eintrag"],"Maximum Characters":["Maximale Zeichen"],"Textarea Height":["Textbereichsh\u00f6he"],"Minimum Selections":["Mindestanzahl an Auswahlen"],"Maximum Selections":["Maximale Auswahlen"],"Add Numeric Values to Options":["F\u00fcgen Sie numerische Werte zu Optionen hinzu"],"Single Choice Only":["Nur eine Auswahl m\u00f6glich"],"Enable Dropdown Search":["Dropdown-Suche aktivieren"],"Allow Multiple":["Mehrfach erlauben"],"%1$s fields are required. Please configure these fields in the block settings.":["%1$s Felder sind erforderlich. Bitte konfigurieren Sie diese Felder in den Blockeinstellungen."],"%1$s field is required. Please configure this field in the block settings.":["%1$s Feld ist erforderlich. Bitte konfigurieren Sie dieses Feld in den Blockeinstellungen."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Sie m\u00fcssen ein Zahlungskonto einrichten, um Zahlungen \u00fcber dieses Formular zu sammeln. Bitte konfigurieren Sie Ihren Zahlungsanbieter, um fortzufahren."],"Configure Payment Account":["Zahlungskonto konfigurieren"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Dies ist ein Platzhalter f\u00fcr den Zahlungsblock. Die tats\u00e4chlichen Zahlungsfelder f\u00fcr Ihre konfigurierten Zahlungsanbieter werden nur angezeigt, wenn Sie das Formular in der Vorschau anzeigen oder ver\u00f6ffentlichen."],"2 Payments":["2 Zahlungen"],"3 Payments":["3 Zahlungen"],"4 Payments":["4 Zahlungen"],"5 Payments":["5 Zahlungen"],"Never":["Niemals"],"Stop Subscription After":["Abonnement beenden nach"],"Choose when to automatically stop the subscription":["W\u00e4hlen Sie, wann das Abonnement automatisch beendet werden soll"],"Number of Payments":["Anzahl der Zahlungen"],"Enter a number between 1 to 100":["Geben Sie eine Zahl zwischen 1 und 100 ein"],"Form Field":["Formularfeld"],"Payment Type":["Zahlungsart"],"Subscription Plan Name":["Abonnementplanname"],"Billing Interval":["Abrechnungsintervall"],"Daily":["T\u00e4glich"],"Weekly":["W\u00f6chentlich"],"Monthly":["Monatlich"],"Quarterly":["Viertelj\u00e4hrlich"],"Yearly":["J\u00e4hrlich"],"Amount Type":["Betragstyp"],"Fixed Amount":["Fester Betrag"],"Dynamic Amount":["Dynamischer Betrag"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["W\u00e4hlen Sie, ob ein fester Betrag berechnet werden soll oder ob der Betrag basierend auf Benutzereingaben in anderen Formularfeldern berechnet werden soll."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Legen Sie den genauen Betrag fest, den Sie berechnen m\u00f6chten. Benutzer k\u00f6nnen ihn nicht \u00e4ndern"],"Choose Amount Field":["Betragsfeld ausw\u00e4hlen"],"Select a field\u2026":["W\u00e4hlen Sie ein Feld aus\u2026"],"Minimum Amount":["Mindestbetrag"],"Set the minimum amount users can enter (0 for no minimum)":["Legen Sie den Mindestbetrag fest, den Benutzer eingeben k\u00f6nnen (0 f\u00fcr kein Minimum)"],"Customer Name Field (Required)":["Kundenname-Feld (erforderlich)"],"Customer Name Field (Optional)":["Kundenname-Feld (Optional)"],"Select the input field that contains the customer name (Required for subscriptions)":["W\u00e4hlen Sie das Eingabefeld aus, das den Kundennamen enth\u00e4lt (Erforderlich f\u00fcr Abonnements)"],"Select the input field that contains the customer name":["W\u00e4hlen Sie das Eingabefeld aus, das den Kundennamen enth\u00e4lt"],"Customer Email Field (Required)":["Kunden-E-Mail-Feld (erforderlich)"],"Select the email field that contains the customer email":["W\u00e4hlen Sie das E-Mail-Feld aus, das die Kunden-E-Mail enth\u00e4lt"],"Payment":["Zahlung"],"%s - Order ID":["%s - Bestell-ID"],"%s - Amount":["%s - Betrag"],"%s - Customer Email":["%s - Kunden-E-Mail"],"%s - Customer Name":["%s - Kundenname"],"%s - Status":["%s - Status"],"Button Alignment":["Schaltfl\u00e4chenanordnung"],"Placeholder":["Platzhalter"],"Preselect this option":["Diese Option vorausw\u00e4hlen"],"Restrict Country Codes":["L\u00e4ndercodes einschr\u00e4nken"],"Restriction Type":["Einschr\u00e4nkungstyp"],"Allow":["Erlauben"],"Block":["Blockieren"],"Select Allowed Countries":["Zul\u00e4ssige L\u00e4nder ausw\u00e4hlen"],"Choose countries\u2026":["L\u00e4nder ausw\u00e4hlen\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["W\u00e4hlen Sie aus, welche L\u00e4ndercodes Benutzer im Telefonnummernfeld ausw\u00e4hlen k\u00f6nnen. Lassen Sie das Feld leer, um alle L\u00e4ndercodes zuzulassen."],"Select Blocked Countries":["Gesperrte L\u00e4nder ausw\u00e4hlen"],"These countries will be hidden from the dropdown.":["Diese L\u00e4nder werden im Dropdown-Men\u00fc ausgeblendet."],"Bulk Edit":["Massenbearbeitung"],"Select Layout":["Layout ausw\u00e4hlen"],"Number of Columns":["Anzahl der Spalten"],"Validation Message for Duplicate":["Validierungsnachricht f\u00fcr Duplikat"],"Click here to insert a form":["Klicken Sie hier, um ein Formular einzuf\u00fcgen"],"Inherit Form's Original Style":["Urspr\u00fcnglichen Stil des Formulars \u00fcbernehmen"],"Text on Primary":["Text auf Prim\u00e4r"],"%s - Description":["%s - Beschreibung"],"Upgrade to Unlock":["Upgrade zum Freischalten"],"Custom (Premium)":["Benutzerdefiniert (Premium)"],"Select a theme style for this form embed.":["W\u00e4hlen Sie einen Themenstil f\u00fcr dieses Formulareinbettung aus."],"Colors":["Farben"],"Advanced Styling":["Erweitertes Styling"],"Unlock Custom Styling":["Benutzerdefinierte Gestaltung freischalten"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Wechseln Sie in den benutzerdefinierten Modus, um die volle Kontrolle \u00fcber das Design und den Abstand Ihres Formulars zu \u00fcbernehmen."],"Full color control (buttons, fields, text)":["Volle Farbkontrolle (Schaltfl\u00e4chen, Felder, Text)"],"Row and column gap control":["Steuerung von Zeilen- und Spaltenabst\u00e4nden"],"Field spacing and layout precision":["Feldabst\u00e4nde und Layoutpr\u00e4zision"],"Complete button styling":["Komplette Schaltfl\u00e4chen-Stilgestaltung"],"Payment Description":["Zahlungsbeschreibung"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Auf Zahlungsbelegen und in Ihrem Zahlungs-Dashboard (Stripe und PayPal) angezeigt. Leer lassen, um den Standard zu verwenden."],"Slug":["Schnecke"],"Auto-generated on save":["Automatisch beim Speichern generiert"],"This slug is already used by another field. It will revert to the previous value.":["Dieser Slug wird bereits von einem anderen Feld verwendet. Er wird auf den vorherigen Wert zur\u00fcckgesetzt."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Das \u00c4ndern des Slugs kann Formular\u00fcbermittlungen, bedingte Logik, Integrationen oder andere Funktionen, die derzeit auf diesen Slug verweisen, beeintr\u00e4chtigen. Sie m\u00fcssen alle derartigen Verweise manuell aktualisieren."],"Field Slug":["Feld-Slug"],"Location Services":["Standortdienste"],"Unlock Address Autocomplete":["Adresse-Autovervollst\u00e4ndigung freischalten"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Upgrade, um die Google Address Autocomplete-Funktion mit interaktiver Kartenansicht zu aktivieren, wodurch die Adresseingabe f\u00fcr Ihre Nutzer schneller und genauer wird."],"Enable Google Autocomplete":["Google Autovervollst\u00e4ndigung aktivieren"],"Show Interactive Map":["Interaktive Karte anzeigen"],"Payments Per Page":["Zahlungen pro Seite"],"Show Subscriptions Section":["Abonnement-Bereich anzeigen"],"Show a dedicated subscriptions section above payment history.":["Zeige einen eigenen Abonnementbereich \u00fcber der Zahlungshistorie an."],"Payment Dashboard":["Zahlungs\u00fcbersicht"],"View your payments and manage subscriptions in a single dashboard.":["Sehen Sie Ihre Zahlungen ein und verwalten Sie Abonnements in einem einzigen Dashboard."],"Dynamic Default Value":["Dynamischer Standardwert"],"Minimum Characters":["Mindestanzahl von Zeichen"],"Minimum characters cannot exceed Maximum characters.":["Mindestanzahl an Zeichen darf die H\u00f6chstanzahl an Zeichen nicht \u00fcberschreiten."],"Both":["Beide"],"One-Time Label":["Einmaliges Etikett"],"Label shown to users for the one-time payment option.":["Beschriftung, die den Benutzern f\u00fcr die Einmalzahlungsoption angezeigt wird."],"Subscription Label":["Abonnementsetikett"],"Label shown to users for the subscription option.":["Beschriftung, die den Benutzern f\u00fcr die Abonnementoption angezeigt wird."],"Default Selection":["Standardauswahl"],"Which option is pre-selected when the form loads.":["Welche Option ist vorausgew\u00e4hlt, wenn das Formular geladen wird."],"One-Time Amount Type":["Einmaliger Betragstyp"],"Set how the one-time payment amount is determined.":["Legen Sie fest, wie der Einmalzahlungsbetrag bestimmt wird."],"One-Time Fixed Amount":["Einmaliger Festbetrag"],"Amount charged for a one-time payment.":["Betrag, der f\u00fcr eine einmalige Zahlung berechnet wird."],"One-Time Amount Field":["Einmaliger Betragsfeld"],"Pick a form field whose value determines the one-time payment amount.":["W\u00e4hlen Sie ein Formularfeld aus, dessen Wert den Einmalzahlungsbetrag bestimmt."],"One-Time Minimum Amount":["Einmaliger Mindestbetrag"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Mindestbetrag, den Benutzer f\u00fcr eine einmalige Zahlung eingeben k\u00f6nnen (0 f\u00fcr kein Minimum)."],"Subscription Amount Type":["Abonnementbetragstyp"],"Set how the subscription amount is determined.":["Legen Sie fest, wie der Abonnementbetrag bestimmt wird."],"Subscription Fixed Amount":["Abonnement Festbetrag"],"Recurring amount charged per billing interval.":["Wiederkehrender Betrag, der pro Abrechnungsintervall berechnet wird."],"Subscription Amount Field":["Feld f\u00fcr den Abonnementbetrag"],"Pick a form field whose value determines the subscription amount.":["W\u00e4hlen Sie ein Formularfeld aus, dessen Wert den Abonnementbetrag bestimmt."],"Subscription Minimum Amount":["Mindestbetrag f\u00fcr das Abonnement"],"Minimum amount users can enter for subscription (0 for no minimum).":["Mindestbetrag, den Benutzer f\u00fcr das Abonnement eingeben k\u00f6nnen (0 f\u00fcr kein Minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["W\u00e4hlen Sie ein Feld aus Ihrem Formular, wie eine Zahl, ein Dropdown-Men\u00fc, eine Mehrfachauswahl oder ein verstecktes Feld, dessen Wert den Zahlungsbetrag bestimmen soll."]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Einstellungen"],"Search":["Suche"],"Fields":["Felder"],"Image":["Bild"],"Submit":["Einreichen"],"Required":["Erforderlich"],"Form Title":["Formulartitel"],"Show":["Zeigen"],"Hide":["Verbergen"],"Edit Form":["Formular bearbeiten"],"Icon":["Symbol"],"Desktop":["Desktop"],"Medium":["Mittel"],"Mobile":["Mobil"],"Repeat":["Wiederholen"],"Scroll":["Scrollen"],"Tablet":["Tablet"],"Basic":["Grundlegend"],"(no title)":["(kein Titel)"],"Select a Form":["W\u00e4hlen Sie ein Formular aus"],"No forms found\u2026":["Keine Formulare gefunden\u2026"],"Choose":["W\u00e4hlen"],"Create New":["Neu erstellen"],"Change Form":["Formular \u00e4ndern"],"This form has been deleted or is unavailable.":["Dieses Formular wurde gel\u00f6scht oder ist nicht verf\u00fcgbar."],"Form Settings":["Formulareinstellungen"],"Show Form Title on this Page":["Formulartitel auf dieser Seite anzeigen"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Hinweis: F\u00fcr die Bearbeitung von SureForms, bitte den SureForms-Editor verwenden -"],"Field preview":["Feldvorschau"],"General":["Allgemein"],"Style":["Stil"],"Advanced":["Fortgeschritten"],"No tags available":["Keine Tags verf\u00fcgbar"],"Device":["Ger\u00e4t"],"Select Shortcodes":["Shortcodes ausw\u00e4hlen"],"Page Break Label":["Seitenumbruch-Label"],"Next":["Weiter"],"Back":["Zur\u00fcck"],"Reset":["Zur\u00fccksetzen"],"Generic tags":["Allgemeine Tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Einheiten ausw\u00e4hlen"],"%s units":["%s Einheiten"],"Margin":["Marge"],"Attributes":["Attribute"],"Input Pattern":["Eingabemuster"],"None":["Keine"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27.08.2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27.08.2024 23:59:59"],"Custom":["Benutzerdefiniert"],"Custom Mask":["Benutzerdefinierte Maske"],"Please check the documentation to manage custom input pattern ":["Bitte \u00fcberpr\u00fcfen Sie die Dokumentation, um das benutzerdefinierte Eingabemuster zu verwalten"],"here":["hier"],"Default Value":["Standardwert"],"Error Message":["Fehlermeldung"],"Help Text":["Hilfetext"],"Number Format":["Zahlenformat"],"US Style (Eg: 9,999.99)":["US-Stil (z. B.: 9.999,99)"],"EU Style (Eg: 9.999,99)":["EU-Stil (z. B.: 9.999,99)"],"Minimum Value":["Mindestwert"],"Maximum Value":["Maximalwert"],"Please check the Minimum and Maximum value":["Bitte \u00fcberpr\u00fcfen Sie den Mindest- und H\u00f6chstwert"],"Enable Email Confirmation":["E-Mail-Best\u00e4tigung aktivieren"],"Checked by Default":["Standardm\u00e4\u00dfig aktiviert"],"Error message":["Fehlermeldung"],"Checked by default":["Standardm\u00e4\u00dfig ausgew\u00e4hlt"],"Please add a option props to MultiButtonsControl":["Bitte f\u00fcgen Sie eine Option props zu MultiButtonsControl hinzu"],"Icon Library":["Icon-Bibliothek"],"Close":["Schlie\u00dfen"],"All Icons":["Alle Symbole"],"Other":["Andere"],"No Icons Found":["Keine Symbole gefunden"],"Insert Icon":["Symbol einf\u00fcgen"],"Change Icon":["Symbol \u00e4ndern"],"Choose Icon":["Symbol ausw\u00e4hlen"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"Processing\u2026":["Verarbeitung\u2026"],"Select Video":["Video ausw\u00e4hlen"],"Change Video":["Video \u00e4ndern"],"Select Lottie Animation":["Lottie-Animation ausw\u00e4hlen"],"Change Lottie Animation":["Lottie-Animation \u00e4ndern"],"Upload SVG":["SVG hochladen"],"Change SVG":["SVG \u00e4ndern"],"Select Image":["Bild ausw\u00e4hlen"],"Change Image":["Bild \u00e4ndern"],"Upload SVG?":["SVG hochladen?"],"Upload SVG can be potentially risky. Are you sure?":["Das Hochladen von SVG kann potenziell riskant sein. Bist du sicher?"],"Upload Anyway":["Trotzdem hochladen"],"Bulk Add":["Massenhinzuf\u00fcgen"],"Bulk Add Options":["Optionen in gro\u00dfen Mengen hinzuf\u00fcgen"],"Enter each option on a new line.":["Geben Sie jede Option in einer neuen Zeile ein."],"Insert Options":["Optionen einf\u00fcgen"],"Full Width":["Volle Breite"],"Option Type":["Optionstyp"],"Edit Options":["Optionen bearbeiten"],"Add New Option":["Neue Option hinzuf\u00fcgen"],"ADD":["HINZUF\u00dcGEN"],"Enable Auto Country Detection":["Automatische L\u00e4nderdetektion aktivieren"],"%s Width":["%s Breite"],"Upgrade":["Aktualisieren"],"Clear":["Klar"],"Select Color":["Farbe ausw\u00e4hlen"],"Primary Color":["Prim\u00e4rfarbe"],"Text Color":["Textfarbe"],"Field Spacing":["Feldabstand"],"Small":["Klein"],"Large":["Gro\u00df"],"Left":["Links"],"Center":["Zentrum"],"Right":["Richtig"],"Color":["Farbe"],"Background Color":["Hintergrundfarbe"],"Auto":["Auto"],"Default":["Standard"],"Normal":["Normal"],"%":["%"],"Top":["Oben"],"Bottom":["Unten"],"Width":["Breite"],"Size":["Gr\u00f6\u00dfe"],"EM":["EM"],"Padding":["Polsterung"],"Color 1":["Farbe 1"],"Color 2":["Farbe 2"],"Type":["Typ"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Standort 1"],"Location 2":["Standort 2"],"Angle":["Winkel"],"Classic":["Klassisch"],"Gradient":["Gradient"],"Horizontal":["Horizontal"],"Vertical":["Vertikal"],"Background":["Hintergrund"],"Cover":["Abdeckung"],"Contain":["Enthalten"],"Layout":["Layout"],"Overlay":["\u00dcberlagerung"],"No Repeat":["Keine Wiederholung"],"Overlay Opacity":["\u00dcberlagerungsdeckkraft"],"Conditional Logic":["Bedingte Logik"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Wechseln Sie zum SureForms Starter-Plan, um dynamische Formulare zu erstellen, die sich basierend auf Benutzereingaben anpassen und ein personalisiertes und effizientes Formularerlebnis bieten."],"Enable Conditional Logic":["Bedingte Logik aktivieren"],"this field if":["dieses Feld, wenn"],"Configure Conditions":["Bedingungen konfigurieren"],"Premium":["Premium"],"Overlay Type":["Overlay-Typ"],"Image Overlay Color":["Bild\u00fcberlagerungsfarbe"],"Image Position":["Bildposition"],"Attachment":["Anhang"],"Fixed":["Fest"],"Blend Mode":["Mischmodus"],"Multiply":["Multiplizieren"],"Screen":["Bildschirm"],"Darken":["Verdunkeln"],"Lighten":["Erleichtern"],"Color Dodge":["Farb-Abwedeln"],"Saturation":["S\u00e4ttigung"],"Repeat-x":["Wiederholen-x"],"Repeat-y":["Wiederhole-y"],"PX":["PX"],"Button":["Schaltfl\u00e4che"],"Prefix Label":["Pr\u00e4fix-Label"],"Suffix Label":["Suffix-Label"],"Border Radius":["Randradius"],"Form Theme":["Formular-Thema"],"Select Gradient":["Gradient ausw\u00e4hlen"],"Unlock Conditional Logic Editor":["Conditional Logic Editor entsperren"],"Rich Text Editor":["Rich-Text-Editor"],"Read Only":["Nur Lesen"],"Select Country":["Land ausw\u00e4hlen"],"Default Country":["Standardland"],"Subscription":["Abonnement"],"One Time":["Einmal"],"Unique Entry":["Einzigartiger Eintrag"],"Maximum Characters":["Maximale Zeichen"],"Textarea Height":["Textbereichsh\u00f6he"],"Minimum Selections":["Mindestanzahl an Auswahlen"],"Maximum Selections":["Maximale Auswahlen"],"Add Numeric Values to Options":["F\u00fcgen Sie numerische Werte zu Optionen hinzu"],"Single Choice Only":["Nur eine Auswahl m\u00f6glich"],"Enable Dropdown Search":["Dropdown-Suche aktivieren"],"Allow Multiple":["Mehrfach erlauben"],"%1$s fields are required. Please configure these fields in the block settings.":["%1$s Felder sind erforderlich. Bitte konfigurieren Sie diese Felder in den Blockeinstellungen."],"%1$s field is required. Please configure this field in the block settings.":["%1$s Feld ist erforderlich. Bitte konfigurieren Sie dieses Feld in den Blockeinstellungen."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Sie m\u00fcssen ein Zahlungskonto einrichten, um Zahlungen \u00fcber dieses Formular zu sammeln. Bitte konfigurieren Sie Ihren Zahlungsanbieter, um fortzufahren."],"Configure Payment Account":["Zahlungskonto konfigurieren"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Dies ist ein Platzhalter f\u00fcr den Zahlungsblock. Die tats\u00e4chlichen Zahlungsfelder f\u00fcr Ihre konfigurierten Zahlungsanbieter werden nur angezeigt, wenn Sie das Formular in der Vorschau anzeigen oder ver\u00f6ffentlichen."],"2 Payments":["2 Zahlungen"],"3 Payments":["3 Zahlungen"],"4 Payments":["4 Zahlungen"],"5 Payments":["5 Zahlungen"],"Never":["Niemals"],"Stop Subscription After":["Abonnement beenden nach"],"Choose when to automatically stop the subscription":["W\u00e4hlen Sie, wann das Abonnement automatisch beendet werden soll"],"Number of Payments":["Anzahl der Zahlungen"],"Enter a number between 1 to 100":["Geben Sie eine Zahl zwischen 1 und 100 ein"],"Form Field":["Formularfeld"],"Payment Type":["Zahlungsart"],"Subscription Plan Name":["Abonnementplanname"],"Billing Interval":["Abrechnungsintervall"],"Daily":["T\u00e4glich"],"Weekly":["W\u00f6chentlich"],"Monthly":["Monatlich"],"Quarterly":["Viertelj\u00e4hrlich"],"Yearly":["J\u00e4hrlich"],"Amount Type":["Betragstyp"],"Fixed Amount":["Fester Betrag"],"Dynamic Amount":["Dynamischer Betrag"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["W\u00e4hlen Sie, ob ein fester Betrag berechnet werden soll oder ob der Betrag basierend auf Benutzereingaben in anderen Formularfeldern berechnet werden soll."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Legen Sie den genauen Betrag fest, den Sie berechnen m\u00f6chten. Benutzer k\u00f6nnen ihn nicht \u00e4ndern"],"Choose Amount Field":["Betragsfeld ausw\u00e4hlen"],"Select a field\u2026":["W\u00e4hlen Sie ein Feld aus\u2026"],"Minimum Amount":["Mindestbetrag"],"Set the minimum amount users can enter (0 for no minimum)":["Legen Sie den Mindestbetrag fest, den Benutzer eingeben k\u00f6nnen (0 f\u00fcr kein Minimum)"],"Customer Name Field (Required)":["Kundenname-Feld (erforderlich)"],"Customer Name Field (Optional)":["Kundenname-Feld (Optional)"],"Select the input field that contains the customer name (Required for subscriptions)":["W\u00e4hlen Sie das Eingabefeld aus, das den Kundennamen enth\u00e4lt (Erforderlich f\u00fcr Abonnements)"],"Select the input field that contains the customer name":["W\u00e4hlen Sie das Eingabefeld aus, das den Kundennamen enth\u00e4lt"],"Customer Email Field (Required)":["Kunden-E-Mail-Feld (erforderlich)"],"Select the email field that contains the customer email":["W\u00e4hlen Sie das E-Mail-Feld aus, das die Kunden-E-Mail enth\u00e4lt"],"Payment":["Zahlung"],"%s - Order ID":["%s - Bestell-ID"],"%s - Amount":["%s - Betrag"],"%s - Customer Email":["%s - Kunden-E-Mail"],"%s - Customer Name":["%s - Kundenname"],"%s - Status":["%s - Status"],"Button Alignment":["Schaltfl\u00e4chenanordnung"],"Placeholder":["Platzhalter"],"Preselect this option":["Diese Option vorausw\u00e4hlen"],"Restrict Country Codes":["L\u00e4ndercodes einschr\u00e4nken"],"Restriction Type":["Einschr\u00e4nkungstyp"],"Allow":["Erlauben"],"Block":["Blockieren"],"Select Allowed Countries":["Zul\u00e4ssige L\u00e4nder ausw\u00e4hlen"],"Choose countries\u2026":["L\u00e4nder ausw\u00e4hlen\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["W\u00e4hlen Sie aus, welche L\u00e4ndercodes Benutzer im Telefonnummernfeld ausw\u00e4hlen k\u00f6nnen. Lassen Sie das Feld leer, um alle L\u00e4ndercodes zuzulassen."],"Select Blocked Countries":["Gesperrte L\u00e4nder ausw\u00e4hlen"],"These countries will be hidden from the dropdown.":["Diese L\u00e4nder werden im Dropdown-Men\u00fc ausgeblendet."],"Bulk Edit":["Massenbearbeitung"],"Select Layout":["Layout ausw\u00e4hlen"],"Number of Columns":["Anzahl der Spalten"],"Validation Message for Duplicate":["Validierungsnachricht f\u00fcr Duplikat"],"Click here to insert a form":["Klicken Sie hier, um ein Formular einzuf\u00fcgen"],"Inherit Form's Original Style":["Urspr\u00fcnglichen Stil des Formulars \u00fcbernehmen"],"Text on Primary":["Text auf Prim\u00e4r"],"%s - Description":["%s - Beschreibung"],"Upgrade to Unlock":["Upgrade zum Freischalten"],"Custom (Premium)":["Benutzerdefiniert (Premium)"],"Select a theme style for this form embed.":["W\u00e4hlen Sie einen Themenstil f\u00fcr dieses Formulareinbettung aus."],"Colors":["Farben"],"Advanced Styling":["Erweitertes Styling"],"Unlock Custom Styling":["Benutzerdefinierte Gestaltung freischalten"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Wechseln Sie in den benutzerdefinierten Modus, um die volle Kontrolle \u00fcber das Design und den Abstand Ihres Formulars zu \u00fcbernehmen."],"Full color control (buttons, fields, text)":["Volle Farbkontrolle (Schaltfl\u00e4chen, Felder, Text)"],"Row and column gap control":["Steuerung von Zeilen- und Spaltenabst\u00e4nden"],"Field spacing and layout precision":["Feldabst\u00e4nde und Layoutpr\u00e4zision"],"Complete button styling":["Komplette Schaltfl\u00e4chen-Stilgestaltung"],"Payment Description":["Zahlungsbeschreibung"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Auf Zahlungsbelegen und in Ihrem Zahlungs-Dashboard (Stripe und PayPal) angezeigt. Leer lassen, um den Standard zu verwenden."],"Slug":["Schnecke"],"Auto-generated on save":["Automatisch beim Speichern generiert"],"This slug is already used by another field. It will revert to the previous value.":["Dieser Slug wird bereits von einem anderen Feld verwendet. Er wird auf den vorherigen Wert zur\u00fcckgesetzt."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Das \u00c4ndern des Slugs kann Formular\u00fcbermittlungen, bedingte Logik, Integrationen oder andere Funktionen, die derzeit auf diesen Slug verweisen, beeintr\u00e4chtigen. Sie m\u00fcssen alle derartigen Verweise manuell aktualisieren."],"Field Slug":["Feld-Slug"],"Location Services":["Standortdienste"],"Unlock Address Autocomplete":["Adresse-Autovervollst\u00e4ndigung freischalten"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Upgrade, um die Google Address Autocomplete-Funktion mit interaktiver Kartenansicht zu aktivieren, wodurch die Adresseingabe f\u00fcr Ihre Nutzer schneller und genauer wird."],"Enable Google Autocomplete":["Google Autovervollst\u00e4ndigung aktivieren"],"Show Interactive Map":["Interaktive Karte anzeigen"],"Payments Per Page":["Zahlungen pro Seite"],"Show Subscriptions Section":["Abonnement-Bereich anzeigen"],"Show a dedicated subscriptions section above payment history.":["Zeige einen eigenen Abonnementbereich \u00fcber der Zahlungshistorie an."],"Payment Dashboard":["Zahlungs\u00fcbersicht"],"View your payments and manage subscriptions in a single dashboard.":["Sehen Sie Ihre Zahlungen ein und verwalten Sie Abonnements in einem einzigen Dashboard."],"Dynamic Default Value":["Dynamischer Standardwert"],"Minimum Characters":["Mindestanzahl von Zeichen"],"Minimum characters cannot exceed Maximum characters.":["Mindestanzahl an Zeichen darf die H\u00f6chstanzahl an Zeichen nicht \u00fcberschreiten."],"Both":["Beide"],"One-Time Label":["Einmaliges Etikett"],"Label shown to users for the one-time payment option.":["Beschriftung, die den Benutzern f\u00fcr die Einmalzahlungsoption angezeigt wird."],"Subscription Label":["Abonnementsetikett"],"Label shown to users for the subscription option.":["Beschriftung, die den Benutzern f\u00fcr die Abonnementoption angezeigt wird."],"Default Selection":["Standardauswahl"],"Which option is pre-selected when the form loads.":["Welche Option ist vorausgew\u00e4hlt, wenn das Formular geladen wird."],"One-Time Amount Type":["Einmaliger Betragstyp"],"Set how the one-time payment amount is determined.":["Legen Sie fest, wie der Einmalzahlungsbetrag bestimmt wird."],"One-Time Fixed Amount":["Einmaliger Festbetrag"],"Amount charged for a one-time payment.":["Betrag, der f\u00fcr eine einmalige Zahlung berechnet wird."],"One-Time Amount Field":["Einmaliger Betragsfeld"],"Pick a form field whose value determines the one-time payment amount.":["W\u00e4hlen Sie ein Formularfeld aus, dessen Wert den Einmalzahlungsbetrag bestimmt."],"One-Time Minimum Amount":["Einmaliger Mindestbetrag"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Mindestbetrag, den Benutzer f\u00fcr eine einmalige Zahlung eingeben k\u00f6nnen (0 f\u00fcr kein Minimum)."],"Subscription Amount Type":["Abonnementbetragstyp"],"Set how the subscription amount is determined.":["Legen Sie fest, wie der Abonnementbetrag bestimmt wird."],"Subscription Fixed Amount":["Abonnement Festbetrag"],"Recurring amount charged per billing interval.":["Wiederkehrender Betrag, der pro Abrechnungsintervall berechnet wird."],"Subscription Amount Field":["Feld f\u00fcr den Abonnementbetrag"],"Pick a form field whose value determines the subscription amount.":["W\u00e4hlen Sie ein Formularfeld aus, dessen Wert den Abonnementbetrag bestimmt."],"Subscription Minimum Amount":["Mindestbetrag f\u00fcr das Abonnement"],"Minimum amount users can enter for subscription (0 for no minimum).":["Mindestbetrag, den Benutzer f\u00fcr das Abonnement eingeben k\u00f6nnen (0 f\u00fcr kein Minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["W\u00e4hlen Sie ein Feld aus Ihrem Formular, wie eine Zahl, ein Dropdown-Men\u00fc, eine Mehrfachauswahl oder ein verstecktes Feld, dessen Wert den Zahlungsbetrag bestimmen soll."],"Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.":["Verwenden Sie ein Smart-Tag wie {get_input:country}. Die erste Option, deren Titel mit dem aufgel\u00f6sten Wert \u00fcbereinstimmt, wird vorausgew\u00e4hlt."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.":["Verwenden Sie ein Smart-Tag wie {get_input:colors} und \u00fcbergeben Sie durch Pipes getrennte Werte in der URL (zum Beispiel ?colors=Red|Blue). Jede Option, deren Titel mit einem Wert \u00fcbereinstimmt, wird ausgew\u00e4hlt. Sie k\u00f6nnen auch mehrere Smart-Tags durch Pipes getrennt verketten."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.":["Verwenden Sie ein Smart-Tag wie {get_input:colors} und \u00fcbergeben Sie durch Pipes getrennte Werte in der URL (zum Beispiel ?colors=Red|Blue). Jede Option, deren Bezeichnung mit einem Wert \u00fcbereinstimmt, wird vorausgew\u00e4hlt. Sie k\u00f6nnen auch mehrere Smart-Tags durch Pipes getrennt verketten."],"Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.":["Verwenden Sie ein Smart-Tag wie {get_input:country}. Die erste Option, deren Bezeichnung mit dem aufgel\u00f6sten Wert \u00fcbereinstimmt, wird vorausgew\u00e4hlt."]}}} \ No newline at end of file diff --git a/languages/sureforms-de_DE-51635fe6489fc8288d603fe596c755ca.json b/languages/sureforms-de_DE-51635fe6489fc8288d603fe596c755ca.json index ab2dae3aa..2f98c5c84 100644 --- a/languages/sureforms-de_DE-51635fe6489fc8288d603fe596c755ca.json +++ b/languages/sureforms-de_DE-51635fe6489fc8288d603fe596c755ca.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Armaturenbrett"],"Settings":["Einstellungen"],"Entries":["Eintr\u00e4ge"],"Activated":["Aktiviert"],"Activate":["Aktivieren"],"Monday":["Montag"],"Forms":["Formulare"],"GitHub":["GitHub"],"General":["Allgemein"],"Other":["Andere"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"Install":["Installieren"],"Plugin Installation failed, Please try again later.":["Plugin-Installation fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Plugin activation failed, Please try again later.":["Plugin-Aktivierung fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Integrations":["Integrationen"],"What's New?":["Was gibt's Neues?"],"Core":["Kern"],"Unlicensed":["Ohne Lizenz"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installieren & Aktivieren"],"Send Email To":["E-Mail senden an"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Unsichtbar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validierungen"],"Spam Protection":["Spam-Schutz"],"Email Summaries":["E-Mail-Zusammenfassungen"],"Tuesday":["Dienstag"],"Wednesday":["Mittwoch"],"Thursday":["Donnerstag"],"Friday":["Freitag"],"Saturday":["Samstag"],"Sunday":["Sonntag"],"Test Email":["Test-E-Mail"],"Schedule Reports":["Berichte planen"],"IP Logging":["IP-Protokollierung"],"If this option is turned on, the user's IP address will be saved with the form data":["Wenn diese Option aktiviert ist, wird die IP-Adresse des Benutzers zusammen mit den Formulardaten gespeichert."],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s repr\u00e4sentiert die minimal erforderlichen Auswahlen. Zum Beispiel: \u201eMindestens 2 Auswahlen sind erforderlich.\u201c"],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s repr\u00e4sentiert die maximal erlaubten Auswahlen. Zum Beispiel: \u201eMaximal 4 Auswahlen sind erlaubt.\u201c"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s repr\u00e4sentiert die minimal erforderlichen Auswahlm\u00f6glichkeiten. Zum Beispiel: \u201eMindestens 1 Auswahl ist erforderlich.\u201c"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s repr\u00e4sentiert die maximal erlaubten Auswahlm\u00f6glichkeiten. Zum Beispiel: \u201eMaximal 3 Auswahlen sind erlaubt.\u201c"]," Error Message":["Fehlermeldung"],"Auto":["Auto"],"Light":["Licht"],"Dark":["Dunkel"],"Turnstile":["Drehkreuz"],"Honeypot":["Honigtopf"],"Get Keys":["Schl\u00fcssel holen"],"Documentation":["Dokumentation"],"Site Key":["Standortschl\u00fcssel"],"Secret Key":["Geheimer Schl\u00fcssel"],"Cloudflare Turnstile":["Cloudflare-Drehkreuz"],"Appearance Mode":["Erscheinungsmodus"],"Enable Honeypot Security":["Honeypot-Sicherheit aktivieren"],"Enable Honeypot Security for better spam protection":["Aktivieren Sie Honeypot-Sicherheit f\u00fcr besseren Spamschutz"],"This field cannot be left blank.":["Dieses Feld darf nicht leer gelassen werden."],"Confirmation Email Mismatch Message":["Best\u00e4tigungs-E-Mail-Unstimmigkeitsnachricht"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s repr\u00e4sentiert den minimalen Eingabewert. Zum Beispiel: \"Der Mindestwert ist 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s repr\u00e4sentiert den maximalen Eingabewert. Zum Beispiel: \"Der Maximalwert ist 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Mit OttoKit verbinden"],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Bereit, \u00fcber den kostenlosen Plan hinauszugehen?"],"Upgrade now":["Jetzt upgraden"],"and unlock the full power of SureForms!":["und die volle Kraft von SureForms freischalten!"],"Upgrade SureForms":["SureForms aktualisieren"],"Upgrade Now":["Jetzt upgraden"],"Form Validation":["Formularvalidierung"],"Required Error Messages":["Erforderliche Fehlermeldungen"],"Other Error Messages":["Andere Fehlermeldungen"],"Input Field Unique":["Eingabefeld eindeutig"],"Email Field Unique":["E-Mail-Feld eindeutig"],"Invalid URL":["Ung\u00fcltige URL"],"Phone Field Unique":["Telefonfeld eindeutig"],"Invalid Field Number Block":["Ung\u00fcltiger Feldnummernblock"],"Invalid Email":["Ung\u00fcltige E-Mail"],"Number Minimum Value":["Zahlen-Mindestwert"],"Number Maximum Value":["Zahlen Maximalwert"],"Dropdown Minimum Selections":["Dropdown Minimale Auswahlen"],"Dropdown Maximum Selections":["Dropdown Maximale Auswahlen"],"Multiple Choice Minimum Selections":["Mehrfachauswahl Mindestanzahl der Auswahlen"],"Multiple Choice Maximum Selections":["Mehrfachauswahl Maximale Auswahlm\u00f6glichkeiten"],"Input Field":["Eingabefeld"],"Email Field":["E-Mail-Feld"],"URL Field":["URL-Feld"],"Phone Field":["Telefonfeld"],"Textarea Field":["Textbereichsfeld"],"Checkbox Field":["Kontrollk\u00e4stchenfeld"],"Dropdown Field":["Dropdown-Feld"],"Multiple Choice Field":["Mehrfachauswahlfeld"],"Address Field":["Adressfeld"],"Number Field":["Zahlenfeld"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Um die reCAPTCHA-Funktion in Ihren SureForms zu aktivieren, aktivieren Sie bitte die reCAPTCHA-Option in Ihren Blockeinstellungen und w\u00e4hlen Sie die Version aus. F\u00fcgen Sie hier den Google reCAPTCHA Secret und den Site Key hinzu. reCAPTCHA wird auf der Vorderseite Ihrer Seite hinzugef\u00fcgt."],"Enter your %s here":["Geben Sie hier Ihr %s ein"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Um hCAPTCHA zu aktivieren, f\u00fcgen Sie bitte Ihren Site-Schl\u00fcssel und Geheimschl\u00fcssel hinzu. Konfigurieren Sie diese Einstellungen innerhalb des einzelnen Formulars."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Um Cloudflare Turnstile zu aktivieren, f\u00fcgen Sie bitte Ihren Site-Schl\u00fcssel und Geheimschl\u00fcssel hinzu. Konfigurieren Sie diese Einstellungen innerhalb des einzelnen Formulars."],"Save":["Speichern"],"Anonymous Analytics":["Anonyme Analysen"],"Learn More":["Mehr erfahren"],"Admin Notification":["Administratorbenachrichtigung"],"Enable Admin Notification":["Admin-Benachrichtigung aktivieren"],"Admin notifications keep you informed about new form entries since your last visit.":["Admin-Benachrichtigungen halten Sie \u00fcber neue Formulareintr\u00e4ge seit Ihrem letzten Besuch auf dem Laufenden."],"Continue":["Fortfahren"],"Get Started":["Loslegen"],"Integration":["Integration"],"Connect Native Integrations with SureForms":["Native Integrationen mit SureForms verbinden"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Schalten Sie leistungsstarke Integrationen im Premium-Plan frei, um Ihre Arbeitsabl\u00e4ufe zu automatisieren und SureForms direkt mit Ihren Lieblingstools zu verbinden."],"Send form submissions straight to CRMs, email, and marketing platforms":["Senden Sie Formulareinsendungen direkt an CRMs, E-Mail- und Marketingplattformen"],"Automate repetitive tasks with seamless data syncing":["Automatisieren Sie repetitive Aufgaben mit nahtloser Datensynchronisierung"],"Access exclusive native integrations for faster workflows":["Zugriff auf exklusive native Integrationen f\u00fcr schnellere Arbeitsabl\u00e4ufe"],"Payments":["Zahlungen"],"Stripe account disconnected successfully.":["Stripe-Konto erfolgreich getrennt."],"Failed to create webhook.":["Fehler beim Erstellen des Webhooks."],"Failed to connect to Stripe.":["Verbindung zu Stripe fehlgeschlagen."],"Webhook":["Webhook"],"Knowledge Base":["Wissensdatenbank"],"What\u2019s New":["Was gibt's Neues"],"delete":["l\u00f6schen"],"Please type \"%s\" in the input box":["Bitte geben Sie \"%s\" in das Eingabefeld ein"],"To confirm, type \"%s\" in the box below:":["Um zu best\u00e4tigen, geben Sie \"%s\" in das Feld unten ein:"],"Type \"%s\"":["Geben Sie \"%s\" ein"],"Go to OttoKit Settings":["Gehe zu den OttoKit-Einstellungen"],"USD - US Dollar":["USD - US-Dollar"],"Payment Mode":["Zahlungsart"],"Test Mode":["Testmodus"],"Live Mode":["Live-Modus"],"General Settings":["Allgemeine Einstellungen"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Richten Sie E-Mail-Zusammenfassungen, Admin-Benachrichtigungen und Datenpr\u00e4ferenzen ein, um Ihre Formulare m\u00fchelos zu verwalten."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Passen Sie die Standardfehlermeldungen an, die angezeigt werden, wenn Benutzer ung\u00fcltige oder unvollst\u00e4ndige Formulareintr\u00e4ge \u00fcbermitteln."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Aktivieren Sie den Spam-Schutz f\u00fcr Ihre Formulare mithilfe von CAPTCHA-Diensten oder Honeypot-Sicherheit."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Verbinden und verwalten Sie Ihre Zahlungsgateways, um Transaktionen sicher \u00fcber Ihre Formulare zu akzeptieren."],"1% transaction and payment gateway fees apply.":["1% Transaktions- und Zahlungsgateway-Geb\u00fchren fallen an."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["2,9 % Transaktions- und Zahlungsgateway-Geb\u00fchren fallen an. Aktivieren Sie die Lizenz, um die Transaktionsgeb\u00fchren zu reduzieren."],"2.9% transaction and payment gateway fees apply.":["Es fallen 2,9 % Transaktions- und Zahlungs-Gateway-Geb\u00fchren an."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Bitte besuchen Sie %1$s, l\u00f6schen Sie einen ungenutzten Webhook und klicken Sie dann unten, um es erneut zu versuchen."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms konnte keinen Webhook erstellen, da Ihr Stripe-Konto keine freien Slots mehr hat. Webhooks sind erforderlich, um Updates zu Zahlungen zu erhalten."],"Stripe Dashboard":["Stripe-Dashboard"],"Creating\u2026":["Erstellen\u2026"],"Create Webhook":["Webhook erstellen"],"Successfully connected to Stripe!":["Erfolgreich mit Stripe verbunden!"],"Invalid response from server. Please try again.":["Ung\u00fcltige Antwort vom Server. Bitte versuchen Sie es erneut."],"Failed to disconnect Stripe account.":["Trennen des Stripe-Kontos fehlgeschlagen."],"Webhook created successfully!":["Webhook erfolgreich erstellt!"],"Select Currency":["W\u00e4hrung ausw\u00e4hlen"],"Select the default currency for payment forms.":["W\u00e4hlen Sie die Standardw\u00e4hrung f\u00fcr Zahlungsformulare aus."],"Connection Status":["Verbindungsstatus"],"Disconnect Stripe Account":["Stripe-Konto trennen"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Sind Sie sicher, dass Sie Ihr Stripe-Konto trennen m\u00f6chten? Dadurch werden alle aktiven Zahlungen, Abonnements und Formulartransaktionen, die mit diesem Konto verbunden sind, gestoppt."],"Disconnect":["Trennen"],"Disconnecting\u2026":["Trennen\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook erfolgreich verbunden, alle Stripe-Ereignisse werden verfolgt."],"Connect your Stripe account to start accepting payments through your forms.":["Verbinden Sie Ihr Stripe-Konto, um Zahlungen \u00fcber Ihre Formulare zu akzeptieren."],"Connect to Stripe":["Mit Stripe verbinden"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Verbinden Sie sich sicher mit Stripe, um mit nur wenigen Klicks Zahlungen zu akzeptieren!"],"Payment Methods":["Zahlungsmethoden"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Der Testmodus erm\u00f6glicht es Ihnen, Zahlungen ohne echte Belastungen zu verarbeiten. Wechseln Sie in den Live-Modus f\u00fcr tats\u00e4chliche Transaktionen."],"General Payment Settings":["Allgemeine Zahlungseinstellungen"],"These settings apply to all payment gateways.":["Diese Einstellungen gelten f\u00fcr alle Zahlungs-Gateways."],"Stripe Settings":["Stripe-Einstellungen"],"Left ($100)":["Links ($100)"],"Right (100$)":["Richtig (100$)"],"Left Space ($ 100)":["Verbleibender Platz ($ 100)"],"Right Space (100 $)":["Rechter Raum (100 $)"],"Currency Sign Position":["Position des W\u00e4hrungszeichens"],"Select the position of the currency symbol relative to the amount.":["W\u00e4hlen Sie die Position des W\u00e4hrungssymbols relativ zum Betrag aus."],"Learn":["Lernen"],"Enable email summaries":["E-Mail-Zusammenfassungen aktivieren"],"Enable IP logging":["IP-Protokollierung aktivieren"],"Turn on Admin Notification from here.":["Aktivieren Sie hier die Admin-Benachrichtigung."],"Send entries to 100+ popular apps.":["Eintr\u00e4ge an \u00fcber 100 beliebte Apps senden."],"Build automated workflows that run instantly.":["Erstellen Sie automatisierte Workflows, die sofort ausgef\u00fchrt werden."],"Create custom app integrations using our Custom App feature.":["Erstellen Sie benutzerdefinierte App-Integrationen mit unserer benutzerdefinierten App-Funktion."],"Keep your tools in sync automatically.":["Halten Sie Ihre Werkzeuge automatisch synchron."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Dies wird OttoKit auf Ihrer WordPress-Seite installieren und aktivieren, um Automatisierungsfunktionen zu erm\u00f6glichen."],"Automate Your Forms with OttoKit":["Automatisieren Sie Ihre Formulare mit OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Jede Formular\u00fcbermittlung sollte etwas ausl\u00f6sen \u2014 eine Slack-Benachrichtigung, einen CRM-Lead, eine Follow-up-E-Mail oder eine neue Zeile in Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Konfigurieren Sie die Berechtigungen des KI-Clients und die Einstellungen des MCP-Servers."],"View documentation":["Dokumentation anzeigen"],"Copy to clipboard":["In die Zwischenablage kopieren"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) oder %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Claude-Code"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (Projekt) oder ~\/.claude.json (global)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (Projekt) oder settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml oder config.json"],"Your client's MCP configuration file":["Die MCP-Konfigurationsdatei Ihres Kunden"],"Connect Your AI Client":["Verbinden Sie Ihren KI-Client"],"AI Client":["KI-Client"],"Create an Application Password \u2014 ":["Erstellen Sie ein Anwendungskennwort \u2014"],"Open Application Passwords":["Anwendungspassw\u00f6rter \u00f6ffnen"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Oder verwenden Sie diesen CLI-Befehl, um den Server schnell hinzuzuf\u00fcgen (Sie m\u00fcssen dennoch die Umgebungsvariablen festlegen):"],"Copy the JSON config below into: ":["Kopiere die JSON-Konfiguration unten in:"],"Replace \"your-application-password\" with the password from Step 1.":["Ersetzen Sie \"your-application-password\" durch das Passwort aus Schritt 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 der MCP-Endpunkt Ihrer Website. WP_API_USERNAME \u2014 Ihr WordPress-Benutzername. WP_API_PASSWORD \u2014 das Anwendungskennwort, das Sie erstellt haben."],"View setup docs":["Einrichtungsdokumente anzeigen"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Das MCP Adapter-Plugin ist installiert, aber nicht aktiv. Aktivieren Sie es, um die MCP-Einstellungen zu konfigurieren."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Das MCP Adapter-Plugin ist erforderlich, um AI-Clients mit Ihren Formularen zu verbinden. Laden Sie es von GitHub herunter, installieren Sie es und aktivieren Sie es dann."],"Download the latest release from":["Laden Sie die neueste Version herunter von"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installieren Sie das Plugin \u00fcber Plugins > Neues Plugin hinzuf\u00fcgen > Plugin hochladen."],"Activate the MCP Adapter plugin.":["Aktivieren Sie das MCP Adapter-Plugin."],"Activating\u2026":["Aktivierung\u2026"],"Activate MCP Adapter":["MCP-Adapter aktivieren"],"Download MCP Adapter":["MCP-Adapter herunterladen"],"Experimental":["Experimentell"],"Enable Abilities":["F\u00e4higkeiten aktivieren"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registriere die F\u00e4higkeiten von SureForms mit der WordPress Abilities API. Wenn aktiviert, k\u00f6nnen KI-Clients Ihre Formulare und Eintr\u00e4ge auflisten, lesen, erstellen, bearbeiten und l\u00f6schen. Wenn deaktiviert, werden keine F\u00e4higkeiten registriert und KI-Clients k\u00f6nnen keine Aktionen an Ihren Formularen durchf\u00fchren."],"Abilities API \u2014 Edit":["F\u00e4higkeiten-API \u2014 Bearbeiten"],"Enable Edit Abilities":["Bearbeitungsf\u00e4higkeiten aktivieren"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Wenn aktiviert, k\u00f6nnen KI-Clients neue Formulare erstellen, Formulartitel, Felder und Einstellungen aktualisieren, Formulare duplizieren und Eintragsstatus \u00e4ndern. Wenn deaktiviert, werden diese F\u00e4higkeiten abgemeldet und KI-Clients k\u00f6nnen nur Ihre Daten lesen."],"Abilities API \u2014 Delete":["F\u00e4higkeiten-API \u2014 L\u00f6schen"],"Enable Delete Abilities":["L\u00f6schf\u00e4higkeiten aktivieren"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Wenn aktiviert, k\u00f6nnen KI-Clients Formulare und Eintr\u00e4ge dauerhaft l\u00f6schen. Gel\u00f6schte Daten k\u00f6nnen nicht wiederhergestellt werden. Wenn deaktiviert, werden L\u00f6schf\u00e4higkeiten abgemeldet und KI-Clients k\u00f6nnen keine Daten entfernen."],"MCP Server":["MCP-Server"],"Enable MCP Server":["MCP-Server aktivieren"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Erstellt einen dedizierten SureForms MCP-Endpunkt, mit dem sich KI-Clients wie Claude verbinden k\u00f6nnen. Wenn er deaktiviert ist, wird der Endpunkt entfernt und externe KI-Clients k\u00f6nnen keine SureForms-Funktionen entdecken oder aufrufen."],"Learn more":["Mehr erfahren"],"MCP Adapter Required":["MCP-Adapter erforderlich"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Konfigurieren Sie den Google Maps API-Schl\u00fcssel f\u00fcr die Adressvervollst\u00e4ndigung und die Kartenansichtsvorschau."],"Help shape the future of SureForms":["Helfen Sie mit, die Zukunft von SureForms zu gestalten"],"Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ":["Teilen Sie uns mit, wie Sie das Plugin verwenden, damit wir Funktionen entwickeln k\u00f6nnen, die wichtig sind, Probleme schneller beheben und kl\u00fcgere Entscheidungen treffen k\u00f6nnen."],"Enable Google Address Autocomplete":["Google-Adress-Autovervollst\u00e4ndigung aktivieren"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Upgrade auf den SureForms Business-Plan, um Google-gest\u00fctzte Adressvervollst\u00e4ndigung mit interaktiver Kartenansicht zu Ihren Formularen hinzuzuf\u00fcgen."],"Auto-suggest addresses as users type for faster, error-free submissions":["Adressen automatisch vorschlagen, w\u00e4hrend Benutzer tippen, f\u00fcr schnellere und fehlerfreie Eingaben"],"Show an interactive map preview with draggable pin for precise locations":["Zeige eine interaktive Kartenansicht mit verschiebbarem Pin f\u00fcr pr\u00e4zise Standorte"],"Automatically populate address fields like city, state, and postal code":["Adressfelder wie Stadt, Bundesland und Postleitzahl automatisch ausf\u00fcllen"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Armaturenbrett"],"Settings":["Einstellungen"],"Entries":["Eintr\u00e4ge"],"Activated":["Aktiviert"],"Activate":["Aktivieren"],"Monday":["Montag"],"Forms":["Formulare"],"New Form Submission - %s":["Neue Formulareinreichung - %s"],"GitHub":["GitHub"],"(no title)":["(kein Titel)"],"General":["Allgemein"],"No tags available":["Keine Tags verf\u00fcgbar"],"Generic tags":["Allgemeine Tags"],"Other":["Andere"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"Install":["Installieren"],"Plugin Installation failed, Please try again later.":["Plugin-Installation fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Plugin activation failed, Please try again later.":["Plugin-Aktivierung fehlgeschlagen, bitte versuchen Sie es sp\u00e4ter erneut."],"Integrations":["Integrationen"],"What's New?":["Was gibt's Neues?"],"Core":["Kern"],"Unlicensed":["Ohne Lizenz"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installieren & Aktivieren"],"Compliance Settings":["Compliance-Einstellungen"],"Enable GDPR Compliance":["Aktivieren Sie die DSGVO-Konformit\u00e4t"],"Never store entry data after form submission":["Speichern Sie niemals Eingabedaten nach dem Absenden des Formulars"],"When enabled this form will never store Entries.":["Wenn aktiviert, speichert dieses Formular niemals Eintr\u00e4ge."],"Automatically delete entries":["Eintr\u00e4ge automatisch l\u00f6schen"],"When enabled this form will automatically delete entries after a certain period of time.":["Wenn aktiviert, wird dieses Formular Eintr\u00e4ge nach einer bestimmten Zeitspanne automatisch l\u00f6schen."],"Entries older than the days set will be deleted automatically.":["Eintr\u00e4ge, die \u00e4lter sind als die festgelegten Tage, werden automatisch gel\u00f6scht."],"Visual":["Visuell"],"HTML":["HTML"],"All Data":["Alle Daten"],"Add Shortcode":["Shortcode hinzuf\u00fcgen"],"Form input tags":["Formulareingabetags"],"Comma separated values are also accepted.":["Kommagetrennte Werte werden ebenfalls akzeptiert."],"Email Notification":["E-Mail-Benachrichtigung"],"Name":["Name"],"Send Email To":["E-Mail senden an"],"Subject":["Betreff"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Antworten an"],"Add Key":["Schl\u00fcssel hinzuf\u00fcgen"],"Add Value":["Wert hinzuf\u00fcgen"],"Add":["Hinzuf\u00fcgen"],"Confirmation Message":["Best\u00e4tigungsnachricht"],"After Form Submission":["Nach dem Absenden des Formulars"],"Hide Form":["Formular ausblenden"],"Reset Form":["Formular zur\u00fccksetzen"],"Custom URL":["Benutzerdefinierte URL"],"Add Query Parameters":["Abfrageparameter hinzuf\u00fcgen"],"Select if you want to add key-value pairs for form fields to include in query parameters":["W\u00e4hlen Sie, ob Sie Schl\u00fcssel-Wert-Paare f\u00fcr Formularfelder hinzuf\u00fcgen m\u00f6chten, die in Abfrageparametern enthalten sein sollen"],"Query Parameters":["Abfrageparameter"],"Success Message":["Erfolgsmeldung"],"Redirect":["Weiterleiten"],"Redirect to":["Weiterleiten zu"],"Page":["Seite"],"Form Confirmation":["Formularbest\u00e4tigung"],"Confirmation Type":["Best\u00e4tigungstyp"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Unsichtbar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validierungen"],"Spam Protection":["Spam-Schutz"],"Email Summaries":["E-Mail-Zusammenfassungen"],"Tuesday":["Dienstag"],"Wednesday":["Mittwoch"],"Thursday":["Donnerstag"],"Friday":["Freitag"],"Saturday":["Samstag"],"Sunday":["Sonntag"],"Test Email":["Test-E-Mail"],"Schedule Reports":["Berichte planen"],"IP Logging":["IP-Protokollierung"],"If this option is turned on, the user's IP address will be saved with the form data":["Wenn diese Option aktiviert ist, wird die IP-Adresse des Benutzers zusammen mit den Formulardaten gespeichert."],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s repr\u00e4sentiert die minimal erforderlichen Auswahlen. Zum Beispiel: \u201eMindestens 2 Auswahlen sind erforderlich.\u201c"],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s repr\u00e4sentiert die maximal erlaubten Auswahlen. Zum Beispiel: \u201eMaximal 4 Auswahlen sind erlaubt.\u201c"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s repr\u00e4sentiert die minimal erforderlichen Auswahlm\u00f6glichkeiten. Zum Beispiel: \u201eMindestens 1 Auswahl ist erforderlich.\u201c"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s repr\u00e4sentiert die maximal erlaubten Auswahlm\u00f6glichkeiten. Zum Beispiel: \u201eMaximal 3 Auswahlen sind erlaubt.\u201c"]," Error Message":["Fehlermeldung"],"Auto":["Auto"],"Light":["Licht"],"Dark":["Dunkel"],"Turnstile":["Drehkreuz"],"Honeypot":["Honigtopf"],"Get Keys":["Schl\u00fcssel holen"],"Documentation":["Dokumentation"],"Site Key":["Standortschl\u00fcssel"],"Secret Key":["Geheimer Schl\u00fcssel"],"Cloudflare Turnstile":["Cloudflare-Drehkreuz"],"Appearance Mode":["Erscheinungsmodus"],"Enable Honeypot Security":["Honeypot-Sicherheit aktivieren"],"Enable Honeypot Security for better spam protection":["Aktivieren Sie Honeypot-Sicherheit f\u00fcr besseren Spamschutz"],"Confirmation Email Mismatch Message":["Best\u00e4tigungs-E-Mail-Unstimmigkeitsnachricht"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s repr\u00e4sentiert den minimalen Eingabewert. Zum Beispiel: \"Der Mindestwert ist 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s repr\u00e4sentiert den maximalen Eingabewert. Zum Beispiel: \"Der Maximalwert ist 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Mit OttoKit verbinden"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%1$s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen \u00fcbereinstimmt (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden."],"We strongly recommend that you install the free ":["Wir empfehlen Ihnen dringend, die kostenlose"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["Plugin! Der Einrichtungsassistent macht es einfach, Ihre E-Mails zu reparieren."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativ k\u00f6nnen Sie versuchen, eine Absenderadresse zu verwenden, die mit Ihrer Website-Domain \u00fcbereinstimmt (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Bitte geben Sie eine g\u00fcltige E-Mail-Adresse ein. Ihre Benachrichtigungen werden nicht gesendet, wenn das Feld nicht korrekt ausgef\u00fcllt ist."],"From Name":["Von Name"],"From Email":["Von E-Mail"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Die aktuelle 'Von-E-Mail'-Adresse stimmt m\u00f6glicherweise nicht mit Ihrem Website-Domainnamen (%1$s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen \u00fcbereinstimmt (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Die aktuelle 'Von-E-Mail'-Adresse stimmt m\u00f6glicherweise nicht mit Ihrem Website-Domainnamen (%s) \u00fcberein. Dies kann dazu f\u00fchren, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden."],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Bereit, \u00fcber den kostenlosen Plan hinauszugehen?"],"Upgrade now":["Jetzt upgraden"],"and unlock the full power of SureForms!":["und die volle Kraft von SureForms freischalten!"],"Upgrade SureForms":["SureForms aktualisieren"],"Upgrade Now":["Jetzt upgraden"],"Entries older than the selected days will be deleted.":["Eintr\u00e4ge, die \u00e4lter als die ausgew\u00e4hlten Tage sind, werden gel\u00f6scht."],"Entries Time Period":["Eintr\u00e4ge Zeitraum"],"Notifications can use only one From Email so please enter a single address.":["Benachrichtigungen k\u00f6nnen nur eine Absender-E-Mail verwenden, daher geben Sie bitte eine einzelne Adresse ein."],"Select Page to redirect":["Seite zum Weiterleiten ausw\u00e4hlen"],"Search for a page":["Suche nach einer Seite"],"Select a page":["W\u00e4hlen Sie eine Seite aus"],"Form Validation":["Formularvalidierung"],"Required Error Messages":["Erforderliche Fehlermeldungen"],"Other Error Messages":["Andere Fehlermeldungen"],"Input Field Unique":["Eingabefeld eindeutig"],"Email Field Unique":["E-Mail-Feld eindeutig"],"Invalid URL":["Ung\u00fcltige URL"],"Phone Field Unique":["Telefonfeld eindeutig"],"Invalid Field Number Block":["Ung\u00fcltiger Feldnummernblock"],"Invalid Email":["Ung\u00fcltige E-Mail"],"Number Minimum Value":["Zahlen-Mindestwert"],"Number Maximum Value":["Zahlen Maximalwert"],"Dropdown Minimum Selections":["Dropdown Minimale Auswahlen"],"Dropdown Maximum Selections":["Dropdown Maximale Auswahlen"],"Multiple Choice Minimum Selections":["Mehrfachauswahl Mindestanzahl der Auswahlen"],"Multiple Choice Maximum Selections":["Mehrfachauswahl Maximale Auswahlm\u00f6glichkeiten"],"Input Field":["Eingabefeld"],"Email Field":["E-Mail-Feld"],"URL Field":["URL-Feld"],"Phone Field":["Telefonfeld"],"Textarea Field":["Textbereichsfeld"],"Checkbox Field":["Kontrollk\u00e4stchenfeld"],"Dropdown Field":["Dropdown-Feld"],"Multiple Choice Field":["Mehrfachauswahlfeld"],"Address Field":["Adressfeld"],"Number Field":["Zahlenfeld"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Um die reCAPTCHA-Funktion in Ihren SureForms zu aktivieren, aktivieren Sie bitte die reCAPTCHA-Option in Ihren Blockeinstellungen und w\u00e4hlen Sie die Version aus. F\u00fcgen Sie hier den Google reCAPTCHA Secret und den Site Key hinzu. reCAPTCHA wird auf der Vorderseite Ihrer Seite hinzugef\u00fcgt."],"Enter your %s here":["Geben Sie hier Ihr %s ein"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Um hCAPTCHA zu aktivieren, f\u00fcgen Sie bitte Ihren Site-Schl\u00fcssel und Geheimschl\u00fcssel hinzu. Konfigurieren Sie diese Einstellungen innerhalb des einzelnen Formulars."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Um Cloudflare Turnstile zu aktivieren, f\u00fcgen Sie bitte Ihren Site-Schl\u00fcssel und Geheimschl\u00fcssel hinzu. Konfigurieren Sie diese Einstellungen innerhalb des einzelnen Formulars."],"Save":["Speichern"],"Anonymous Analytics":["Anonyme Analysen"],"Learn More":["Mehr erfahren"],"Admin Notification":["Administratorbenachrichtigung"],"Enable Admin Notification":["Admin-Benachrichtigung aktivieren"],"Admin notifications keep you informed about new form entries since your last visit.":["Admin-Benachrichtigungen halten Sie \u00fcber neue Formulareintr\u00e4ge seit Ihrem letzten Besuch auf dem Laufenden."],"Continue":["Fortfahren"],"Maximum Number of Entries":["Maximale Anzahl von Eintr\u00e4gen"],"Maximum Entries":["Maximale Eintr\u00e4ge"],"Response Description After Maximum Entries":["Antwortbeschreibung nach maximalen Eintr\u00e4gen"],"Get Started":["Loslegen"],"Integration":["Integration"],"Connect Native Integrations with SureForms":["Native Integrationen mit SureForms verbinden"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Schalten Sie leistungsstarke Integrationen im Premium-Plan frei, um Ihre Arbeitsabl\u00e4ufe zu automatisieren und SureForms direkt mit Ihren Lieblingstools zu verbinden."],"Send form submissions straight to CRMs, email, and marketing platforms":["Senden Sie Formulareinsendungen direkt an CRMs, E-Mail- und Marketingplattformen"],"Automate repetitive tasks with seamless data syncing":["Automatisieren Sie repetitive Aufgaben mit nahtloser Datensynchronisierung"],"Access exclusive native integrations for faster workflows":["Zugriff auf exklusive native Integrationen f\u00fcr schnellere Arbeitsabl\u00e4ufe"],"Expected format for emails - email@sureforms.com or John Doe ":["Erwartetes Format f\u00fcr E-Mails - email@sureforms.com oder John Doe "],"Payments":["Zahlungen"],"Stripe account disconnected successfully.":["Stripe-Konto erfolgreich getrennt."],"Failed to create webhook.":["Fehler beim Erstellen des Webhooks."],"Failed to connect to Stripe.":["Verbindung zu Stripe fehlgeschlagen."],"Webhook":["Webhook"],"Knowledge Base":["Wissensdatenbank"],"What\u2019s New":["Was gibt's Neues"],"delete":["l\u00f6schen"],"Please type \"%s\" in the input box":["Bitte geben Sie \"%s\" in das Eingabefeld ein"],"To confirm, type \"%s\" in the box below:":["Um zu best\u00e4tigen, geben Sie \"%s\" in das Feld unten ein:"],"Type \"%s\"":["Geben Sie \"%s\" ein"],"Go to OttoKit Settings":["Gehe zu den OttoKit-Einstellungen"],"USD - US Dollar":["USD - US-Dollar"],"Payment Mode":["Zahlungsart"],"Test Mode":["Testmodus"],"Live Mode":["Live-Modus"],"General Settings":["Allgemeine Einstellungen"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Richten Sie E-Mail-Zusammenfassungen, Admin-Benachrichtigungen und Datenpr\u00e4ferenzen ein, um Ihre Formulare m\u00fchelos zu verwalten."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Passen Sie die Standardfehlermeldungen an, die angezeigt werden, wenn Benutzer ung\u00fcltige oder unvollst\u00e4ndige Formulareintr\u00e4ge \u00fcbermitteln."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Aktivieren Sie den Spam-Schutz f\u00fcr Ihre Formulare mithilfe von CAPTCHA-Diensten oder Honeypot-Sicherheit."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Verbinden und verwalten Sie Ihre Zahlungsgateways, um Transaktionen sicher \u00fcber Ihre Formulare zu akzeptieren."],"1% transaction and payment gateway fees apply.":["1% Transaktions- und Zahlungsgateway-Geb\u00fchren fallen an."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["2,9 % Transaktions- und Zahlungsgateway-Geb\u00fchren fallen an. Aktivieren Sie die Lizenz, um die Transaktionsgeb\u00fchren zu reduzieren."],"2.9% transaction and payment gateway fees apply.":["Es fallen 2,9 % Transaktions- und Zahlungs-Gateway-Geb\u00fchren an."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Bitte besuchen Sie %1$s, l\u00f6schen Sie einen ungenutzten Webhook und klicken Sie dann unten, um es erneut zu versuchen."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms konnte keinen Webhook erstellen, da Ihr Stripe-Konto keine freien Slots mehr hat. Webhooks sind erforderlich, um Updates zu Zahlungen zu erhalten."],"Stripe Dashboard":["Stripe-Dashboard"],"Creating\u2026":["Erstellen\u2026"],"Create Webhook":["Webhook erstellen"],"Successfully connected to Stripe!":["Erfolgreich mit Stripe verbunden!"],"Invalid response from server. Please try again.":["Ung\u00fcltige Antwort vom Server. Bitte versuchen Sie es erneut."],"Failed to disconnect Stripe account.":["Trennen des Stripe-Kontos fehlgeschlagen."],"Webhook created successfully!":["Webhook erfolgreich erstellt!"],"Select Currency":["W\u00e4hrung ausw\u00e4hlen"],"Select the default currency for payment forms.":["W\u00e4hlen Sie die Standardw\u00e4hrung f\u00fcr Zahlungsformulare aus."],"Connection Status":["Verbindungsstatus"],"Disconnect Stripe Account":["Stripe-Konto trennen"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Sind Sie sicher, dass Sie Ihr Stripe-Konto trennen m\u00f6chten? Dadurch werden alle aktiven Zahlungen, Abonnements und Formulartransaktionen, die mit diesem Konto verbunden sind, gestoppt."],"Disconnect":["Trennen"],"Disconnecting\u2026":["Trennen\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook erfolgreich verbunden, alle Stripe-Ereignisse werden verfolgt."],"Connect your Stripe account to start accepting payments through your forms.":["Verbinden Sie Ihr Stripe-Konto, um Zahlungen \u00fcber Ihre Formulare zu akzeptieren."],"Connect to Stripe":["Mit Stripe verbinden"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Verbinden Sie sich sicher mit Stripe, um mit nur wenigen Klicks Zahlungen zu akzeptieren!"],"Set the total number of submissions allowed for this form.":["Legen Sie die Gesamtanzahl der zul\u00e4ssigen Einreichungen f\u00fcr dieses Formular fest."],"Payment Methods":["Zahlungsmethoden"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Der Testmodus erm\u00f6glicht es Ihnen, Zahlungen ohne echte Belastungen zu verarbeiten. Wechseln Sie in den Live-Modus f\u00fcr tats\u00e4chliche Transaktionen."],"General Payment Settings":["Allgemeine Zahlungseinstellungen"],"These settings apply to all payment gateways.":["Diese Einstellungen gelten f\u00fcr alle Zahlungs-Gateways."],"Stripe Settings":["Stripe-Einstellungen"],"Left ($100)":["Links ($100)"],"Right (100$)":["Richtig (100$)"],"Left Space ($ 100)":["Verbleibender Platz ($ 100)"],"Right Space (100 $)":["Rechter Raum (100 $)"],"Currency Sign Position":["Position des W\u00e4hrungszeichens"],"Select the position of the currency symbol relative to the amount.":["W\u00e4hlen Sie die Position des W\u00e4hrungssymbols relativ zum Betrag aus."],"Learn":["Lernen"],"Enable email summaries":["E-Mail-Zusammenfassungen aktivieren"],"Enable IP logging":["IP-Protokollierung aktivieren"],"Turn on Admin Notification from here.":["Aktivieren Sie hier die Admin-Benachrichtigung."],"Send entries to 100+ popular apps.":["Eintr\u00e4ge an \u00fcber 100 beliebte Apps senden."],"Build automated workflows that run instantly.":["Erstellen Sie automatisierte Workflows, die sofort ausgef\u00fchrt werden."],"Create custom app integrations using our Custom App feature.":["Erstellen Sie benutzerdefinierte App-Integrationen mit unserer benutzerdefinierten App-Funktion."],"Keep your tools in sync automatically.":["Halten Sie Ihre Werkzeuge automatisch synchron."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Dies wird OttoKit auf Ihrer WordPress-Seite installieren und aktivieren, um Automatisierungsfunktionen zu erm\u00f6glichen."],"Automate Your Forms with OttoKit":["Automatisieren Sie Ihre Formulare mit OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Jede Formular\u00fcbermittlung sollte etwas ausl\u00f6sen \u2014 eine Slack-Benachrichtigung, einen CRM-Lead, eine Follow-up-E-Mail oder eine neue Zeile in Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Konfigurieren Sie die Berechtigungen des KI-Clients und die Einstellungen des MCP-Servers."],"View documentation":["Dokumentation anzeigen"],"Copy to clipboard":["In die Zwischenablage kopieren"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) oder %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Claude-Code"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (Projekt) oder ~\/.claude.json (global)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (Projekt) oder settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml oder config.json"],"Your client's MCP configuration file":["Die MCP-Konfigurationsdatei Ihres Kunden"],"Connect Your AI Client":["Verbinden Sie Ihren KI-Client"],"AI Client":["KI-Client"],"Create an Application Password \u2014 ":["Erstellen Sie ein Anwendungskennwort \u2014"],"Open Application Passwords":["Anwendungspassw\u00f6rter \u00f6ffnen"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Oder verwenden Sie diesen CLI-Befehl, um den Server schnell hinzuzuf\u00fcgen (Sie m\u00fcssen dennoch die Umgebungsvariablen festlegen):"],"Copy the JSON config below into: ":["Kopiere die JSON-Konfiguration unten in:"],"Replace \"your-application-password\" with the password from Step 1.":["Ersetzen Sie \"your-application-password\" durch das Passwort aus Schritt 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 der MCP-Endpunkt Ihrer Website. WP_API_USERNAME \u2014 Ihr WordPress-Benutzername. WP_API_PASSWORD \u2014 das Anwendungskennwort, das Sie erstellt haben."],"View setup docs":["Einrichtungsdokumente anzeigen"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Das MCP Adapter-Plugin ist installiert, aber nicht aktiv. Aktivieren Sie es, um die MCP-Einstellungen zu konfigurieren."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Das MCP Adapter-Plugin ist erforderlich, um AI-Clients mit Ihren Formularen zu verbinden. Laden Sie es von GitHub herunter, installieren Sie es und aktivieren Sie es dann."],"Download the latest release from":["Laden Sie die neueste Version herunter von"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installieren Sie das Plugin \u00fcber Plugins > Neues Plugin hinzuf\u00fcgen > Plugin hochladen."],"Activate the MCP Adapter plugin.":["Aktivieren Sie das MCP Adapter-Plugin."],"Activating\u2026":["Aktivierung\u2026"],"Activate MCP Adapter":["MCP-Adapter aktivieren"],"Download MCP Adapter":["MCP-Adapter herunterladen"],"Experimental":["Experimentell"],"Enable Abilities":["F\u00e4higkeiten aktivieren"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registriere die F\u00e4higkeiten von SureForms mit der WordPress Abilities API. Wenn aktiviert, k\u00f6nnen KI-Clients Ihre Formulare und Eintr\u00e4ge auflisten, lesen, erstellen, bearbeiten und l\u00f6schen. Wenn deaktiviert, werden keine F\u00e4higkeiten registriert und KI-Clients k\u00f6nnen keine Aktionen an Ihren Formularen durchf\u00fchren."],"Abilities API \u2014 Edit":["F\u00e4higkeiten-API \u2014 Bearbeiten"],"Enable Edit Abilities":["Bearbeitungsf\u00e4higkeiten aktivieren"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Wenn aktiviert, k\u00f6nnen KI-Clients neue Formulare erstellen, Formulartitel, Felder und Einstellungen aktualisieren, Formulare duplizieren und Eintragsstatus \u00e4ndern. Wenn deaktiviert, werden diese F\u00e4higkeiten abgemeldet und KI-Clients k\u00f6nnen nur Ihre Daten lesen."],"Abilities API \u2014 Delete":["F\u00e4higkeiten-API \u2014 L\u00f6schen"],"Enable Delete Abilities":["L\u00f6schf\u00e4higkeiten aktivieren"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Wenn aktiviert, k\u00f6nnen KI-Clients Formulare und Eintr\u00e4ge dauerhaft l\u00f6schen. Gel\u00f6schte Daten k\u00f6nnen nicht wiederhergestellt werden. Wenn deaktiviert, werden L\u00f6schf\u00e4higkeiten abgemeldet und KI-Clients k\u00f6nnen keine Daten entfernen."],"MCP Server":["MCP-Server"],"Enable MCP Server":["MCP-Server aktivieren"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Erstellt einen dedizierten SureForms MCP-Endpunkt, mit dem sich KI-Clients wie Claude verbinden k\u00f6nnen. Wenn er deaktiviert ist, wird der Endpunkt entfernt und externe KI-Clients k\u00f6nnen keine SureForms-Funktionen entdecken oder aufrufen."],"Learn more":["Mehr erfahren"],"MCP Adapter Required":["MCP-Adapter erforderlich"],"Heading 1":["\u00dcberschrift 1"],"Heading 2":["\u00dcberschrift 2"],"Heading 3":["\u00dcberschrift 3"],"Heading 4":["\u00dcberschrift 4"],"Heading 5":["\u00dcberschrift 5"],"Heading 6":["\u00dcberschrift 6"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Konfigurieren Sie den Google Maps API-Schl\u00fcssel f\u00fcr die Adressvervollst\u00e4ndigung und die Kartenansichtsvorschau."],"Help shape the future of SureForms":["Helfen Sie mit, die Zukunft von SureForms zu gestalten"],"Enable Google Address Autocomplete":["Google-Adress-Autovervollst\u00e4ndigung aktivieren"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Upgrade auf den SureForms Business-Plan, um Google-gest\u00fctzte Adressvervollst\u00e4ndigung mit interaktiver Kartenansicht zu Ihren Formularen hinzuzuf\u00fcgen."],"Auto-suggest addresses as users type for faster, error-free submissions":["Adressen automatisch vorschlagen, w\u00e4hrend Benutzer tippen, f\u00fcr schnellere und fehlerfreie Eingaben"],"Show an interactive map preview with draggable pin for precise locations":["Zeige eine interaktive Kartenansicht mit verschiebbarem Pin f\u00fcr pr\u00e4zise Standorte"],"Automatically populate address fields like city, state, and postal code":["Adressfelder wie Stadt, Bundesland und Postleitzahl automatisch ausf\u00fcllen"],"This form is now closed as we've received all the entries.":["Dieses Formular ist jetzt geschlossen, da wir alle Einsendungen erhalten haben."],"Thank you for contacting us! We will be in touch with you shortly.":["Vielen Dank, dass Sie uns kontaktiert haben! Wir werden uns in K\u00fcrze mit Ihnen in Verbindung setzen."],"Saving\u2026":["Speichern\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Wenn aktiviert, speichert dieses Formular die IP-Adresse des Benutzers, den Browsernamen und den Ger\u00e4tenamen nicht in den Eintr\u00e4gen."],"Form data":["Formulardaten"],"Unsaved changes":["Nicht gespeicherte \u00c4nderungen"],"Keep editing":["Weiter bearbeiten"],"Global Defaults":["Globale Standardeinstellungen"],"Form Restrictions":["Formulareinschr\u00e4nkungen"],"Configure default settings that apply to newly created forms.":["Standardm\u00e4\u00dfige Einstellungen konfigurieren, die f\u00fcr neu erstellte Formulare gelten."],"Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ":["Sammeln Sie nicht sensible Informationen von Ihrer Website, wie die verwendete PHP-Version und Funktionen, um uns zu helfen, Fehler schneller zu beheben, kl\u00fcgere Entscheidungen zu treffen und Funktionen zu entwickeln, die f\u00fcr Sie tats\u00e4chlich von Bedeutung sind. "],"Failed to load pages. Please refresh and try again.":["Fehler beim Laden der Seiten. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut."],"Failed to load settings. Please refresh and try again.":["Fehler beim Laden der Einstellungen. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut."],"Form Validation fields cannot be left blank.":["Felder zur Formularvalidierung d\u00fcrfen nicht leer gelassen werden."],"Recipient email is required when email summaries are enabled.":["Die Empf\u00e4nger-E-Mail ist erforderlich, wenn E-Mail-Zusammenfassungen aktiviert sind."],"Please enter a valid recipient email.":["Bitte geben Sie eine g\u00fcltige Empf\u00e4nger-E-Mail-Adresse ein."],"Settings saved.":["Einstellungen gespeichert."],"Failed to save settings.":["Speichern der Einstellungen fehlgeschlagen."],"Some settings failed to save. Please retry.":["Einige Einstellungen konnten nicht gespeichert werden. Bitte versuchen Sie es erneut."],"Some fields have unsaved changes. Discard them to continue, or stay to save your edits.":["Einige Felder enthalten ungespeicherte \u00c4nderungen. Verwerfen Sie diese, um fortzufahren, oder bleiben Sie, um Ihre \u00c4nderungen zu speichern."],"Discard & switch":["Verwerfen & wechseln"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-de_DE-8cf77722f0a349f4f2e7f56437f288f9.json b/languages/sureforms-de_DE-8cf77722f0a349f4f2e7f56437f288f9.json index b95dd4d16..e84265917 100644 --- a/languages/sureforms-de_DE-8cf77722f0a349f4f2e7f56437f288f9.json +++ b/languages/sureforms-de_DE-8cf77722f0a349f4f2e7f56437f288f9.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Armaturenbrett"],"Settings":["Einstellungen"],"Entries":["Eintr\u00e4ge"],"Move to Trash":["In den Papierkorb verschieben"],"Export":["Exportieren"],"Trash":["M\u00fcll"],"Published":["Ver\u00f6ffentlicht"],"Restore":["Wiederherstellen"],"Delete Permanently":["Dauerhaft l\u00f6schen"],"Clear Filter":["Filter l\u00f6schen"],"Activated":["Aktiviert"],"Edit":["Bearbeiten"],"Import Form":["Importformular"],"Add New Form":["Neues Formular hinzuf\u00fcgen"],"View Form":["Formular anzeigen"],"Forms":["Formulare"],"Shortcode":["Kurzcode"],"(no title)":["(kein Titel)"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"What's New?":["Was gibt's Neues?"],"Core":["Kern"],"Unlicensed":["Ohne Lizenz"],"Page":["Seite"],"No Date":["Kein Datum"],"Invalid Date":["Ung\u00fcltiges Datum"],"Ready to go beyond free plan?":["Bereit, \u00fcber den kostenlosen Plan hinauszugehen?"],"Upgrade now":["Jetzt upgraden"],"and unlock the full power of SureForms!":["und die volle Kraft von SureForms freischalten!"],"Upgrade SureForms":["SureForms aktualisieren"],"Clear Filters":["Filter l\u00f6schen"],"Select Date Range":["Datumsbereich ausw\u00e4hlen"],"Actions":["Aktionen"],"Duplicate":["Duplikat"],"All Forms":["Alle Formulare"],"Date & Time":["Datum & Uhrzeit"],"Payments":["Zahlungen"],"Knowledge Base":["Wissensdatenbank"],"What\u2019s New":["Was gibt's Neues"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["mm\/dd\/yyyy - mm\/dd\/yyyy"],"out of":["aus"],"No entries found":["Keine Eintr\u00e4ge gefunden"],"delete":["l\u00f6schen"],"Please type \"%s\" in the input box":["Bitte geben Sie \"%s\" in das Eingabefeld ein"],"To confirm, type \"%s\" in the box below:":["Um zu best\u00e4tigen, geben Sie \"%s\" in das Feld unten ein:"],"Type \"%s\"":["Geben Sie \"%s\" ein"],"No results found":["Keine Ergebnisse gefunden"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Wir konnten keine Datens\u00e4tze finden, die mit Ihren Filtern \u00fcbereinstimmen. Versuchen Sie, die Filter anzupassen oder sie zur\u00fcckzusetzen, um alle Ergebnisse zu sehen."],"Please select a file to import.":["Bitte w\u00e4hlen Sie eine Datei zum Importieren aus."],"Invalid JSON file format.":["Ung\u00fcltiges JSON-Dateiformat."],"Failed to read file.":["Datei konnte nicht gelesen werden."],"Import failed.":["Import fehlgeschlagen."],"An error occurred during import.":["Ein Fehler ist beim Import aufgetreten."],"Import Forms":["Formulare importieren"],"Please select a valid JSON file.":["Bitte w\u00e4hlen Sie eine g\u00fcltige JSON-Datei aus."],"Drag and drop or browse files":["Ziehen Sie Dateien per Drag & Drop oder durchsuchen Sie sie"],"Importing\u2026":["Importieren\u2026"],"Drafts":["Entw\u00fcrfe"],"Search forms\u2026":["Suchformulare\u2026"],"No forms found":["Keine Formulare gefunden"],"Title":["Titel"],"Copied!":["Kopiert!"],"Copy Shortcode":["Shortcode kopieren"],"No Forms":["Keine Formulare"],"Hi there, let's get you started":["Hallo, lassen Sie uns loslegen"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Es sieht so aus, als h\u00e4tten Sie noch keine Formulare erstellt. Beginnen Sie mit SureForms und starten Sie leistungsstarke Formulare mit nur wenigen Klicks."],"Design forms with our Gutenberg-native builder.":["Entwerfen Sie Formulare mit unserem Gutenberg-nativen Builder."],"Use AI to generate forms instantly from a simple prompt.":["Verwenden Sie KI, um Formulare sofort aus einem einfachen Prompt zu erstellen."],"Build engaging conversational, calculation, and multi-step forms.":["Erstellen Sie ansprechende Konversations-, Berechnungs- und mehrstufige Formulare."],"Create Form":["Formular erstellen"],"An error occurred while fetching forms.":["Beim Abrufen der Formulare ist ein Fehler aufgetreten."],"%d form moved to trash.":["%d Formular in den Papierkorb verschoben."],"%d form restored.":["%d Formular wiederhergestellt."],"%d form permanently deleted.":["%d Formular dauerhaft gel\u00f6scht."],"An error occurred while performing the action.":["Ein Fehler ist bei der Ausf\u00fchrung der Aktion aufgetreten."],"%d form imported successfully.":["%d Formular erfolgreich importiert."],"%d form will be moved to trash and can be restored later.":["%d Formular wird in den Papierkorb verschoben und kann sp\u00e4ter wiederhergestellt werden."],"Delete Form":["Formular l\u00f6schen"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Sind Sie sicher, dass Sie das Formular %d dauerhaft l\u00f6schen m\u00f6chten? Diese Aktion kann nicht r\u00fcckg\u00e4ngig gemacht werden."],"Restore Form":["Formular wiederherstellen"],"%d form will be restored from trash.":["%d Formular wird aus dem Papierkorb wiederhergestellt."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Sind Sie sicher, dass Sie dieses Formular dauerhaft l\u00f6schen m\u00f6chten? Diese Aktion kann nicht r\u00fcckg\u00e4ngig gemacht werden."],"This form will be moved to trash and can be restored later.":["Dieses Formular wird in den Papierkorb verschoben und kann sp\u00e4ter wiederhergestellt werden."],"An error occurred while duplicating the form.":["Beim Duplizieren des Formulars ist ein Fehler aufgetreten."],"This will create a copy of \"%s\" with all its settings.":["Dies wird eine Kopie von \"%s\" mit allen Einstellungen erstellen."],"Learn":["Lernen"],"Export failed: no data received.":["Export fehlgeschlagen: Keine Daten empfangen."],"Select a SureForms export file (.json) to import.":["W\u00e4hlen Sie eine SureForms-Exportdatei (.json) zum Importieren aus."],"Drop a form file (.json) here":["Legen Sie hier eine Formulardatei (.json) ab"],"(Draft)":["(Entwurf)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Erstellen Sie sofort Formulare und teilen Sie sie mit einem Link \u2013 kein Einbetten erforderlich."],"Form \"%s\" duplicated successfully.":["Formular \"%s\" erfolgreich dupliziert."],"Error loading forms":["Fehler beim Laden der Formulare"],"Move form to trash?":["Formular in den Papierkorb verschieben?"],"Delete form?":["Formular l\u00f6schen?"],"Duplicate form?":["Formular duplizieren?"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Armaturenbrett"],"Settings":["Einstellungen"],"Entries":["Eintr\u00e4ge"],"Move to Trash":["In den Papierkorb verschieben"],"Export":["Exportieren"],"Trash":["M\u00fcll"],"Published":["Ver\u00f6ffentlicht"],"Restore":["Wiederherstellen"],"Delete Permanently":["Dauerhaft l\u00f6schen"],"Clear Filter":["Filter l\u00f6schen"],"Activated":["Aktiviert"],"Edit":["Bearbeiten"],"Import Form":["Importformular"],"Add New Form":["Neues Formular hinzuf\u00fcgen"],"View Form":["Formular anzeigen"],"Forms":["Formulare"],"Shortcode":["Kurzcode"],"(no title)":["(kein Titel)"],"Confirm":["Best\u00e4tigen"],"Cancel":["Abbrechen"],"What's New?":["Was gibt's Neues?"],"Core":["Kern"],"Unlicensed":["Ohne Lizenz"],"Page":["Seite"],"No Date":["Kein Datum"],"Invalid Date":["Ung\u00fcltiges Datum"],"Ready to go beyond free plan?":["Bereit, \u00fcber den kostenlosen Plan hinauszugehen?"],"Upgrade now":["Jetzt upgraden"],"and unlock the full power of SureForms!":["und die volle Kraft von SureForms freischalten!"],"Upgrade SureForms":["SureForms aktualisieren"],"Clear Filters":["Filter l\u00f6schen"],"Select Date Range":["Datumsbereich ausw\u00e4hlen"],"Actions":["Aktionen"],"Duplicate":["Duplikat"],"All Forms":["Alle Formulare"],"Date & Time":["Datum & Uhrzeit"],"Payments":["Zahlungen"],"Knowledge Base":["Wissensdatenbank"],"What\u2019s New":["Was gibt's Neues"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["mm\/dd\/yyyy - mm\/dd\/yyyy"],"out of":["aus"],"No entries found":["Keine Eintr\u00e4ge gefunden"],"delete":["l\u00f6schen"],"Please type \"%s\" in the input box":["Bitte geben Sie \"%s\" in das Eingabefeld ein"],"To confirm, type \"%s\" in the box below:":["Um zu best\u00e4tigen, geben Sie \"%s\" in das Feld unten ein:"],"Type \"%s\"":["Geben Sie \"%s\" ein"],"No results found":["Keine Ergebnisse gefunden"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Wir konnten keine Datens\u00e4tze finden, die mit Ihren Filtern \u00fcbereinstimmen. Versuchen Sie, die Filter anzupassen oder sie zur\u00fcckzusetzen, um alle Ergebnisse zu sehen."],"Please select a file to import.":["Bitte w\u00e4hlen Sie eine Datei zum Importieren aus."],"Invalid JSON file format.":["Ung\u00fcltiges JSON-Dateiformat."],"Failed to read file.":["Datei konnte nicht gelesen werden."],"Import failed.":["Import fehlgeschlagen."],"An error occurred during import.":["Ein Fehler ist beim Import aufgetreten."],"Import Forms":["Formulare importieren"],"Please select a valid JSON file.":["Bitte w\u00e4hlen Sie eine g\u00fcltige JSON-Datei aus."],"Drag and drop or browse files":["Ziehen Sie Dateien per Drag & Drop oder durchsuchen Sie sie"],"Importing\u2026":["Importieren\u2026"],"Drafts":["Entw\u00fcrfe"],"Search forms\u2026":["Suchformulare\u2026"],"No forms found":["Keine Formulare gefunden"],"Title":["Titel"],"Copied!":["Kopiert!"],"Copy Shortcode":["Shortcode kopieren"],"No Forms":["Keine Formulare"],"Hi there, let's get you started":["Hallo, lassen Sie uns loslegen"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Es sieht so aus, als h\u00e4tten Sie noch keine Formulare erstellt. Beginnen Sie mit SureForms und starten Sie leistungsstarke Formulare mit nur wenigen Klicks."],"Design forms with our Gutenberg-native builder.":["Entwerfen Sie Formulare mit unserem Gutenberg-nativen Builder."],"Use AI to generate forms instantly from a simple prompt.":["Verwenden Sie KI, um Formulare sofort aus einem einfachen Prompt zu erstellen."],"Build engaging conversational, calculation, and multi-step forms.":["Erstellen Sie ansprechende Konversations-, Berechnungs- und mehrstufige Formulare."],"Create Form":["Formular erstellen"],"An error occurred while fetching forms.":["Beim Abrufen der Formulare ist ein Fehler aufgetreten."],"%d form moved to trash.":["%d Formular in den Papierkorb verschoben."],"%d form restored.":["%d Formular wiederhergestellt."],"%d form permanently deleted.":["%d Formular dauerhaft gel\u00f6scht."],"An error occurred while performing the action.":["Ein Fehler ist bei der Ausf\u00fchrung der Aktion aufgetreten."],"%d form imported successfully.":["%d Formular erfolgreich importiert."],"%d form will be moved to trash and can be restored later.":["%d Formular wird in den Papierkorb verschoben und kann sp\u00e4ter wiederhergestellt werden."],"Delete Form":["Formular l\u00f6schen"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Sind Sie sicher, dass Sie das Formular %d dauerhaft l\u00f6schen m\u00f6chten? Diese Aktion kann nicht r\u00fcckg\u00e4ngig gemacht werden."],"Restore Form":["Formular wiederherstellen"],"%d form will be restored from trash.":["%d Formular wird aus dem Papierkorb wiederhergestellt."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Sind Sie sicher, dass Sie dieses Formular dauerhaft l\u00f6schen m\u00f6chten? Diese Aktion kann nicht r\u00fcckg\u00e4ngig gemacht werden."],"This form will be moved to trash and can be restored later.":["Dieses Formular wird in den Papierkorb verschoben und kann sp\u00e4ter wiederhergestellt werden."],"An error occurred while duplicating the form.":["Beim Duplizieren des Formulars ist ein Fehler aufgetreten."],"This will create a copy of \"%s\" with all its settings.":["Dies wird eine Kopie von \"%s\" mit allen Einstellungen erstellen."],"Learn":["Lernen"],"Export failed: no data received.":["Export fehlgeschlagen: Keine Daten empfangen."],"Select a SureForms export file (.json) to import.":["W\u00e4hlen Sie eine SureForms-Exportdatei (.json) zum Importieren aus."],"Drop a form file (.json) here":["Legen Sie hier eine Formulardatei (.json) ab"],"(Draft)":["(Entwurf)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Erstellen Sie sofort Formulare und teilen Sie sie mit einem Link \u2013 kein Einbetten erforderlich."],"Form \"%s\" duplicated successfully.":["Formular \"%s\" erfolgreich dupliziert."],"Error loading forms":["Fehler beim Laden der Formulare"],"Move form to trash?":["Formular in den Papierkorb verschieben?"],"Delete form?":["Formular l\u00f6schen?"],"Duplicate form?":["Formular duplizieren?"],"Switch to Draft":["Zu Entwurf wechseln"],"%d form switched to draft.":["%d Formular in den Entwurfsmodus gewechselt."],"Switch form to draft?":["Formular in Entwurf umwandeln?"],"%d form will be switched to draft and will no longer be publicly accessible.":["%d Formular wird in den Entwurfsmodus versetzt und ist nicht mehr \u00f6ffentlich zug\u00e4nglich."],"This form will be switched to draft and will no longer be publicly accessible.":["Dieses Formular wird in den Entwurfsmodus versetzt und ist nicht mehr \u00f6ffentlich zug\u00e4nglich."]}}} \ No newline at end of file diff --git a/languages/sureforms-de_DE-e2cfcb2408d95abf73e3ead4a0965656.json b/languages/sureforms-de_DE-e2cfcb2408d95abf73e3ead4a0965656.json new file mode 100644 index 000000000..08193d183 --- /dev/null +++ b/languages/sureforms-de_DE-e2cfcb2408d95abf73e3ead4a0965656.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T16:14:52+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/partialEntriesEmptyState.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Armaturenbrett"],"Settings":["Einstellungen"],"Entries":["Eintr\u00e4ge"],"Activated":["Aktiviert"],"Forms":["Formulare"],"What's New?":["Was gibt's Neues?"],"Core":["Kern"],"Unlicensed":["Ohne Lizenz"],"Ready to go beyond free plan?":["Bereit, \u00fcber den kostenlosen Plan hinauszugehen?"],"Upgrade now":["Jetzt upgraden"],"and unlock the full power of SureForms!":["und die volle Kraft von SureForms freischalten!"],"Upgrade SureForms":["SureForms aktualisieren"],"Payments":["Zahlungen"],"Knowledge Base":["Wissensdatenbank"],"What\u2019s New":["Was gibt's Neues"],"Learn":["Lernen"],"Upgrade to SureForms":["Upgrade auf SureForms"],"Partial Entries Placeholder":["Platzhalter f\u00fcr unvollst\u00e4ndige Eintr\u00e4ge"],"Capture in-progress form data the moment visitors stop typing \u2014 no submit required":["Erfassen Sie die Formulardaten, sobald Besucher aufh\u00f6ren zu tippen \u2013 kein Absenden erforderlich"],"Recover abandoned submissions and follow up with prospects you would otherwise lose":["Wiederherstellen von abgebrochenen Einreichungen und Nachverfolgung von Interessenten, die Sie sonst verlieren w\u00fcrden"],"Let visitors pick up where they left off with secure, shareable resume links":["Lassen Sie Besucher dort weitermachen, wo sie aufgeh\u00f6rt haben, mit sicheren, teilbaren Lebenslauf-Links"],"Stop Losing Leads to Abandoned Forms":["Verlieren Sie keine Leads mehr durch abgebrochene Formulare"],"See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:":["Sehen Sie, was Besucher eingegeben haben, bevor sie weggegangen sind. Upgrade auf SureForms Premium, um Teil-Eintr\u00e4ge freizuschalten:"]}}} \ No newline at end of file diff --git a/languages/sureforms-de_DE.mo b/languages/sureforms-de_DE.mo index df1a0bde7..548711e81 100644 Binary files a/languages/sureforms-de_DE.mo and b/languages/sureforms-de_DE.mo differ diff --git a/languages/sureforms-de_DE.po b/languages/sureforms-de_DE.po index 5040e9e4e..c9766be96 100644 --- a/languages/sureforms-de_DE.po +++ b/languages/sureforms-de_DE.po @@ -14,9 +14,9 @@ msgstr "" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -43,13 +43,14 @@ msgstr "Eine einfache, aber leistungsstarke Möglichkeit, moderne Formulare für msgid "https://sureforms.com/" msgstr "https://sureforms.com/" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -58,15 +59,16 @@ msgstr "https://sureforms.com/" msgid "Dashboard" msgstr "Armaturenbrett" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -74,21 +76,22 @@ msgstr "Armaturenbrett" msgid "Settings" msgstr "Einstellungen" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "Neues Formular" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -97,7 +100,7 @@ msgid "Entries" msgstr "Einträge" #. Translators: Post Title. -#: admin/admin.php:843 +#: admin/admin.php:869 #, php-format msgid "Edit %1$s" msgstr "%1$s bearbeiten" @@ -111,25 +114,25 @@ msgstr "%1$s bearbeiten" #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "Überprüfung des Nonce ist fehlgeschlagen." #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 +#: admin/admin.php:1504 #, php-format msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "Bitte %1$saktivieren%2$s Sie Ihre Kopie von %3$s, um neue Funktionen zu erhalten, Support zu nutzen, Update-Benachrichtigungen zu erhalten und mehr." #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 +#: admin/admin.php:1522 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "SureForms %1$s erfordert mindestens %2$s %3$s, um ordnungsgemäß zu funktionieren. Bitte aktualisieren Sie auf die neueste Version von %4$shier%5$s." -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 @@ -197,7 +200,7 @@ msgstr "Müll" msgid "Published" msgstr "Veröffentlicht" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "Ansehen" @@ -286,17 +289,18 @@ msgstr "Kein Plugin angegeben" msgid "Plugin Successfully Activated" msgstr "Plugin erfolgreich aktiviert" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "Aktivieren..." -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -305,17 +309,17 @@ msgstr "Aktivieren..." msgid "Activated" msgstr "Aktiviert" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "Aktivieren" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "Installation läuft..." -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "Installiert" @@ -323,14 +327,14 @@ msgstr "Installiert" msgid "You do not have permission to access this page." msgstr "Sie haben keine Berechtigung, auf diese Seite zuzugreifen." -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "Ungültiger Nonce." @@ -339,7 +343,7 @@ msgid "Form ID is required." msgstr "Formular-ID ist erforderlich." #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1001 msgid "Invalid form ID." msgstr "Ungültige Formular-ID." @@ -591,28 +595,23 @@ msgstr "Beim Absenden Ihres Formulars ist ein Fehler aufgetreten. Bitte versuche msgid "Test Email Sent Successfully." msgstr "Test-E-Mail erfolgreich gesendet." -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "Keine Formulare gefunden." #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "Montag" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" -msgstr "Fehler beim Speichern der Einstellungen!" - -#: inc/global-settings/global-settings.php:122 #: assets/build/formEditor.js:172 msgid "Global Settings" msgstr "Globale Einstellungen" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "Einstellungen erfolgreich gespeichert." @@ -626,7 +625,6 @@ msgid "Advanced Fields" msgstr "Erweiterte Felder" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "Dieses Feld ist erforderlich." @@ -681,7 +679,7 @@ msgstr "Verbergen" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "Formular bearbeiten" @@ -705,37 +703,38 @@ msgstr "Erstellen" msgid "Import Form" msgstr "Importformular" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "Neues Formular hinzufügen" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "Keine Einträge gefunden" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "Hier werden Ihre Formulareinträge angezeigt" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "Formular anzeigen" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "Formulare anzeigen" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -743,32 +742,37 @@ msgstr "Formulare anzeigen" msgid "Forms" msgstr "Formulare" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "Suchformulare" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "Elternformulare:" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "Keine Formulare im Papierkorb gefunden." -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "Formular veröffentlicht." -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "Formular aktualisiert." -#: inc/post-types.php:977 +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 msgid "Admin Notification Email" msgstr "Admin-Benachrichtigungs-E-Mail" #. translators: %s: Form title smart tag -#: inc/post-types.php:984 +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 #, php-format msgid "New Form Submission - %s" msgstr "Neue Formulareinreichung - %s" @@ -8232,7 +8236,7 @@ msgstr "Sozial" msgid "Travel" msgstr "Reise" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "Leeres Formular" @@ -8262,6 +8266,7 @@ msgstr "Mit ♡ gefertigt %s" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "(kein Titel)" @@ -8288,7 +8293,7 @@ msgstr "Formular ändern" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "Dieses Formular wurde gelöscht oder ist nicht verfügbar." @@ -8334,6 +8339,7 @@ msgstr "Fortgeschritten" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "Keine Tags verfügbar" @@ -8378,6 +8384,7 @@ msgstr "Zurücksetzen" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "Allgemeine Tags" @@ -8757,6 +8764,7 @@ msgstr "Integrationen" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8769,6 +8777,7 @@ msgstr "Was gibt's Neues?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8781,6 +8790,7 @@ msgstr "Kern" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8789,52 +8799,52 @@ msgid "Unlicensed" msgstr "Ohne Lizenz" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 #, js-format msgid "%s Removed from Quick Action Bar." msgstr "%s wurde aus der Schnellzugriffsleiste entfernt." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "Zur Schnellzugriffsleiste hinzufügen" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 #, js-format msgid "%s Added to Quick Action Bar." msgstr "%s zur Schnellzugriffsleiste hinzugefügt." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "Bereits in der Schnellzugriffsleiste vorhanden" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "Keine Ergebnisse gefunden." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "Datenobjekt ist leer" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "Blöcke zur Schnellzugriffsleiste hinzufügen" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "Block im Schnellaktionsbereich neu anordnen" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -8860,30 +8870,37 @@ msgid "Install & Activate" msgstr "Installieren & Aktivieren" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Compliance Settings" msgstr "Compliance-Einstellungen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "Aktivieren Sie die DSGVO-Konformität" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "Speichern Sie niemals Eingabedaten nach dem Absenden des Formulars" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "Wenn aktiviert, speichert dieses Formular niemals Einträge." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "Einträge automatisch löschen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "Wenn aktiviert, wird dieses Formular Einträge nach einer bestimmten Zeitspanne automatisch löschen." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "Einträge, die älter sind als die festgelegten Tage, werden automatisch gelöscht." @@ -8896,34 +8913,42 @@ msgid "The following CSS styles added below will only apply to this form contain msgstr "Die folgenden unten hinzugefügten CSS-Stile gelten nur für diesen Formularcontainer." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "Visuell" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "HTML" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "Alle Daten" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "Shortcode hinzufügen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "Formulareingabetags" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Comma separated values are also accepted." msgstr "Kommagetrennte Werte werden ebenfalls akzeptiert." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "E-Mail-Benachrichtigung" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Name" msgstr "Name" @@ -8933,18 +8958,22 @@ msgid "Send Email To" msgstr "E-Mail senden an" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Subject" msgstr "Betreff" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "CC" msgstr "CC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "BCC" msgstr "BCC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reply To" msgstr "Antworten an" @@ -8953,54 +8982,57 @@ msgid "Add Notification" msgstr "Benachrichtigung hinzufügen" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." -msgstr "E-Mail-Benachrichtigung erfolgreich deaktiviert." - -#: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." -msgstr "E-Mail-Benachrichtigung erfolgreich aktiviert." - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "Schlüssel hinzufügen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "Wert hinzufügen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "Hinzufügen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "Bestätigungsnachricht" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "Nach dem Absenden des Formulars" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "Formular ausblenden" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "Formular zurücksetzen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "Benutzerdefinierte URL" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "Abfrageparameter hinzufügen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "Wählen Sie, ob Sie Schlüssel-Wert-Paare für Formularfelder hinzufügen möchten, die in Abfrageparametern enthalten sein sollen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "Abfrageparameter" @@ -9013,14 +9045,17 @@ msgid "Suggestion: URL should use HTTPS" msgstr "Vorschlag: Die URL sollte HTTPS verwenden" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Success Message" msgstr "Erfolgsmeldung" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect" msgstr "Weiterleiten" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect to" msgstr "Weiterleiten zu" @@ -9028,14 +9063,17 @@ msgstr "Weiterleiten zu" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "Seite" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form Confirmation" msgstr "Formularbestätigung" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "Bestätigungstyp" @@ -9177,7 +9215,7 @@ msgstr "Zentrum" msgid "Right" msgstr "Richtig" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1178 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" @@ -9187,7 +9225,7 @@ msgstr "Google reCAPTCHA" msgid "CloudFlare Turnstile" msgstr "CloudFlare Turnstile" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1182 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" @@ -9246,7 +9284,8 @@ msgstr "Seitenumbruch" msgid "Previous" msgstr "Zurück" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 #: assets/build/formEditor.js:172 msgid "Thank you" msgstr "Danke" @@ -9465,7 +9504,7 @@ msgstr "Standortschlüssel" msgid "Secret Key" msgstr "Geheimer Schlüssel" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1186 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "Cloudflare-Drehkreuz" @@ -9482,10 +9521,6 @@ msgstr "Honeypot-Sicherheit aktivieren" msgid "Enable Honeypot Security for better spam protection" msgstr "Aktivieren Sie Honeypot-Sicherheit für besseren Spamschutz" -#: assets/build/settings.js:172 -msgid "This field cannot be left blank." -msgstr "Dieses Feld darf nicht leer gelassen werden." - #: assets/build/templatePicker.js:172 msgid "Connect Now" msgstr "Jetzt verbinden" @@ -10425,7 +10460,7 @@ msgstr "Fügen Sie Ihrer Website atemberaubende anpassbare Symbole hinzu." msgid "icon" msgstr "Symbol" -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "Bewerten Sie SureForms" @@ -10481,18 +10516,18 @@ msgstr "Notiz hinzufügen entsperren" msgid "With the SureForms Starter plan, enhance your submitted form entries by adding personalized notes for better clarity and tracking." msgstr "Mit dem SureForms Starter-Plan verbessern Sie Ihre eingereichten Formulareinträge, indem Sie personalisierte Notizen für bessere Klarheit und Nachverfolgung hinzufügen." -#: inc/form-submit.php:823 +#: inc/form-submit.php:852 msgid "Email notification passed to the sending server" msgstr "E-Mail-Benachrichtigung an den sendenden Server übermittelt" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 +#: inc/form-submit.php:925 #, php-format msgid "Email notification recipient: %s" msgstr "E-Mail-Benachrichtigungsempfänger: %s" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 +#: inc/form-submit.php:942 #, php-format msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "E-Mail-Server konnte die E-Mail-Benachrichtigung nicht senden. Empfänger: %1$s. Grund: %2$s" @@ -10535,7 +10570,7 @@ msgstr "Konversationelle Formulare freischalten" msgid "With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience." msgstr "Mit dem SureForms Pro Plan können Sie Ihre Formulare in ansprechende, dialogorientierte Layouts verwandeln, um ein nahtloses Benutzererlebnis zu schaffen." -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "Holen Sie sich SureForms Pro" @@ -10631,7 +10666,7 @@ msgstr "PX" msgid "Button" msgstr "Schaltfläche" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" @@ -10663,46 +10698,56 @@ msgid "SUREFORMS PREMIUM FIELDS" msgstr "SUREFORMS PREMIUM-FELDER" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%1$s) überein. Dies kann dazu führen, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen übereinstimmt (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "Die aktuelle 'Von-E-Mail'-Adresse stimmt nicht mit Ihrem Website-Domainnamen (%s) überein. Dies kann dazu führen, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "We strongly recommend that you install the free " msgstr "Wir empfehlen Ihnen dringend, die kostenlose" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "Plugin! Der Einrichtungsassistent macht es einfach, Ihre E-Mails zu reparieren." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "Alternativ können Sie versuchen, eine Absenderadresse zu verwenden, die mit Ihrer Website-Domain übereinstimmt (admin@%s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "Bitte geben Sie eine gültige E-Mail-Adresse ein. Ihre Benachrichtigungen werden nicht gesendet, wenn das Feld nicht korrekt ausgefüllt ist." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Name" msgstr "Von Name" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Email" msgstr "Von E-Mail" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "Die aktuelle 'Von-E-Mail'-Adresse stimmt möglicherweise nicht mit Ihrem Website-Domainnamen (%1$s) überein. Dies kann dazu führen, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden. Alternativ versuchen Sie, eine Von-Adresse zu verwenden, die mit Ihrem Website-Domainnamen übereinstimmt (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "Die aktuelle 'Von-E-Mail'-Adresse stimmt möglicherweise nicht mit Ihrem Website-Domainnamen (%s) überein. Dies kann dazu führen, dass Ihre Benachrichtigungs-E-Mails blockiert oder als Spam markiert werden." @@ -10736,24 +10781,24 @@ msgstr "Gradient auswählen" msgid "reCAPTCHA" msgstr "reCAPTCHA" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1122 msgid "Captcha validation failed. No error code provided." msgstr "Captcha-Überprüfung fehlgeschlagen. Kein Fehlercode angegeben." -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1123 msgid "Captcha validation failed." msgstr "Captcha-Überprüfung fehlgeschlagen." -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1190 msgid "Unknown Captcha" msgstr "Unbekanntes Captcha" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1191 msgid "Invalid captcha type." msgstr "Ungültiger Captcha-Typ." #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 +#: inc/form-submit.php:1204 #, php-format msgid "%s verification failed. Please contact your site administrator." msgstr "%s-Verifizierung fehlgeschlagen. Bitte wenden Sie sich an Ihren Website-Administrator." @@ -10776,11 +10821,11 @@ msgstr "Die Überprüfung des HCaptcha-Sitekeys ist fehlgeschlagen. Bitte kontak msgid "%s sitekey is missing. Please contact your site administrator." msgstr "%s sitekey fehlt. Bitte kontaktieren Sie Ihren Website-Administrator." -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "SureMail" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "Starter-Vorlagen" @@ -10821,6 +10866,7 @@ msgstr "Ungültiges Datum" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10833,6 +10879,7 @@ msgstr "Bereit, über den kostenlosen Plan hinauszugehen?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10845,6 +10892,7 @@ msgstr "Jetzt upgraden" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10857,6 +10905,7 @@ msgstr "und die volle Kraft von SureForms freischalten!" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10947,10 +10996,12 @@ msgid "Free" msgstr "Kostenlos" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "Einträge, die älter als die ausgewählten Tage sind, werden gelöscht." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "Einträge Zeitraum" @@ -10959,6 +11010,7 @@ msgid "Custom CSS Panel" msgstr "Benutzerdefiniertes CSS-Panel" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "Benachrichtigungen können nur eine Absender-E-Mail verwenden, daher geben Sie bitte eine einzelne Adresse ein." @@ -10986,14 +11038,17 @@ msgid "Delete" msgstr "Löschen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "Seite zum Weiterleiten auswählen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "Suche nach einer Seite" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "Wählen Sie eine Seite aus" @@ -11119,6 +11174,7 @@ msgstr "Um hCAPTCHA zu aktivieren, fügen Sie bitte Ihren Site-Schlüssel und Ge msgid "To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form." msgstr "Um Cloudflare Turnstile zu aktivieren, fügen Sie bitte Ihren Site-Schlüssel und Geheimschlüssel hinzu. Konfigurieren Sie diese Einstellungen innerhalb des einzelnen Formulars." +#: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Save" msgstr "Speichern" @@ -11139,8 +11195,8 @@ msgstr "Beschreiben Sie das Formular, das Sie erstellen möchten" msgid "We are building your form…" msgstr "Wir erstellen Ihr Formular…" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "SMTP" @@ -11270,28 +11326,28 @@ msgstr "Admin-Benachrichtigung aktivieren" msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "Admin-Benachrichtigungen halten Sie über neue Formulareinträge seit Ihrem letzten Besuch auf dem Laufenden." -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "Unbefugter Benutzer." #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 +#: admin/admin.php:1774 #, php-format msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "%1$sBeginnen Sie damit, %2$sIhr erstes Formular zu erstellen%3$s.%4$s%5$sErleben Sie die Leistungsfähigkeit unseres intuitiven KI-Formularerstellers%6$s" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "SureForms wartet auf Sie!" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "Erstelle mein erstes Formular" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "Verwerfen" @@ -11311,51 +11367,51 @@ msgstr "Anmelden" msgid "Register" msgstr "Registrieren" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "Neueste Einträge" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "( Letzte 7 Tage )" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "Verwenden Sie bedingte Logik, um nur das Wichtige anzuzeigen" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "Teilen Sie Ihr Formular in Schritte auf, um es einfach zu halten." -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "Lassen Sie Personen Dateien direkt in Ihr Formular hochladen" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "Antworten automatisch in herunterladbare PDFs umwandeln" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "Lassen Sie Benutzer mit einem einfachen Unterschriftsfeld unterschreiben" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "Verbinden Sie Ihr Formular mit anderen Tools über Webhooks" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "Verwenden Sie Konversationsformulare für ein chatähnliches Erlebnis" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "Lassen Sie Benutzer sich über Ihr Formular registrieren oder anmelden" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "Erstellen Sie Formulare, die WordPress-Benutzerkonten erstellen" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "Berechnungen hinzufügen, um die Punktzahlen oder Preise automatisch zu summieren" @@ -11585,21 +11641,21 @@ msgstr "Letzte Schliffe, die den Unterschied machen:" msgid "Build Your First Form" msgstr "Erstellen Sie Ihr erstes Formular" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "Ungültige Nonce-Aktion oder -Name." -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "Ungültiges Sicherheitstoken." -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "Ungültiger Anforderungstyp." -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "Sie haben keine Berechtigung, diese Aktion auszuführen." @@ -11677,10 +11733,12 @@ msgid "Form Restriction" msgstr "Formulareinschränkung" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "Maximale Anzahl von Einträgen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "Maximale Einträge" @@ -11698,6 +11756,7 @@ msgid "Click here" msgstr "Klicken Sie hier" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "Antwortbeschreibung nach maximalen Einträgen" @@ -11711,7 +11770,7 @@ msgstr "Hallo," msgid "Email Summary of your last week - %1$s to %2$s" msgstr "E-Mail-Zusammenfassung Ihrer letzten Woche - %1$s bis %2$s" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "Ultimative Addons für Elementor" @@ -11773,7 +11832,7 @@ msgstr "Erkunde SureDash" msgid "Something went wrong. We have logged the error for further investigation" msgstr "Etwas ist schiefgelaufen. Wir haben den Fehler zur weiteren Untersuchung protokolliert." -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "Feld ist nicht gültig." @@ -11837,16 +11896,18 @@ msgid "SureForms Video Thumbnail" msgstr "SureForms Video-Miniaturansicht" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Expected format for emails - email@sureforms.com or John Doe " msgstr "Erwartetes Format für E-Mails - email@sureforms.com oder John Doe " -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -12010,47 +12071,47 @@ msgstr "Der Testmodus ist aktiviert:" msgid "Click here to enable live mode and accept payment" msgstr "Klicken Sie hier, um den Live-Modus zu aktivieren und Zahlungen zu akzeptieren" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "Steigern Sie sofort die Zustellbarkeit Ihrer E-Mails!" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "Greifen Sie auf einen leistungsstarken, benutzerfreundlichen E-Mail-Zustelldienst zu, der sicherstellt, dass Ihre E-Mails in den Posteingängen und nicht in den Spam-Ordnern landen. Automatisieren Sie Ihre WordPress-E-Mail-Workflows mit SureMail mit Zuversicht." -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "Automatisieren Sie mühelos Ihre WordPress-Workflows." -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "Verbinden Sie Ihre WordPress-Plugins und Lieblings-Apps, automatisieren Sie Aufgaben und synchronisieren Sie Daten mühelos mit dem übersichtlichen, visuellen Workflow-Builder von OttoKit – ohne Programmierung oder komplexe Einrichtung erforderlich." -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "Schöne Websites in Minuten starten!" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "Wählen Sie aus professionell gestalteten Vorlagen, importieren Sie mit einem Klick und passen Sie sie mühelos an Ihre Marke an." -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "Elementor aufrüsten, um atemberaubende Websites schneller zu erstellen!" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "Verbessern Sie Elementor mit leistungsstarken Widgets und Vorlagen. Erstellen Sie beeindruckende, leistungsstarke Websites schneller mit kreativen Designelementen und nahtloser Anpassung." -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "SureRank" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "Verbessern Sie Ihr SEO und steigen Sie mühelos in den Suchergebnissen auf!" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "Steigern Sie die Sichtbarkeit Ihrer Website mit intelligenter SEO-Automatisierung. Optimieren Sie Inhalte, verfolgen Sie die Leistung von Schlüsselwörtern und erhalten Sie umsetzbare Einblicke, alles innerhalb von WordPress." @@ -12175,49 +12236,49 @@ msgstr "%1$d Zahlung(en) erfolgreich gelöscht. %2$d fehlgeschlagen." msgid "Failed to delete payments. Please try again." msgstr "Löschen der Zahlungen fehlgeschlagen. Bitte versuchen Sie es erneut." -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "Unbekanntes Formular" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "N/V" #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "Subscription" msgstr "Abonnement" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "Erneuerung" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "Einmal" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "Unbekannt" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -12233,7 +12294,7 @@ msgstr "Eine gültige Kunden-E-Mail ist für Zahlungen erforderlich." #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -12312,7 +12373,7 @@ msgstr "Unerwarteter Fehler: %s" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "Abonnement-ID nicht gefunden." @@ -12375,9 +12436,9 @@ msgstr "Abonnement-Verifizierung" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 +#: inc/payments/stripe/stripe-webhook.php:1120 #, php-format msgid "Subscription ID: %s" msgstr "Abonnement-ID: %s" @@ -12392,13 +12453,13 @@ msgstr "Abonnement-ID: %s" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 #, php-format msgid "Payment Gateway: %s" msgstr "Zahlungs-Gateway: %s" @@ -12411,7 +12472,7 @@ msgstr "Zahlungsabsichts-ID: %s" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 +#: inc/payments/stripe/stripe-webhook.php:1050 #, php-format msgid "Charge ID: %s" msgstr "Charge-ID: %s" @@ -12421,14 +12482,14 @@ msgstr "Charge-ID: %s" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 +#: inc/payments/stripe/admin-stripe-handler.php:516 #, php-format msgid "Subscription Status: %s" msgstr "Abonnementstatus: %s" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 +#: inc/payments/stripe/stripe-webhook.php:1124 #, php-format msgid "Customer ID: %s" msgstr "Kunden-ID: %s" @@ -12437,8 +12498,8 @@ msgstr "Kunden-ID: %s" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 #, php-format msgid "Amount: %1$s %2$s" msgstr "Betrag: %1$s %2$s" @@ -12473,7 +12534,7 @@ msgstr "Zahlungsüberprüfung" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 +#: inc/payments/stripe/stripe-webhook.php:1112 #, php-format msgid "Transaction ID: %s" msgstr "Transaktions-ID: %s" @@ -12482,7 +12543,7 @@ msgstr "Transaktions-ID: %s" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 #, php-format msgid "Status: %s" msgstr "Status: %s" @@ -12850,23 +12911,23 @@ msgid "Unknown error" msgstr "Unbekannter Fehler" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "Fehlende Zahlungs-ID." -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "Sie dürfen diese Aktion nicht ausführen." #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "Zahlung nicht in der Datenbank gefunden." #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "Dies ist keine Abonnementzahlung." @@ -12876,7 +12937,7 @@ msgid "Subscription cancellation failed." msgstr "Das Abbrechen des Abonnements ist fehlgeschlagen." #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "Fehler beim Aktualisieren des Abonnementstatus in der Datenbank." @@ -12885,58 +12946,58 @@ msgstr "Fehler beim Aktualisieren des Abonnementstatus in der Datenbank." msgid "Invalid payment data." msgstr "Ungültige Zahlungsdaten." -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "Nur erfolgreiche oder teilweise erstattete Zahlungen können erstattet werden." -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "Transaktions-ID stimmt nicht überein." -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "Ungültiges Transaktions-ID-Format für Rückerstattung." -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "Rückerstattung über die Stripe-API konnte nicht verarbeitet werden." -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "Fehler beim Aktualisieren des Zahlungsdatensatzes nach der Rückerstattung." #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "Zahlung erfolgreich erstattet." #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "Rückerstattung konnte nicht bearbeitet werden. Bitte versuchen Sie es erneut." -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "Das Anhalten des Abonnements ist fehlgeschlagen." -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "Voll" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "Teilweise" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 #, php-format msgid "Refund ID: %s" msgstr "Rückerstattungs-ID: %s" @@ -12944,9 +13005,9 @@ msgstr "Rückerstattungs-ID: %s" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 #, php-format msgid "Refund Amount: %1$s %2$s" msgstr "Rückerstattungsbetrag: %1$s %2$s" @@ -12954,9 +13015,9 @@ msgstr "Rückerstattungsbetrag: %1$s %2$s" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 #, php-format msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "Insgesamt erstattet: %1$s %2$s von %3$s %4$s" @@ -12964,9 +13025,9 @@ msgstr "Insgesamt erstattet: %1$s %2$s von %3$s %4$s" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 #, php-format msgid "Refund Status: %s" msgstr "Rückerstattungsstatus: %s" @@ -12975,10 +13036,10 @@ msgstr "Rückerstattungsstatus: %s" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 #, php-format msgid "Payment Status: %s" msgstr "Zahlungsstatus: %s" @@ -12986,132 +13047,132 @@ msgstr "Zahlungsstatus: %s" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 #, php-format msgid "Refunded by: %s" msgstr "Erstattet von: %s" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 #, php-format msgid "Refund Notes: %s" msgstr "Erstattungsnotizen: %s" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 #, php-format msgid "%s Payment Refund" msgstr "%s Rückerstattung der Zahlung" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 #, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "Webhooks halten SureForms mit Stripe synchron, indem sie Zahlungs- und Abonnementdaten automatisch aktualisieren. Bitte %1$s Webhook." -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "konfigurieren" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "Ungültige Rückerstattungsparameter angegeben." -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "Diese Zahlung steht nicht im Zusammenhang mit einem Abonnement." -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "Nur aktive, erfolgreiche oder teilweise erstattete Abonnementzahlungen können erstattet werden." -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "Erstellung der Stripe-Rückerstattung fehlgeschlagen. Bitte überprüfen Sie Ihr Stripe-Dashboard für weitere Details." -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "Die Rückerstattung wurde von Stripe bearbeitet, aber die lokalen Aufzeichnungen wurden nicht aktualisiert. Bitte überprüfen Sie Ihre Zahlungsaufzeichnungen manuell." -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "Abonnementszahlung erfolgreich erstattet." #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 +#: inc/payments/stripe/admin-stripe-handler.php:977 #, php-format msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "Der Erstattungsbetrag übersteigt den verfügbaren Betrag. Maximal erstattungsfähig: %1$s %2$s" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "Der Erstattungsbetrag muss größer als null sein." -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "Der Erstattungsbetrag muss mindestens $0,50 betragen." -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "Es ist nicht möglich, die geeignete Rückerstattungsmethode für diese Abonnementzahlung zu bestimmen." #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 +#: inc/payments/stripe/admin-stripe-handler.php:1256 #, php-format msgid "%s Subscription Payment Refund" msgstr "%s Abonnementszahlungsrückerstattung" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "Diese Zahlung wurde bereits vollständig erstattet." -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "Die Zahlung konnte in Stripe nicht gefunden werden." -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "Der Erstattungsbetrag übersteigt den verfügbaren erstattungsfähigen Betrag." -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "Die Zahlung für dieses Abonnement konnte nicht gefunden werden." -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "Das Abonnement konnte bei Stripe nicht gefunden werden." -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "Dieses Abonnement hat keine erfolgreichen Zahlungen, die erstattet werden können." -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "Die Zahlungsmethode für dieses Abonnement ist ungültig." -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "Unzureichende Berechtigungen, um Rückerstattungen zu bearbeiten." -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "Zuviele Anfragen. Bitte versuchen Sie es in einem Moment erneut." -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut." #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 +#: inc/payments/stripe/admin-stripe-handler.php:1308 #, php-format msgid "Subscription refund failed: %s" msgstr "Rückerstattung des Abonnements fehlgeschlagen: %s" @@ -13261,7 +13322,7 @@ msgstr "Abgebrochen um: %s" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 +#: inc/payments/stripe/stripe-webhook.php:892 #, php-format msgid "Cancellation Reason: %s" msgstr "Stornierungsgrund: %s" @@ -13280,24 +13341,24 @@ msgstr "Abonnement gekündigt" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "Webhook" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "Rückerstattung storniert" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:882 #, php-format msgid "Canceled Refund Amount: %1$s %2$s" msgstr "Stornierter Erstattungsbetrag: %1$s %2$s" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 +#: inc/payments/stripe/stripe-webhook.php:885 #, php-format msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "Verbleibender Erstattungsbetrag: %1$s %2$s von %3$s %4$s" @@ -13306,52 +13367,52 @@ msgstr "Verbleibender Erstattungsbetrag: %1$s %2$s von %3$s %4$s" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:896 #, php-format msgid "Canceled by: %s" msgstr "Abgebrochen von: %s" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "Erstzahlung für das Abonnement erfolgreich" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 #, php-format msgid "Invoice ID: %s" msgstr "Rechnungs-ID: %s" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "Zahlungsstatus: Erfolgreich" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "Abonnementstatus: Aktiv" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "Zahlung der Abonnementgebühr" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "Erfolgreich" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 +#: inc/payments/stripe/stripe-webhook.php:1126 #, php-format msgid "Customer Email: %s" msgstr "Kunden-E-Mail: %s" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 +#: inc/payments/stripe/stripe-webhook.php:1128 #, php-format msgid "Customer Name: %s" msgstr "Kundenname: %s" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "Erstellt über den Abrechnungszyklus des Abonnements" @@ -13359,19 +13420,20 @@ msgstr "Erstellt über den Abrechnungszyklus des Abonnements" msgid "Edit this form" msgstr "Bearbeiten Sie dieses Formular" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." msgstr "Ihr Formular wurde erfolgreich eingereicht. Wir werden Ihre Angaben prüfen und uns bald bei Ihnen melden." #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "Eintrags-ID ist erforderlich." #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "Eintrag nicht gefunden." @@ -13571,6 +13633,7 @@ msgstr "Wählen Sie das E-Mail-Feld aus, das die Kunden-E-Mail enthält" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13583,6 +13646,7 @@ msgstr "Wissensdatenbank" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13664,6 +13728,7 @@ msgid "Go to Forms" msgstr "Zu den Formularen gehen" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13671,6 +13736,7 @@ msgid "delete" msgstr "löschen" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13679,6 +13745,7 @@ msgid "Please type \"%s\" in the input box" msgstr "Bitte geben Sie \"%s\" in das Eingabefeld ein" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13687,6 +13754,7 @@ msgid "To confirm, type \"%s\" in the box below:" msgstr "Um zu bestätigen, geben Sie \"%s\" in das Feld unten ein:" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14113,7 +14181,7 @@ msgstr "Verwenden Sie KI, um Formulare sofort aus einem einfachen Prompt zu erst msgid "Build engaging conversational, calculation, and multi-step forms." msgstr "Erstellen Sie ansprechende Konversations-, Berechnungs- und mehrstufige Formulare." -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "Formular erstellen" @@ -14897,22 +14965,22 @@ msgstr "Hinweis: Das Abonnement wurde dauerhaft gekündigt. Der Kunde wird nicht #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "Pausiert" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 +#: inc/payments/stripe/admin-stripe-handler.php:521 #, php-format msgid "Paused by: %s" msgstr "Angehalten von: %s" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "Hinweis: Die Abrechnung des Abonnements wurde pausiert. Es werden keine Gebühren erhoben, bis das Abonnement fortgesetzt wird." -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "Abonnement pausiert" @@ -14921,6 +14989,7 @@ msgid "This entry will be moved to trash and can be restored later." msgstr "Dieser Eintrag wird in den Papierkorb verschoben und kann später wiederhergestellt werden." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "Legen Sie die Gesamtanzahl der zulässigen Einreichungen für dieses Formular fest." @@ -15048,7 +15117,7 @@ msgstr "Der Wert des variablen Betragsfeldes ist erforderlich." msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "Zahlungsbetrag unter dem Minimum. Minimum: %1$s, erhalten %2$s." -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "(Kopie)" @@ -15109,12 +15178,14 @@ msgstr "Dies wird eine Kopie von \"%s\" mit allen Einstellungen erstellen." msgid "Pay with credit or debit card" msgstr "Zahlen Sie mit Kredit- oder Debitkarte" +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 msgid "This form is not yet available. Please check back after the scheduled start time." msgstr "Dieses Formular ist noch nicht verfügbar. Bitte schauen Sie nach der geplanten Startzeit wieder vorbei." #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "Dieses Formular nimmt keine Einsendungen mehr an. Die Einreichungsfrist ist abgelaufen." @@ -15133,7 +15204,7 @@ msgstr "Die Rückerstattungsverarbeitung wird für das %s-Gateway nicht unterst msgid "Number field configuration not found." msgstr "Konfiguration des Zahlenfelds nicht gefunden." -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "Ungültige Rückerstattungsparameter." @@ -15248,24 +15319,24 @@ msgid "Stripe Settings" msgstr "Stripe-Einstellungen" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 +#: admin/admin.php:1439 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "SureForms %1$s erfordert mindestens %2$s %3$s, um ordnungsgemäß zu funktionieren. Bitte aktualisieren Sie auf die neueste Version." -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "Jetzt aktualisieren" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "SureContact" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "Verwandeln Sie E-Mails in Umsatz mit einem CRM, das für Ihre Website entwickelt wurde!" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "Versenden Sie Newsletter, führen Sie Kampagnen durch, richten Sie Automatisierungen ein, verwalten Sie Kontakte und sehen Sie genau, wie viel Umsatz Ihre E-Mails generieren, alles an einem Ort." @@ -15301,13 +15372,14 @@ msgstr "Position des Währungszeichens" msgid "Select the position of the currency symbol relative to the amount." msgstr "Wählen Sie die Position des Währungssymbols relativ zum Betrag aus." -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -15315,40 +15387,40 @@ msgstr "Wählen Sie die Position des Währungssymbols relativ zum Betrag aus." msgid "Learn" msgstr "Lernen" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "Erstaunlich! SureForms treibt Ihre Formulare und Einsendungen an - lassen Sie uns gemeinsam weiter wachsen!" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "Wenn SureForms hilfreich war, würden Sie sich einen Moment Zeit nehmen, um eine 5-Sterne-Bewertung auf WordPress.org zu hinterlassen?" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "Vielleicht später" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "Ich habe es bereits getan" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "SureForms ist bereit, Ihre Formulare zu unterstützen — entdecken Sie, was möglich ist!" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "Verwalten Sie Ihre Formulare, verfolgen Sie Einsendungen und entdecken Sie Funktionen wie den AI Form Builder, Zahlungsintegrationen und mehr im SureForms-Dashboard." -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "Zum Dashboard gehen" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "Ich weiß schon" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "Ungültige Parameter." @@ -15510,7 +15582,7 @@ msgstr "Mindestens ein Formularfeld ist erforderlich." msgid "Failed to generate form fields from the provided data." msgstr "Fehler beim Generieren der Formularfelder aus den bereitgestellten Daten." -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "Erstellen des Formulars fehlgeschlagen." @@ -15730,15 +15802,16 @@ msgstr "Textfeld" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "Dieses Formular ist noch nicht verfügbar. Schauen Sie nach der geplanten Startzeit wieder vorbei." +#: inc/admin/html-form-detector.php:268 #: inc/form-submit.php:99 #: inc/form-submit.php:400 #: inc/form-submit.php:445 -#: inc/form-submit.php:968 +#: inc/form-submit.php:997 #: inc/payments/front-end.php:78 #: inc/payments/front-end.php:263 #: inc/rest-api.php:98 @@ -15752,9 +15825,10 @@ msgstr "Dieses Formular ist noch nicht verfügbar. Schauen Sie nach der geplante #: inc/rest-api.php:667 #: inc/rest-api.php:716 #: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 msgid "Security verification failed. Please refresh the page and try again." msgstr "Sicherheitsüberprüfung fehlgeschlagen. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut." @@ -15787,19 +15861,19 @@ msgstr "Bitte überprüfen Sie das Formular auf Fehler." msgid "Your submission was flagged as spam. Please try again." msgstr "Ihre Einsendung wurde als Spam markiert. Bitte versuchen Sie es erneut." -#: inc/form-submit.php:651 +#: inc/form-submit.php:680 msgid "Unable to submit form. Please try again." msgstr "Formular kann nicht übermittelt werden. Bitte versuchen Sie es erneut." -#: inc/form-submit.php:903 +#: inc/form-submit.php:932 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "Kein SMTP-Plugin erkannt. Bitte konfigurieren Sie ein SMTP-Plugin, um das Senden von E-Mails zu ermöglichen." -#: inc/form-submit.php:904 +#: inc/form-submit.php:933 msgid "Email sending failed for an unknown reason." msgstr "Das Senden der E-Mail ist aus einem unbekannten Grund fehlgeschlagen." -#: inc/form-submit.php:943 +#: inc/form-submit.php:972 msgid "No emails were sent." msgstr "Es wurden keine E-Mails gesendet." @@ -15984,7 +16058,7 @@ msgstr "Zahlung konnte nicht erstellt werden. Bitte kontaktieren Sie den Support msgid "Subscription canceled successfully!" msgstr "Abonnement erfolgreich gekündigt!" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "Abonnement erfolgreich pausiert!" @@ -16016,8 +16090,8 @@ msgstr "Webhook kann nicht gelöscht werden." msgid "Unable to connect to Stripe." msgstr "Verbindung zu Stripe nicht möglich." -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "Dieses Formular ist geschlossen. Die Einreichungsfrist ist abgelaufen." @@ -16056,28 +16130,28 @@ msgstr "Ungültige Aktion. Verwenden Sie \"lesen\" oder \"ungelesen\"." msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "Ungültige Aktion. Verwenden Sie \"trash\" oder \"restore\"." -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "Wählen Sie mindestens ein Formular aus und geben Sie eine Aktion an." -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "Formular nicht gefunden oder ist kein gültiger Formular-Typ." -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "Dieses Formular befindet sich bereits im Papierkorb." -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "Dieses Formular befindet sich nicht im Papierkorb." -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "Ungültige Aktion." #. translators: %s: action name -#: inc/rest-api.php:1100 +#: inc/rest-api.php:1124 #, php-format msgid "Failed to %s this form. Please try again." msgstr "Das %s dieses Formulars ist fehlgeschlagen. Bitte versuchen Sie es erneut." @@ -16220,10 +16294,6 @@ msgstr "Eintragsinformationen" msgid "Resend Email Notification" msgstr "E-Mail-Benachrichtigung erneut senden" -#: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." -msgstr "Wenn aktiviert, speichert dieses Formular keine Benutzer-IP, keinen Browsernamen oder Gerätenamen in den Einträgen." - #: assets/build/formEditor.js:172 msgid "Select a spam protection service. Configure API keys in Global Settings before enabling." msgstr "Wählen Sie einen Spam-Schutzdienst aus. Konfigurieren Sie API-Schlüssel in den globalen Einstellungen, bevor Sie ihn aktivieren." @@ -16691,26 +16761,27 @@ msgstr "Webhook-Geheimnis nicht konfiguriert." msgid "Invalid webhook signature." msgstr "Ungültige Webhook-Signatur." -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "Quizze" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "Quiz-Einträge" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "Neu" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1006 msgid "Invalid form." msgstr "Ungültiges Formular." -#: inc/form-submit.php:982 +#: inc/form-submit.php:1011 msgid "Too many requests. Please try again shortly." msgstr "Zu viele Anfragen. Bitte versuchen Sie es in Kürze erneut." @@ -16922,10 +16993,6 @@ msgstr "Datenschutzrichtlinie" msgid "Finish" msgstr "Fertig" -#: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." -msgstr "Wählen Sie eine Spam-Schutzmethode für dieses Formular, um unerwünschte Einsendungen zu verhindern." - #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Send entries to 100+ popular apps." @@ -17005,6 +17072,7 @@ msgstr "Erstellen Sie ansprechende Quizze mit SureForms" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "Verwandeln Sie Ihre Formulare in leistungsstarke Quizze. Upgraden Sie zu SureForms, um Quiz-Funktionen freizuschalten:" +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/surveyEmptyState.js:172 msgid "Upgrade to SureForms" @@ -17222,39 +17290,45 @@ msgstr "Perfekt für Bildung, Schulungen und unterhaltsame Quizfragen" msgid "Select this to create a quiz with scored questions and graded results." msgstr "Wählen Sie dies, um ein Quiz mit bewerteten Fragen und benoteten Ergebnissen zu erstellen." -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "Umfrageberichte" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "Überschrift 1" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "Überschrift 2" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "Überschrift 3" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "Überschrift 4" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "Überschrift 5" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "Überschrift 6" @@ -17271,7 +17345,7 @@ msgid "Cancellation not supported for this gateway." msgstr "Stornierung für dieses Gateway nicht unterstützt." #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "Abonnement erfolgreich gekündigt." @@ -17488,10 +17562,6 @@ msgstr "Konfigurieren Sie den Google Maps API-Schlüssel für die Adressvervolls msgid "Help shape the future of SureForms" msgstr "Helfen Sie mit, die Zukunft von SureForms zu gestalten" -#: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " -msgstr "Teilen Sie uns mit, wie Sie das Plugin verwenden, damit wir Funktionen entwickeln können, die wichtig sind, Probleme schneller beheben und klügere Entscheidungen treffen können." - #: assets/build/settings.js:172 msgid "Enable Google Address Autocomplete" msgstr "Google-Adress-Autovervollständigung aktivieren" @@ -17576,16 +17646,16 @@ msgstr "Polnischer Złoty" msgid "Dynamic Default Value" msgstr "Dynamischer Standardwert" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "Hey! Es sieht so aus, als würdest du ein Formular erstellen. Erstelle ein einsatzbereites Formular in weniger als 30 Sekunden mit SureForms AI, ohne zusätzlichen Aufwand." -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "Ungültiger Beitrag." -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "Sie können diesen Beitrag nicht bearbeiten." @@ -17624,7 +17694,7 @@ msgid "Error creating SureForms Form." msgstr "Fehler beim Erstellen des SureForms-Formulars." #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 #, php-format msgid "Please enter at least %s characters." @@ -17782,22 +17852,374 @@ msgstr "Die KI-Antwort war leer. Bitte verfeinern Sie Ihre Eingabeaufforderung u msgid "Unable to build form fields from the AI response." msgstr "Formularfelder können nicht aus der KI-Antwort erstellt werden." -#: inc/post-types.php:205 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "Teilweise Einträge" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." +msgstr "Dieses Formular ist jetzt geschlossen, da wir alle Einsendungen erhalten haben." + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." +msgstr "Ungültiger Einstellungsreiter." + +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "Vielen Dank, dass Sie uns kontaktiert haben! Wir werden uns in Kürze mit Ihnen in Verbindung setzen." + +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "Verwenden Sie die Wiederherstellungsaktion, um ein gelöschtes Formular wiederherzustellen, bevor Sie es in den Entwurfsmodus versetzen." + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "Dieses Formular ist bereits ein Entwurf." + +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "Sie haben keine Berechtigung, dieses Formular zu bearbeiten." + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "Ungültige Formular-ID." + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "Formulareinstellungen gespeichert." + +#: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "Die Eingabebegrenzung stützt sich auf gespeicherte Einträge, um Einsendungen zu zählen. Solange in den Compliance-Einstellungen die Option \"Eingabedaten nach dem Absenden des Formulars niemals speichern\" aktiviert ist, wird dieses Limit nicht durchgesetzt. Deaktivieren Sie diese Option oder entfernen Sie die Eingabebegrenzung, um diese Funktion zu nutzen." + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "Platzhalter für unvollständige Einträge" + +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "Platzhaltertext, der im leeren Eingabefeld/Textbereich oder als leere erste Option in einem Dropdown-Menü angezeigt wird." + +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "Array von Feldern, die vom Parser auf der Editor-Seite erzeugt werden." + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source
. Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "Roh-HTML des Quellformulars. Erforderlich, wenn das Vertrauen des Parsers gering ist, damit wir das Markup an die KI-Middleware übergeben können." + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "Bestmöglicher Styling-Deskriptor (Hex-Farben), extrahiert aus Inline-Stilen im Quell-." + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "Sie dürfen HTML-Formulare nicht konvertieren." + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "Umgewandelte Form" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "Das HTML-Formular ist zu groß, um es zu konvertieren. Bitte vereinfachen Sie das Markup oder erstellen Sie das Formular manuell." + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "Aus dem bereitgestellten Formular konnten keine Felder abgeleitet werden." + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "Der SureForms AI-Dienst konnte dieses Formular nicht verarbeiten. Versuchen Sie es erneut oder erstellen Sie das Formular manuell." + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "Der SureForms AI-Dienst hat eine unbrauchbare Antwort zurückgegeben. Versuchen Sie es erneut oder erstellen Sie das Formular manuell." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "Verwenden Sie ein Smart-Tag wie {get_input:country}. Die erste Option, deren Titel mit dem aufgelösten Wert übereinstimmt, wird vorausgewählt." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "Verwenden Sie ein Smart-Tag wie {get_input:colors} und übergeben Sie durch Pipes getrennte Werte in der URL (zum Beispiel ?colors=Red|Blue). Jede Option, deren Titel mit einem Wert übereinstimmt, wird ausgewählt. Sie können auch mehrere Smart-Tags durch Pipes getrennt verketten." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "Verwenden Sie ein Smart-Tag wie {get_input:colors} und übergeben Sie durch Pipes getrennte Werte in der URL (zum Beispiel ?colors=Red|Blue). Jede Option, deren Bezeichnung mit einem Wert übereinstimmt, wird vorausgewählt. Sie können auch mehrere Smart-Tags durch Pipes getrennt verketten." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "Verwenden Sie ein Smart-Tag wie {get_input:country}. Die erste Option, deren Bezeichnung mit dem aufgelösten Wert übereinstimmt, wird vorausgewählt." + +#: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "Einstellungen gespeichert, aber die Beitragseigenschaften (Passwort / Titel / Inhalt) konnten nicht aktualisiert werden. Versuchen Sie es erneut, um sie zu speichern." + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "Speichern der Formulareinstellungen fehlgeschlagen." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "Speichern…" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." +msgstr "Wenn aktiviert, speichert dieses Formular die IP-Adresse des Benutzers, den Browsernamen und den Gerätenamen nicht in den Einträgen." + +#: assets/build/formEditor.js:172 +msgid "Failed to save. Please try again." +msgstr "Speichern fehlgeschlagen. Bitte versuchen Sie es erneut." + +#: assets/build/formEditor.js:172 +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "reCAPTCHA-API-Schlüssel für die ausgewählte Version sind nicht konfiguriert. Stellen Sie sie in den globalen Einstellungen ein." + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "Bitte wählen Sie eine reCAPTCHA-Version aus." + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "hCaptcha-API-Schlüssel sind nicht konfiguriert. Legen Sie sie in den globalen Einstellungen fest." + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." +msgstr "Cloudflare Turnstile-API-Schlüssel sind nicht konfiguriert. Legen Sie sie in den globalen Einstellungen fest." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "Formulardaten" + +#: assets/build/formEditor.js:172 +msgid "Some fields need attention" +msgstr "Einige Felder benötigen Aufmerksamkeit" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Unsaved changes" +msgstr "Nicht gespeicherte Änderungen" + +#: assets/build/formEditor.js:172 +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "Eine Empfänger-E-Mail-Adresse und eine Betreffzeile sind erforderlich, bevor diese Benachrichtigung gespeichert werden kann. Beheben Sie die hervorgehobenen Felder oder verwerfen Sie Ihre Änderungen, um zurückzugehen." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "Sie haben ungespeicherte Änderungen für diese Benachrichtigung. Verwerfen Sie sie, um zurückzugehen, oder bleiben Sie, um sie zu speichern." + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "Verwerfen & zurückgehen" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "Bleiben & reparieren" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" +msgstr "Weiter bearbeiten" + +#: assets/build/formEditor.js:172 +msgid "Please provide a recipient email address." +msgstr "Bitte geben Sie eine Empfänger-E-Mail-Adresse an." + +#: assets/build/formEditor.js:172 +msgid "Please provide a subject line." +msgstr "Bitte geben Sie eine Betreffzeile an." + +#: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "Bitte geben Sie eine benutzerdefinierte URL an." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "Sie haben ungespeicherte Änderungen. Verwerfen Sie diese, um fortzufahren, oder bleiben Sie, um Ihre Änderungen zu speichern." + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "Verwerfen & fortfahren" + +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "Zu Entwurf wechseln" + +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "%d Formular in den Entwurfsmodus gewechselt." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "Formular in Entwurf umwandeln?" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "%d Formular wird in den Entwurfsmodus versetzt und ist nicht mehr öffentlich zugänglich." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "Dieses Formular wird in den Entwurfsmodus versetzt und ist nicht mehr öffentlich zugänglich." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "SureForms konnte diese Anfrage nicht authentifizieren. Bitte laden Sie den Editor neu und versuchen Sie es erneut." + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "%s — Umgewandelte Form" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "Formular mit KI in SureForms umgewandelt. Überprüfen Sie das neue Formular auf Anpassungen." + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "Formular in SureForms umgewandelt." + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "Sie haben keine Berechtigung, dieses Formular zu konvertieren." + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "Dieses Formular ist zu groß, um es zu konvertieren. Versuchen Sie, das Markup zu vereinfachen oder das Formular manuell zu erstellen." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "SureForms konnte keine Felder aus diesem Formular ableiten." + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "Der SureForms AI-Dienst konnte dieses Formular nicht verarbeiten. Bitte versuchen Sie es erneut oder erstellen Sie das Formular manuell." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "SureForms hat eine unerwartete Antwort erhalten. Bitte versuchen Sie es erneut." + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "Dieses Formular konnte nicht in SureForms konvertiert werden. Bitte versuchen Sie es erneut." + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "Konvertieren…" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "In SureForms umwandeln" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "Erfassen Sie die Formulardaten, sobald Besucher aufhören zu tippen – kein Absenden erforderlich" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "Wiederherstellen von abgebrochenen Einreichungen und Nachverfolgung von Interessenten, die Sie sonst verlieren würden" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "Lassen Sie Besucher dort weitermachen, wo sie aufgehört haben, mit sicheren, teilbaren Lebenslauf-Links" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "Verlieren Sie keine Leads mehr durch abgebrochene Formulare" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "Sehen Sie, was Besucher eingegeben haben, bevor sie weggegangen sind. Upgrade auf SureForms Premium, um Teil-Einträge freizuschalten:" + +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "Globale Standardeinstellungen" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "Formulareinschränkungen" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "Standardmäßige Einstellungen konfigurieren, die für neu erstellte Formulare gelten." + +#: assets/build/settings.js:172 +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " +msgstr "Sammeln Sie nicht sensible Informationen von Ihrer Website, wie die verwendete PHP-Version und Funktionen, um uns zu helfen, Fehler schneller zu beheben, klügere Entscheidungen zu treffen und Funktionen zu entwickeln, die für Sie tatsächlich von Bedeutung sind. " + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." +msgstr "Fehler beim Laden der Seiten. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut." + +#: assets/build/settings.js:172 +msgid "Failed to load settings. Please refresh and try again." +msgstr "Fehler beim Laden der Einstellungen. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut." + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "Felder zur Formularvalidierung dürfen nicht leer gelassen werden." + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "Die Empfänger-E-Mail ist erforderlich, wenn E-Mail-Zusammenfassungen aktiviert sind." + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "Bitte geben Sie eine gültige Empfänger-E-Mail-Adresse ein." + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "Einstellungen gespeichert." + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "Speichern der Einstellungen fehlgeschlagen." + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "Einige Einstellungen konnten nicht gespeichert werden. Bitte versuchen Sie es erneut." + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." +msgstr "Einige Felder enthalten ungespeicherte Änderungen. Verwerfen Sie diese, um fortzufahren, oder bleiben Sie, um Ihre Änderungen zu speichern." + +#: assets/build/settings.js:172 +msgid "Discard & switch" +msgstr "Verwerfen & wechseln" + +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "Formulare" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "Formular" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "Formulare" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "Neu hinzufügen" @@ -18206,6 +18628,7 @@ msgstr "Konto" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "Normal" diff --git a/languages/sureforms-es_ES-1cb9ecd067cd971ff5d9db0b4dae2891.json b/languages/sureforms-es_ES-1cb9ecd067cd971ff5d9db0b4dae2891.json index 25504514c..2b5a8fac9 100644 --- a/languages/sureforms-es_ES-1cb9ecd067cd971ff5d9db0b4dae2891.json +++ b/languages/sureforms-es_ES-1cb9ecd067cd971ff5d9db0b4dae2891.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Estado"],"Form":["Formulario"],"Fields":["Campos"],"Image":["Imagen"],"Activated":["Activado"],"Activate":["Activar"],"Submit":["Enviar"],"Global Settings":["Configuraci\u00f3n global"],"This field is required.":["Este campo es obligatorio."],"Form Title":["T\u00edtulo del formulario"],"Edit":["Editar"],"Please enter a valid URL.":["Por favor, introduce una URL v\u00e1lida."],"Desktop":["Escritorio"],"Medium":["Medio"],"Mobile":["M\u00f3vil"],"Repeat":["Repetir"],"Scroll":["Desplazar"],"Signature":["Firma"],"Tablet":["Tableta"],"Upload":["Subir"],"Basic":["B\u00e1sico"],"Form Settings":["Configuraci\u00f3n del formulario"],"General":["General"],"Style":["Estilo"],"Advanced":["Avanzado"],"No tags available":["No hay etiquetas disponibles"],"Device":["Dispositivo"],"Select Shortcodes":["Seleccionar c\u00f3digos cortos"],"Page Break Label":["Etiqueta de salto de p\u00e1gina"],"Next":["Siguiente"],"Back":["Atr\u00e1s"],"Reset":["Restablecer"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["P\u00edxel"],"Em":["Em"],"Select Units":["Seleccionar unidades"],"%s units":["%s unidades"],"Margin":["Margen"],"None":["Ninguno"],"Custom":["Personalizado"],"Please add a option props to MultiButtonsControl":["Por favor, a\u00f1ade una opci\u00f3n de propiedades a MultiButtonsControl"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Procesando\u2026"],"Select Video":["Seleccionar video"],"Change Video":["Cambiar video"],"Select Lottie Animation":["Seleccionar animaci\u00f3n Lottie"],"Change Lottie Animation":["Cambiar animaci\u00f3n Lottie"],"Upload SVG":["Subir SVG"],"Change SVG":["Cambiar SVG"],"Select Image":["Seleccionar imagen"],"Change Image":["Cambiar imagen"],"Upload SVG?":["\u00bfSubir SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Subir SVG puede ser potencialmente arriesgado. \u00bfEst\u00e1s seguro?"],"Upload Anyway":["Subir de todos modos"],"Full Width":["Ancho completo"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["La instalaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Plugin activation failed, Please try again later.":["La activaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Integrations":["Integraciones"],"%s Removed from Quick Action Bar.":["%s eliminado de la barra de acci\u00f3n r\u00e1pida."],"Add to Quick Action Bar":["Agregar a la barra de acci\u00f3n r\u00e1pida"],"%s Added to Quick Action Bar.":["%s a\u00f1adido a la barra de acci\u00f3n r\u00e1pida."],"Already Present in Quick Action Bar":["Ya presente en la barra de acci\u00f3n r\u00e1pida"],"No results found.":["No se encontraron resultados."],"data object is empty":["el objeto de datos est\u00e1 vac\u00edo"],"Add blocks to Quick Action Bar":["Agregar bloques a la barra de acci\u00f3n r\u00e1pida"],"Re-arrange block inside Quick Action Bar":["Reorganizar bloque dentro de la Barra de Acci\u00f3n R\u00e1pida"],"Upgrade":["Actualizar"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar y activar"],"Compliance Settings":["Configuraci\u00f3n de Cumplimiento"],"Enable GDPR Compliance":["Habilitar el cumplimiento del RGPD"],"Never store entry data after form submission":["Nunca almacenes los datos de entrada despu\u00e9s de enviar el formulario"],"When enabled this form will never store Entries.":["Cuando est\u00e9 habilitado, este formulario nunca almacenar\u00e1 entradas."],"Automatically delete entries":["Eliminar autom\u00e1ticamente las entradas"],"When enabled this form will automatically delete entries after a certain period of time.":["Cuando est\u00e9 habilitado, este formulario eliminar\u00e1 autom\u00e1ticamente las entradas despu\u00e9s de un cierto per\u00edodo de tiempo."],"Entries older than the days set will be deleted automatically.":["Las entradas m\u00e1s antiguas que los d\u00edas establecidos se eliminar\u00e1n autom\u00e1ticamente."],"Custom CSS":["CSS personalizado"],"The following CSS styles added below will only apply to this form container.":["Los siguientes estilos CSS a\u00f1adidos a continuaci\u00f3n solo se aplicar\u00e1n a este contenedor de formulario."],"Visual":["Visual"],"HTML":["HTML"],"All Data":["Todos los datos"],"Add Shortcode":["Agregar c\u00f3digo corto"],"Form input tags":["Etiquetas de entrada de formulario"],"Comma separated values are also accepted.":["Tambi\u00e9n se aceptan valores separados por comas."],"Email Notification":["Notificaci\u00f3n de correo electr\u00f3nico"],"Name":["Nombre"],"Send Email To":["Enviar correo electr\u00f3nico a"],"Subject":["Asunto"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Responder a"],"Add Notification":["Agregar notificaci\u00f3n"],"Email Notification disabled successfully.":["Notificaci\u00f3n de correo electr\u00f3nico desactivada con \u00e9xito."],"Email Notification enabled successfully.":["Notificaci\u00f3n por correo electr\u00f3nico habilitada con \u00e9xito."],"Add Key":["Agregar clave"],"Add Value":["A\u00f1adir valor"],"Add":["A\u00f1adir"],"Confirmation Message":["Mensaje de confirmaci\u00f3n"],"After Form Submission":["Despu\u00e9s del env\u00edo del formulario"],"Hide Form":["Ocultar formulario"],"Reset Form":["Restablecer formulario"],"Custom URL":["URL personalizada"],"Add Query Parameters":["Agregar par\u00e1metros de consulta"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Seleccione si desea agregar pares clave-valor para los campos del formulario que se incluir\u00e1n en los par\u00e1metros de consulta"],"Query Parameters":["Par\u00e1metros de consulta"],"Please select a page.":["Por favor, seleccione una p\u00e1gina."],"Suggestion: URL should use HTTPS":["Sugerencia: la URL deber\u00eda usar HTTPS"],"Success Message":["Mensaje de \u00e9xito"],"Redirect":["Redirigir"],"Redirect to":["Redirigir a"],"Page":["P\u00e1gina"],"Form Confirmation":["Confirmaci\u00f3n de formulario"],"Confirmation Type":["Tipo de confirmaci\u00f3n"],"Use Labels as Placeholders":["Usa etiquetas como marcadores de posici\u00f3n"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["La configuraci\u00f3n anterior colocar\u00e1 las etiquetas dentro de los campos como marcadores de posici\u00f3n (donde sea posible). Esta configuraci\u00f3n solo tiene efecto en la p\u00e1gina en vivo, no en la vista previa del editor."],"Page Break":["Salto de p\u00e1gina"],"Show Labels":["Mostrar etiquetas"],"First Page Label":["Etiqueta de la primera p\u00e1gina"],"Progress Indicator":["Indicador de progreso"],"Progress Bar":["Barra de progreso"],"Connector":["Conector"],"Steps":["Pasos"],"Next Button Text":["Texto del bot\u00f3n Siguiente"],"Back Button Text":["Texto del bot\u00f3n de retroceso"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["\u00bfEst\u00e1 seguro de que desea cerrar? Sus cambios no guardados se perder\u00e1n ya que tiene algunos errores de validaci\u00f3n."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Hay algunos cambios no guardados. Por favor, guarde sus cambios para reflejar las actualizaciones."],"Form Behavior":["Comportamiento del formulario"],"Clear":["Claro"],"Select Color":["Seleccionar color"],"Primary Color":["Color primario"],"Text Color":["Color del texto"],"Text Color on Primary":["Color del texto en primario"],"Field Spacing":["Espaciado de campo"],"Small":["Peque\u00f1o"],"Large":["Grande"],"Left":["Izquierda"],"Center":["Centro"],"Right":["Correcto"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Selector de fecha"],"Time Picker":["Selector de tiempo"],"Hidden":["Oculto"],"Slider":["Deslizador"],"Rating":["Calificaci\u00f3n"],"Upgrade to Unlock These Fields":["Actualiza para desbloquear estos campos"],"Add Block":["Agregar bloque"],"Customize with SureForms":["Personaliza con SureForms"],"Page break":["Salto de p\u00e1gina"],"Previous":["Anterior"],"Thank you":["Gracias"],"Form submitted successfully!":["\u00a1Formulario enviado con \u00e9xito!"],"Instant Form":["Formulario Instant\u00e1neo"],"Enable Instant Form":["Habilitar formulario instant\u00e1neo"],"Enable Preview":["Habilitar vista previa"],"Show Title":["Mostrar t\u00edtulo"],"Site Logo":["Logo del sitio"],"Banner Background":["Fondo del Banner"],"Color":["Color"],"Upload Image":["Subir imagen"],"Background Color":["Color de fondo"],"Use banner as page background":["Usa el banner como fondo de p\u00e1gina"],"Form Width":["Ancho del formulario"],"URL":["URL"],"URL Slug":["Slug de URL"],"The last part of the URL.":["La \u00faltima parte de la URL."],"Learn more.":["Aprende m\u00e1s."],"SureForms Description":["Descripci\u00f3n de SureForms"],"Form Options":["Opciones de formulario"],"Form Shortcode":["C\u00f3digo corto del formulario"],"Paste this shortcode on the page or post to render this form.":["Pega este c\u00f3digo corto en la p\u00e1gina o publicaci\u00f3n para mostrar este formulario."],"Spam Protection":["Protecci\u00f3n contra el spam"],"Auto":["Auto"],"Normal":["Normal"],"%":["%"],"Top":["Superior"],"Bottom":["Fondo"],"Solid":["S\u00f3lido"],"Width":["Ancho"],"Size":["Tama\u00f1o"],"EM":["EM"],"Padding":["Relleno"],"Color 1":["Color 1"],"Color 2":["Color 2"],"Type":["Tipo"],"Linear":["Lineal"],"Radial":["Radial"],"Location 1":["Ubicaci\u00f3n 1"],"Location 2":["Ubicaci\u00f3n 2"],"Angle":["\u00c1ngulo"],"Classic":["Cl\u00e1sico"],"Gradient":["Gradiente"],"Background":["Antecedentes"],"Cover":["Cubrir"],"Contain":["Contener"],"Overlay":["Superposici\u00f3n"],"No Repeat":["No repetir"],"Overlay Opacity":["Opacidad de superposici\u00f3n"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Los nombres de clase deben estar separados por espacios. Cada nombre de clase no debe comenzar con un d\u00edgito, guion o guion bajo. Solo pueden incluir letras (incluidos caracteres Unicode), n\u00fameros, guiones y guiones bajos."],"Conversational Layout":["Dise\u00f1o Conversacional"],"Unlock Conversational Forms":["Desbloquear formularios conversacionales"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Con el Plan SureForms Pro, puedes transformar tus formularios en dise\u00f1os conversacionales atractivos para una experiencia de usuario fluida."],"Premium":["Premium"],"Overlay Type":["Tipo de superposici\u00f3n"],"Image Overlay Color":["Color de superposici\u00f3n de imagen"],"Image Position":["Posici\u00f3n de la imagen"],"Attachment":["Adjunto"],"Fixed":["Fijo"],"Blend Mode":["Modo de fusi\u00f3n"],"Multiply":["Multiplicar"],"Screen":["Pantalla"],"Darken":["Oscurecer"],"Lighten":["Aligerar"],"Color Dodge":["Sobreexponer color"],"Saturation":["Saturaci\u00f3n"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repetir-y"],"PX":["PX"],"Button":["Bot\u00f3n"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Con\u00e9ctate con OttoKit"],"SUREFORMS PREMIUM FIELDS":["CAMPOS PREMIUM DE SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam. Alternativamente, intente usar una direcci\u00f3n de remitente que coincida con el dominio de su sitio web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam."],"We strongly recommend that you install the free ":["Recomendamos encarecidamente que instale el gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["\u00a1Complemento! El asistente de configuraci\u00f3n facilita la correcci\u00f3n de tus correos electr\u00f3nicos."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativamente, intenta usar una direcci\u00f3n de remitente que coincida con el dominio de tu sitio web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Por favor, introduce una direcci\u00f3n de correo electr\u00f3nico v\u00e1lida. Tus notificaciones no se enviar\u00e1n si el campo no est\u00e1 rellenado correctamente."],"From Name":["De Nombre"],"From Email":["De correo electr\u00f3nico"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam. Alternativamente, intente usar una Direcci\u00f3n del Remitente que coincida con el dominio de su sitio web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam."],"Border Radius":["Radio de borde"],"Form Theme":["Tema del formulario"],"Instant Form Padding":["Relleno Instant\u00e1neo de Formularios"],"Instant Form Border Radius":["Radio de Borde de Formulario Instant\u00e1neo"],"Select Gradient":["Seleccionar degradado"],"Upgrade Now":["Actualiza ahora"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Las entradas anteriores a los d\u00edas seleccionados ser\u00e1n eliminadas."],"Entries Time Period":["Per\u00edodo de tiempo de las entradas"],"Custom CSS Panel":["Panel de CSS personalizado"],"Notifications can use only one From Email so please enter a single address.":["Las notificaciones solo pueden usar un \u00fanico correo electr\u00f3nico de origen, as\u00ed que por favor ingrese una sola direcci\u00f3n."],"Email Notifications":["Notificaciones por correo electr\u00f3nico"],"Actions":["Acciones"],"Duplicate":["Duplicado"],"Delete":["Eliminar"],"Select Page to redirect":["Seleccionar p\u00e1gina para redirigir"],"Search for a page":["Buscar una p\u00e1gina"],"Select a page":["Selecciona una p\u00e1gina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Login":["Iniciar sesi\u00f3n"],"Register":["Registrar"],"Date":["Fecha"],"Advanced Settings":["Configuraci\u00f3n avanzada"],"Form Restriction":["Restricci\u00f3n de formulario"],"Maximum Number of Entries":["N\u00famero m\u00e1ximo de entradas"],"Maximum Entries":["Entradas M\u00e1ximas"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["La configuraci\u00f3n del Per\u00edodo de Tiempo funciona seg\u00fan la zona horaria de tu sitio de WordPress. Haz clic aqu\u00ed<\/a> para abrir la Configuraci\u00f3n General de WordPress, donde puedes verificarla y actualizarla."],"Click here":["Haz clic aqu\u00ed"],"Response Description After Maximum Entries":["Descripci\u00f3n de la respuesta despu\u00e9s del m\u00e1ximo de entradas"],"All changes will be saved automatically when you press back.":["Todos los cambios se guardar\u00e1n autom\u00e1ticamente cuando presiones atr\u00e1s."],"Repeater":["Repetidor"],"OttoKit Settings":["Configuraci\u00f3n de OttoKit"],"Get Started":["Comenzar"],"Connect Native Integrations with SureForms":["Conecta integraciones nativas con SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato esperado para correos electr\u00f3nicos: email@sureforms.com o John Doe "],"Payment":["Pago"],"%s - Order ID":["%s - ID de pedido"],"%s - Amount":["%s - Cantidad"],"%s - Customer Email":["%s - Correo Electr\u00f3nico del Cliente"],"%s - Customer Name":["%s - Nombre del Cliente"],"%s - Status":["%s - Estado"],"Add custom CSS rules to style this specific form independently of global styles.":["Agrega reglas CSS personalizadas para estilizar este formulario espec\u00edfico independientemente de los estilos globales."],"Spam Protection Type":["Tipo de Protecci\u00f3n contra Spam"],"Select Security Type":["Seleccionar tipo de seguridad"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Nota: Usar diferentes versiones de reCAPTCHA (V2 checkbox y V3) en la misma p\u00e1gina crear\u00e1 conflictos entre las versiones. Por favor, evite usar diferentes versiones en la misma p\u00e1gina."],"Select Version":["Seleccionar versi\u00f3n"],"Please configure the API keys correctly from the settings":["Por favor, configure las claves API correctamente desde la configuraci\u00f3n"],"Control email alerts sent to admins or users after a form submission.":["Controla las alertas de correo electr\u00f3nico enviadas a los administradores o usuarios despu\u00e9s de una presentaci\u00f3n de formulario."],"Customize the confirmation message or redirect the users after submitting the form.":["Personaliza el mensaje de confirmaci\u00f3n o redirige a los usuarios despu\u00e9s de enviar el formulario."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Establezca l\u00edmites en la cantidad de veces que se puede enviar un formulario y gestione las opciones de cumplimiento, incluidas GDPR y la retenci\u00f3n de datos."],"Go to OttoKit Settings":["Ve a la configuraci\u00f3n de OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Conecta SureForms con tus aplicaciones favoritas para automatizar tareas y sincronizar datos sin problemas."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Desbloquea potentes integraciones en el plan Premium para automatizar tus flujos de trabajo y conectar SureForms directamente con tus herramientas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Env\u00eda las presentaciones de formularios directamente a los CRM, correo electr\u00f3nico y plataformas de marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatiza tareas repetitivas con una sincronizaci\u00f3n de datos sin problemas."],"Access exclusive native integrations for faster workflows.":["Accede a integraciones nativas exclusivas para flujos de trabajo m\u00e1s r\u00e1pidos."],"PDF Generation":["Generaci\u00f3n de PDF"],"Generate and customize PDF copies of form submissions.":["Genera y personaliza copias en PDF de los env\u00edos de formularios."],"Generate Submission PDFs":["Generar PDFs de env\u00edo"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Convierte cada entrada de formulario en un archivo PDF pulido, haci\u00e9ndolo perfecto para informes, registros o compartir."],"Automatically generate PDFs from your form submissions.":["Genera autom\u00e1ticamente PDFs a partir de tus env\u00edos de formularios."],"Customize PDF templates with your branding.":["Personaliza las plantillas de PDF con tu marca."],"Download or email PDFs instantly.":["Descarga o env\u00eda por correo electr\u00f3nico los PDFs al instante."],"User Registration":["Registro de Usuario"],"Onboard new users or update existing accounts through beautiful looking forms.":["Incorpore nuevos usuarios o actualice cuentas existentes a trav\u00e9s de formularios de aspecto atractivo."],"Register Users with SureForms":["Registrar usuarios con SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Optimiza todo el proceso de incorporaci\u00f3n de usuarios para tus sitios con inicios de sesi\u00f3n y registros fluidos impulsados por formularios."],"Register new users directly via your form submissions.":["Registra nuevos usuarios directamente a trav\u00e9s de tus env\u00edos de formularios."],"Create or update existing accounts by mapping form data to user fields.":["Cree o actualice cuentas existentes asignando datos del formulario a campos de usuario."],"Assign roles and control access automatically.":["Asigna roles y controla el acceso autom\u00e1ticamente."],"Post Feed":["Publicar en el feed"],"Transform your form submission into WordPress posts.":["Transforma tu env\u00edo de formulario en publicaciones de WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Convierte autom\u00e1ticamente las presentaciones de formularios en publicaciones, p\u00e1ginas o tipos de publicaciones personalizadas de WordPress. Ahorra mucho tiempo y permite que tus formularios publiquen contenido directamente."],"Create posts, pages, or CPTs from your form entries.":["Crea publicaciones, p\u00e1ginas o CPTs a partir de las entradas de tu formulario."],"Map form fields to your post fields easily.":["Mapea los campos del formulario a los campos de tu publicaci\u00f3n f\u00e1cilmente."],"Automate the content publishing flow with few simple steps.":["Automatiza el flujo de publicaci\u00f3n de contenido con unos pocos pasos simples."],"Automations":["Automatizaciones"],"Unlock Advanced Styling":["Desbloquear estilo avanzado"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Obt\u00e9n control total sobre el aspecto de tu formulario con colores, fuentes y dise\u00f1os personalizados."],"Button Alignment":["Alineaci\u00f3n del bot\u00f3n"],"Add Custom CSS Class(es)":["Agregar clase(s) CSS personalizada(s)"],"Set the total number of submissions allowed for this form.":["Establezca el n\u00famero total de env\u00edos permitidos para este formulario."],"Save & Progress":["Guardar y Progresar"],"Allow users to save their progress and continue form completion later.":["Permitir a los usuarios guardar su progreso y continuar completando el formulario m\u00e1s tarde."],"Save & Progress in SureForms":["Guardar y Progresar en SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Brinda a tus usuarios la flexibilidad de completar formularios a su propio ritmo permiti\u00e9ndoles guardar el progreso y regresar en cualquier momento."],"Let users pause long or multi-step forms and continue later.":["Permitir a los usuarios pausar formularios largos o de varios pasos y continuar m\u00e1s tarde."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Reduzca el abandono de formularios con enlaces de reanudaci\u00f3n convenientes y acceda a su progreso desde cualquier lugar."],"Improve user experience for lengthy, complex, or multi-page forms.":["Mejorar la experiencia del usuario para formularios extensos, complejos o de varias p\u00e1ginas."],"This form is not yet available. Please check back after the scheduled start time.":["Este formulario a\u00fan no est\u00e1 disponible. Por favor, vuelva a consultar despu\u00e9s de la hora de inicio programada."],"This form is no longer accepting submissions. The submission period has ended.":["Este formulario ya no acepta env\u00edos. El per\u00edodo de env\u00edo ha terminado."],"The start date and time must be before the end date and time.":["La fecha y hora de inicio deben ser anteriores a la fecha y hora de finalizaci\u00f3n."],"Form Scheduling":["Programaci\u00f3n de formularios"],"Enable Form Scheduling":["Habilitar la programaci\u00f3n de formularios"],"Set a time period during which this form will be available for submissions.":["Establezca un per\u00edodo de tiempo durante el cual este formulario estar\u00e1 disponible para env\u00edos."],"Start Date & Time":["Fecha y hora de inicio"],"End Date & Time":["Fecha y hora de finalizaci\u00f3n"],"Response Description Before Start Date":["Descripci\u00f3n de la respuesta antes de la fecha de inicio"],"Response Description After End Date":["Descripci\u00f3n de la respuesta despu\u00e9s de la fecha de finalizaci\u00f3n"],"Conditional Confirmations":["Confirmaciones Condicionales"],"Set up the message or redirect users will see after submitting the form.":["Configure el mensaje o la redirecci\u00f3n que los usuarios ver\u00e1n despu\u00e9s de enviar el formulario."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Muestra el mensaje correcto al usuario adecuado seg\u00fan c\u00f3mo respondan. Personaliza las confirmaciones con condiciones inteligentes y gu\u00eda a los usuarios al siguiente mejor paso autom\u00e1ticamente."],"Display different confirmation messages based on form responses.":["Muestra diferentes mensajes de confirmaci\u00f3n seg\u00fan las respuestas del formulario."],"Redirect users to specific pages or URLs conditionally.":["Redirige a los usuarios a p\u00e1ginas o URLs espec\u00edficas de manera condicional."],"Create personalized thank-you messages without extra forms.":["Crea mensajes de agradecimiento personalizados sin formularios adicionales."],"Lost Password":["Contrase\u00f1a perdida"],"Reset Password":["Restablecer contrase\u00f1a"],"When enabled, this form will not store user IP, browser name, or device name in entries.":["Cuando est\u00e9 habilitado, este formulario no almacenar\u00e1 la IP del usuario, el nombre del navegador ni el nombre del dispositivo en las entradas."],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Seleccione un servicio de protecci\u00f3n contra spam. Configure las claves API en Configuraci\u00f3n Global antes de habilitarlo."],"Send as Raw HTML":["Enviar como HTML sin procesar"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Cuando est\u00e9 habilitado, el cuerpo del correo electr\u00f3nico en HTML se conservar\u00e1 exactamente como est\u00e1 escrito y se envolver\u00e1 en una plantilla de correo electr\u00f3nico profesional."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Las etiquetas inteligentes que hacen referencia a campos enviados por el usuario no se escapar\u00e1n en el modo HTML sin procesar. Evita insertar valores de campos no confiables directamente en el cuerpo del correo electr\u00f3nico."],"Please provide a recipient email address and subject line.":["Por favor, proporcione una direcci\u00f3n de correo electr\u00f3nico del destinatario y una l\u00ednea de asunto."],"Email notification duplicated!":["\u00a1Notificaci\u00f3n de correo electr\u00f3nico duplicada!"],"Are you sure you want to delete this email notification?":["\u00bfEst\u00e1s seguro de que deseas eliminar esta notificaci\u00f3n por correo electr\u00f3nico?"],"Email notification deleted!":["\u00a1Notificaci\u00f3n de correo electr\u00f3nico eliminada!"],"URL is missing Top Level Domain (TLD).":["Falta el dominio de nivel superior (TLD) en la URL."],"This form is now closed as the maximum number of entries has been received.":["Este formulario est\u00e1 cerrado ya que se ha recibido el n\u00famero m\u00e1ximo de entradas."],"Publish Your Form":["Publica tu formulario"],"Enable This to Instantly Publish the Form":["Habilitar esto para publicar el formulario instant\u00e1neamente"],"Style Your Instant Form Page Here":["Estiliza tu p\u00e1gina de formulario instant\u00e1neo aqu\u00ed"],"Quizzes":["Cuestionarios"],"%s - Description":["%s - Descripci\u00f3n"],"Choose a spam protection method for this form to prevent unwanted submissions.":["Elija un m\u00e9todo de protecci\u00f3n contra spam para este formulario para evitar env\u00edos no deseados."],"Send entries to 100+ popular apps.":["Env\u00eda entradas a m\u00e1s de 100 aplicaciones populares."],"Build automated workflows that run instantly.":["Crea flujos de trabajo automatizados que se ejecutan al instante."],"Create custom app integrations using our Custom App feature.":["Crea integraciones de aplicaciones personalizadas utilizando nuestra funci\u00f3n de Aplicaci\u00f3n Personalizada."],"Keep your tools in sync automatically.":["Mant\u00e9n tus herramientas sincronizadas autom\u00e1ticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Esto instalar\u00e1 y activar\u00e1 OttoKit en su sitio de WordPress para habilitar funciones de automatizaci\u00f3n."],"Automate Your Forms with OttoKit":["Automatiza tus formularios con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada env\u00edo de formulario deber\u00eda activar algo: una alerta de Slack, un cliente potencial en el CRM, un correo electr\u00f3nico de seguimiento o una nueva fila en Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Crea cuestionarios interactivos para involucrar a tu audiencia y recopilar informaci\u00f3n."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Dise\u00f1a cuestionarios atractivos con varios tipos de preguntas, retroalimentaci\u00f3n personalizada y puntuaci\u00f3n automatizada para cautivar a tu audiencia y obtener valiosos conocimientos."],"Create interactive quizzes with multiple question types.":["Crea cuestionarios interactivos con m\u00faltiples tipos de preguntas."],"Provide personalized feedback based on user responses.":["Proporciona comentarios personalizados basados en las respuestas del usuario."],"Automate scoring and lead segmentation for better insights.":["Automatiza la puntuaci\u00f3n y la segmentaci\u00f3n de leads para obtener mejores insights."],"Heading 1":["Encabezado 1"],"Heading 2":["Encabezado 2"],"Heading 3":["Encabezado 3"],"Heading 4":["Encabezado 4"],"Heading 5":["Encabezado 5"],"Heading 6":["Encabezado 6"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Estado"],"Form":["Formulario"],"Fields":["Campos"],"Image":["Imagen"],"Activated":["Activado"],"Activate":["Activar"],"Submit":["Enviar"],"Global Settings":["Configuraci\u00f3n global"],"Form Title":["T\u00edtulo del formulario"],"Edit":["Editar"],"Please enter a valid URL.":["Por favor, introduce una URL v\u00e1lida."],"Desktop":["Escritorio"],"Medium":["Medio"],"Mobile":["M\u00f3vil"],"Repeat":["Repetir"],"Scroll":["Desplazar"],"Signature":["Firma"],"Tablet":["Tableta"],"Upload":["Subir"],"Basic":["B\u00e1sico"],"Form Settings":["Configuraci\u00f3n del formulario"],"General":["General"],"Style":["Estilo"],"Advanced":["Avanzado"],"No tags available":["No hay etiquetas disponibles"],"Device":["Dispositivo"],"Select Shortcodes":["Seleccionar c\u00f3digos cortos"],"Page Break Label":["Etiqueta de salto de p\u00e1gina"],"Next":["Siguiente"],"Back":["Atr\u00e1s"],"Reset":["Restablecer"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["P\u00edxel"],"Em":["Em"],"Select Units":["Seleccionar unidades"],"%s units":["%s unidades"],"Margin":["Margen"],"None":["Ninguno"],"Custom":["Personalizado"],"Please add a option props to MultiButtonsControl":["Por favor, a\u00f1ade una opci\u00f3n de propiedades a MultiButtonsControl"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Procesando\u2026"],"Select Video":["Seleccionar video"],"Change Video":["Cambiar video"],"Select Lottie Animation":["Seleccionar animaci\u00f3n Lottie"],"Change Lottie Animation":["Cambiar animaci\u00f3n Lottie"],"Upload SVG":["Subir SVG"],"Change SVG":["Cambiar SVG"],"Select Image":["Seleccionar imagen"],"Change Image":["Cambiar imagen"],"Upload SVG?":["\u00bfSubir SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Subir SVG puede ser potencialmente arriesgado. \u00bfEst\u00e1s seguro?"],"Upload Anyway":["Subir de todos modos"],"Full Width":["Ancho completo"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["La instalaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Plugin activation failed, Please try again later.":["La activaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Integrations":["Integraciones"],"%s Removed from Quick Action Bar.":["%s eliminado de la barra de acci\u00f3n r\u00e1pida."],"Add to Quick Action Bar":["Agregar a la barra de acci\u00f3n r\u00e1pida"],"%s Added to Quick Action Bar.":["%s a\u00f1adido a la barra de acci\u00f3n r\u00e1pida."],"Already Present in Quick Action Bar":["Ya presente en la barra de acci\u00f3n r\u00e1pida"],"No results found.":["No se encontraron resultados."],"data object is empty":["el objeto de datos est\u00e1 vac\u00edo"],"Add blocks to Quick Action Bar":["Agregar bloques a la barra de acci\u00f3n r\u00e1pida"],"Re-arrange block inside Quick Action Bar":["Reorganizar bloque dentro de la Barra de Acci\u00f3n R\u00e1pida"],"Upgrade":["Actualizar"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar y activar"],"Compliance Settings":["Configuraci\u00f3n de Cumplimiento"],"Enable GDPR Compliance":["Habilitar el cumplimiento del RGPD"],"Never store entry data after form submission":["Nunca almacenes los datos de entrada despu\u00e9s de enviar el formulario"],"When enabled this form will never store Entries.":["Cuando est\u00e9 habilitado, este formulario nunca almacenar\u00e1 entradas."],"Automatically delete entries":["Eliminar autom\u00e1ticamente las entradas"],"When enabled this form will automatically delete entries after a certain period of time.":["Cuando est\u00e9 habilitado, este formulario eliminar\u00e1 autom\u00e1ticamente las entradas despu\u00e9s de un cierto per\u00edodo de tiempo."],"Entries older than the days set will be deleted automatically.":["Las entradas m\u00e1s antiguas que los d\u00edas establecidos se eliminar\u00e1n autom\u00e1ticamente."],"Custom CSS":["CSS personalizado"],"The following CSS styles added below will only apply to this form container.":["Los siguientes estilos CSS a\u00f1adidos a continuaci\u00f3n solo se aplicar\u00e1n a este contenedor de formulario."],"Visual":["Visual"],"HTML":["HTML"],"All Data":["Todos los datos"],"Add Shortcode":["Agregar c\u00f3digo corto"],"Form input tags":["Etiquetas de entrada de formulario"],"Comma separated values are also accepted.":["Tambi\u00e9n se aceptan valores separados por comas."],"Email Notification":["Notificaci\u00f3n de correo electr\u00f3nico"],"Name":["Nombre"],"Send Email To":["Enviar correo electr\u00f3nico a"],"Subject":["Asunto"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Responder a"],"Add Notification":["Agregar notificaci\u00f3n"],"Add Key":["Agregar clave"],"Add Value":["A\u00f1adir valor"],"Add":["A\u00f1adir"],"Confirmation Message":["Mensaje de confirmaci\u00f3n"],"After Form Submission":["Despu\u00e9s del env\u00edo del formulario"],"Hide Form":["Ocultar formulario"],"Reset Form":["Restablecer formulario"],"Custom URL":["URL personalizada"],"Add Query Parameters":["Agregar par\u00e1metros de consulta"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Seleccione si desea agregar pares clave-valor para los campos del formulario que se incluir\u00e1n en los par\u00e1metros de consulta"],"Query Parameters":["Par\u00e1metros de consulta"],"Please select a page.":["Por favor, seleccione una p\u00e1gina."],"Suggestion: URL should use HTTPS":["Sugerencia: la URL deber\u00eda usar HTTPS"],"Success Message":["Mensaje de \u00e9xito"],"Redirect":["Redirigir"],"Redirect to":["Redirigir a"],"Page":["P\u00e1gina"],"Form Confirmation":["Confirmaci\u00f3n de formulario"],"Confirmation Type":["Tipo de confirmaci\u00f3n"],"Use Labels as Placeholders":["Usa etiquetas como marcadores de posici\u00f3n"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["La configuraci\u00f3n anterior colocar\u00e1 las etiquetas dentro de los campos como marcadores de posici\u00f3n (donde sea posible). Esta configuraci\u00f3n solo tiene efecto en la p\u00e1gina en vivo, no en la vista previa del editor."],"Page Break":["Salto de p\u00e1gina"],"Show Labels":["Mostrar etiquetas"],"First Page Label":["Etiqueta de la primera p\u00e1gina"],"Progress Indicator":["Indicador de progreso"],"Progress Bar":["Barra de progreso"],"Connector":["Conector"],"Steps":["Pasos"],"Next Button Text":["Texto del bot\u00f3n Siguiente"],"Back Button Text":["Texto del bot\u00f3n de retroceso"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["\u00bfEst\u00e1 seguro de que desea cerrar? Sus cambios no guardados se perder\u00e1n ya que tiene algunos errores de validaci\u00f3n."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Hay algunos cambios no guardados. Por favor, guarde sus cambios para reflejar las actualizaciones."],"Form Behavior":["Comportamiento del formulario"],"Clear":["Claro"],"Select Color":["Seleccionar color"],"Primary Color":["Color primario"],"Text Color":["Color del texto"],"Text Color on Primary":["Color del texto en primario"],"Field Spacing":["Espaciado de campo"],"Small":["Peque\u00f1o"],"Large":["Grande"],"Left":["Izquierda"],"Center":["Centro"],"Right":["Correcto"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Selector de fecha"],"Time Picker":["Selector de tiempo"],"Hidden":["Oculto"],"Slider":["Deslizador"],"Rating":["Calificaci\u00f3n"],"Upgrade to Unlock These Fields":["Actualiza para desbloquear estos campos"],"Add Block":["Agregar bloque"],"Customize with SureForms":["Personaliza con SureForms"],"Page break":["Salto de p\u00e1gina"],"Previous":["Anterior"],"Thank you":["Gracias"],"Form submitted successfully!":["\u00a1Formulario enviado con \u00e9xito!"],"Instant Form":["Formulario Instant\u00e1neo"],"Enable Instant Form":["Habilitar formulario instant\u00e1neo"],"Enable Preview":["Habilitar vista previa"],"Show Title":["Mostrar t\u00edtulo"],"Site Logo":["Logo del sitio"],"Banner Background":["Fondo del Banner"],"Color":["Color"],"Upload Image":["Subir imagen"],"Background Color":["Color de fondo"],"Use banner as page background":["Usa el banner como fondo de p\u00e1gina"],"Form Width":["Ancho del formulario"],"URL":["URL"],"URL Slug":["Slug de URL"],"The last part of the URL.":["La \u00faltima parte de la URL."],"Learn more.":["Aprende m\u00e1s."],"SureForms Description":["Descripci\u00f3n de SureForms"],"Form Options":["Opciones de formulario"],"Form Shortcode":["C\u00f3digo corto del formulario"],"Paste this shortcode on the page or post to render this form.":["Pega este c\u00f3digo corto en la p\u00e1gina o publicaci\u00f3n para mostrar este formulario."],"Spam Protection":["Protecci\u00f3n contra el spam"],"Auto":["Auto"],"Normal":["Normal"],"%":["%"],"Top":["Superior"],"Bottom":["Fondo"],"Solid":["S\u00f3lido"],"Width":["Ancho"],"Size":["Tama\u00f1o"],"EM":["EM"],"Padding":["Relleno"],"Color 1":["Color 1"],"Color 2":["Color 2"],"Type":["Tipo"],"Linear":["Lineal"],"Radial":["Radial"],"Location 1":["Ubicaci\u00f3n 1"],"Location 2":["Ubicaci\u00f3n 2"],"Angle":["\u00c1ngulo"],"Classic":["Cl\u00e1sico"],"Gradient":["Gradiente"],"Background":["Antecedentes"],"Cover":["Cubrir"],"Contain":["Contener"],"Overlay":["Superposici\u00f3n"],"No Repeat":["No repetir"],"Overlay Opacity":["Opacidad de superposici\u00f3n"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Los nombres de clase deben estar separados por espacios. Cada nombre de clase no debe comenzar con un d\u00edgito, guion o guion bajo. Solo pueden incluir letras (incluidos caracteres Unicode), n\u00fameros, guiones y guiones bajos."],"Conversational Layout":["Dise\u00f1o Conversacional"],"Unlock Conversational Forms":["Desbloquear formularios conversacionales"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Con el Plan SureForms Pro, puedes transformar tus formularios en dise\u00f1os conversacionales atractivos para una experiencia de usuario fluida."],"Premium":["Premium"],"Overlay Type":["Tipo de superposici\u00f3n"],"Image Overlay Color":["Color de superposici\u00f3n de imagen"],"Image Position":["Posici\u00f3n de la imagen"],"Attachment":["Adjunto"],"Fixed":["Fijo"],"Blend Mode":["Modo de fusi\u00f3n"],"Multiply":["Multiplicar"],"Screen":["Pantalla"],"Darken":["Oscurecer"],"Lighten":["Aligerar"],"Color Dodge":["Sobreexponer color"],"Saturation":["Saturaci\u00f3n"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repetir-y"],"PX":["PX"],"Button":["Bot\u00f3n"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Con\u00e9ctate con OttoKit"],"SUREFORMS PREMIUM FIELDS":["CAMPOS PREMIUM DE SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam. Alternativamente, intente usar una direcci\u00f3n de remitente que coincida con el dominio de su sitio web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam."],"We strongly recommend that you install the free ":["Recomendamos encarecidamente que instale el gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["\u00a1Complemento! El asistente de configuraci\u00f3n facilita la correcci\u00f3n de tus correos electr\u00f3nicos."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativamente, intenta usar una direcci\u00f3n de remitente que coincida con el dominio de tu sitio web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Por favor, introduce una direcci\u00f3n de correo electr\u00f3nico v\u00e1lida. Tus notificaciones no se enviar\u00e1n si el campo no est\u00e1 rellenado correctamente."],"From Name":["De Nombre"],"From Email":["De correo electr\u00f3nico"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam. Alternativamente, intente usar una Direcci\u00f3n del Remitente que coincida con el dominio de su sitio web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam."],"Border Radius":["Radio de borde"],"Form Theme":["Tema del formulario"],"Instant Form Padding":["Relleno Instant\u00e1neo de Formularios"],"Instant Form Border Radius":["Radio de Borde de Formulario Instant\u00e1neo"],"Select Gradient":["Seleccionar degradado"],"Upgrade Now":["Actualiza ahora"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Las entradas anteriores a los d\u00edas seleccionados ser\u00e1n eliminadas."],"Entries Time Period":["Per\u00edodo de tiempo de las entradas"],"Custom CSS Panel":["Panel de CSS personalizado"],"Notifications can use only one From Email so please enter a single address.":["Las notificaciones solo pueden usar un \u00fanico correo electr\u00f3nico de origen, as\u00ed que por favor ingrese una sola direcci\u00f3n."],"Email Notifications":["Notificaciones por correo electr\u00f3nico"],"Actions":["Acciones"],"Duplicate":["Duplicado"],"Delete":["Eliminar"],"Select Page to redirect":["Seleccionar p\u00e1gina para redirigir"],"Search for a page":["Buscar una p\u00e1gina"],"Select a page":["Selecciona una p\u00e1gina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Save":["Guardar"],"Login":["Iniciar sesi\u00f3n"],"Register":["Registrar"],"Date":["Fecha"],"Advanced Settings":["Configuraci\u00f3n avanzada"],"Form Restriction":["Restricci\u00f3n de formulario"],"Maximum Number of Entries":["N\u00famero m\u00e1ximo de entradas"],"Maximum Entries":["Entradas M\u00e1ximas"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["La configuraci\u00f3n del Per\u00edodo de Tiempo funciona seg\u00fan la zona horaria de tu sitio de WordPress. Haz clic aqu\u00ed<\/a> para abrir la Configuraci\u00f3n General de WordPress, donde puedes verificarla y actualizarla."],"Click here":["Haz clic aqu\u00ed"],"Response Description After Maximum Entries":["Descripci\u00f3n de la respuesta despu\u00e9s del m\u00e1ximo de entradas"],"All changes will be saved automatically when you press back.":["Todos los cambios se guardar\u00e1n autom\u00e1ticamente cuando presiones atr\u00e1s."],"Repeater":["Repetidor"],"OttoKit Settings":["Configuraci\u00f3n de OttoKit"],"Get Started":["Comenzar"],"Connect Native Integrations with SureForms":["Conecta integraciones nativas con SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato esperado para correos electr\u00f3nicos: email@sureforms.com o John Doe "],"delete":["eliminar"],"Please type \"%s\" in the input box":["Por favor, escribe \"%s\" en el cuadro de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, escriba \"%s\" en el cuadro de abajo:"],"Type \"%s\"":["Escribe \"%s\""],"Payment":["Pago"],"%s - Order ID":["%s - ID de pedido"],"%s - Amount":["%s - Cantidad"],"%s - Customer Email":["%s - Correo Electr\u00f3nico del Cliente"],"%s - Customer Name":["%s - Nombre del Cliente"],"%s - Status":["%s - Estado"],"Add custom CSS rules to style this specific form independently of global styles.":["Agrega reglas CSS personalizadas para estilizar este formulario espec\u00edfico independientemente de los estilos globales."],"Spam Protection Type":["Tipo de Protecci\u00f3n contra Spam"],"Select Security Type":["Seleccionar tipo de seguridad"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Nota: Usar diferentes versiones de reCAPTCHA (V2 checkbox y V3) en la misma p\u00e1gina crear\u00e1 conflictos entre las versiones. Por favor, evite usar diferentes versiones en la misma p\u00e1gina."],"Select Version":["Seleccionar versi\u00f3n"],"Please configure the API keys correctly from the settings":["Por favor, configure las claves API correctamente desde la configuraci\u00f3n"],"Control email alerts sent to admins or users after a form submission.":["Controla las alertas de correo electr\u00f3nico enviadas a los administradores o usuarios despu\u00e9s de una presentaci\u00f3n de formulario."],"Customize the confirmation message or redirect the users after submitting the form.":["Personaliza el mensaje de confirmaci\u00f3n o redirige a los usuarios despu\u00e9s de enviar el formulario."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Establezca l\u00edmites en la cantidad de veces que se puede enviar un formulario y gestione las opciones de cumplimiento, incluidas GDPR y la retenci\u00f3n de datos."],"Go to OttoKit Settings":["Ve a la configuraci\u00f3n de OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Conecta SureForms con tus aplicaciones favoritas para automatizar tareas y sincronizar datos sin problemas."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Desbloquea potentes integraciones en el plan Premium para automatizar tus flujos de trabajo y conectar SureForms directamente con tus herramientas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Env\u00eda las presentaciones de formularios directamente a los CRM, correo electr\u00f3nico y plataformas de marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatiza tareas repetitivas con una sincronizaci\u00f3n de datos sin problemas."],"Access exclusive native integrations for faster workflows.":["Accede a integraciones nativas exclusivas para flujos de trabajo m\u00e1s r\u00e1pidos."],"PDF Generation":["Generaci\u00f3n de PDF"],"Generate and customize PDF copies of form submissions.":["Genera y personaliza copias en PDF de los env\u00edos de formularios."],"Generate Submission PDFs":["Generar PDFs de env\u00edo"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Convierte cada entrada de formulario en un archivo PDF pulido, haci\u00e9ndolo perfecto para informes, registros o compartir."],"Automatically generate PDFs from your form submissions.":["Genera autom\u00e1ticamente PDFs a partir de tus env\u00edos de formularios."],"Customize PDF templates with your branding.":["Personaliza las plantillas de PDF con tu marca."],"Download or email PDFs instantly.":["Descarga o env\u00eda por correo electr\u00f3nico los PDFs al instante."],"User Registration":["Registro de Usuario"],"Onboard new users or update existing accounts through beautiful looking forms.":["Incorpore nuevos usuarios o actualice cuentas existentes a trav\u00e9s de formularios de aspecto atractivo."],"Register Users with SureForms":["Registrar usuarios con SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Optimiza todo el proceso de incorporaci\u00f3n de usuarios para tus sitios con inicios de sesi\u00f3n y registros fluidos impulsados por formularios."],"Register new users directly via your form submissions.":["Registra nuevos usuarios directamente a trav\u00e9s de tus env\u00edos de formularios."],"Create or update existing accounts by mapping form data to user fields.":["Cree o actualice cuentas existentes asignando datos del formulario a campos de usuario."],"Assign roles and control access automatically.":["Asigna roles y controla el acceso autom\u00e1ticamente."],"Post Feed":["Publicar en el feed"],"Transform your form submission into WordPress posts.":["Transforma tu env\u00edo de formulario en publicaciones de WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Convierte autom\u00e1ticamente las presentaciones de formularios en publicaciones, p\u00e1ginas o tipos de publicaciones personalizadas de WordPress. Ahorra mucho tiempo y permite que tus formularios publiquen contenido directamente."],"Create posts, pages, or CPTs from your form entries.":["Crea publicaciones, p\u00e1ginas o CPTs a partir de las entradas de tu formulario."],"Map form fields to your post fields easily.":["Mapea los campos del formulario a los campos de tu publicaci\u00f3n f\u00e1cilmente."],"Automate the content publishing flow with few simple steps.":["Automatiza el flujo de publicaci\u00f3n de contenido con unos pocos pasos simples."],"Automations":["Automatizaciones"],"Unlock Advanced Styling":["Desbloquear estilo avanzado"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Obt\u00e9n control total sobre el aspecto de tu formulario con colores, fuentes y dise\u00f1os personalizados."],"Button Alignment":["Alineaci\u00f3n del bot\u00f3n"],"Add Custom CSS Class(es)":["Agregar clase(s) CSS personalizada(s)"],"Set the total number of submissions allowed for this form.":["Establezca el n\u00famero total de env\u00edos permitidos para este formulario."],"Save & Progress":["Guardar y Progresar"],"Allow users to save their progress and continue form completion later.":["Permitir a los usuarios guardar su progreso y continuar completando el formulario m\u00e1s tarde."],"Save & Progress in SureForms":["Guardar y Progresar en SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Brinda a tus usuarios la flexibilidad de completar formularios a su propio ritmo permiti\u00e9ndoles guardar el progreso y regresar en cualquier momento."],"Let users pause long or multi-step forms and continue later.":["Permitir a los usuarios pausar formularios largos o de varios pasos y continuar m\u00e1s tarde."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Reduzca el abandono de formularios con enlaces de reanudaci\u00f3n convenientes y acceda a su progreso desde cualquier lugar."],"Improve user experience for lengthy, complex, or multi-page forms.":["Mejorar la experiencia del usuario para formularios extensos, complejos o de varias p\u00e1ginas."],"This form is not yet available. Please check back after the scheduled start time.":["Este formulario a\u00fan no est\u00e1 disponible. Por favor, vuelva a consultar despu\u00e9s de la hora de inicio programada."],"This form is no longer accepting submissions. The submission period has ended.":["Este formulario ya no acepta env\u00edos. El per\u00edodo de env\u00edo ha terminado."],"The start date and time must be before the end date and time.":["La fecha y hora de inicio deben ser anteriores a la fecha y hora de finalizaci\u00f3n."],"Form Scheduling":["Programaci\u00f3n de formularios"],"Enable Form Scheduling":["Habilitar la programaci\u00f3n de formularios"],"Set a time period during which this form will be available for submissions.":["Establezca un per\u00edodo de tiempo durante el cual este formulario estar\u00e1 disponible para env\u00edos."],"Start Date & Time":["Fecha y hora de inicio"],"End Date & Time":["Fecha y hora de finalizaci\u00f3n"],"Response Description Before Start Date":["Descripci\u00f3n de la respuesta antes de la fecha de inicio"],"Response Description After End Date":["Descripci\u00f3n de la respuesta despu\u00e9s de la fecha de finalizaci\u00f3n"],"Conditional Confirmations":["Confirmaciones Condicionales"],"Set up the message or redirect users will see after submitting the form.":["Configure el mensaje o la redirecci\u00f3n que los usuarios ver\u00e1n despu\u00e9s de enviar el formulario."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Muestra el mensaje correcto al usuario adecuado seg\u00fan c\u00f3mo respondan. Personaliza las confirmaciones con condiciones inteligentes y gu\u00eda a los usuarios al siguiente mejor paso autom\u00e1ticamente."],"Display different confirmation messages based on form responses.":["Muestra diferentes mensajes de confirmaci\u00f3n seg\u00fan las respuestas del formulario."],"Redirect users to specific pages or URLs conditionally.":["Redirige a los usuarios a p\u00e1ginas o URLs espec\u00edficas de manera condicional."],"Create personalized thank-you messages without extra forms.":["Crea mensajes de agradecimiento personalizados sin formularios adicionales."],"Lost Password":["Contrase\u00f1a perdida"],"Reset Password":["Restablecer contrase\u00f1a"],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Seleccione un servicio de protecci\u00f3n contra spam. Configure las claves API en Configuraci\u00f3n Global antes de habilitarlo."],"Send as Raw HTML":["Enviar como HTML sin procesar"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Cuando est\u00e9 habilitado, el cuerpo del correo electr\u00f3nico en HTML se conservar\u00e1 exactamente como est\u00e1 escrito y se envolver\u00e1 en una plantilla de correo electr\u00f3nico profesional."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Las etiquetas inteligentes que hacen referencia a campos enviados por el usuario no se escapar\u00e1n en el modo HTML sin procesar. Evita insertar valores de campos no confiables directamente en el cuerpo del correo electr\u00f3nico."],"Please provide a recipient email address and subject line.":["Por favor, proporcione una direcci\u00f3n de correo electr\u00f3nico del destinatario y una l\u00ednea de asunto."],"Email notification duplicated!":["\u00a1Notificaci\u00f3n de correo electr\u00f3nico duplicada!"],"Are you sure you want to delete this email notification?":["\u00bfEst\u00e1s seguro de que deseas eliminar esta notificaci\u00f3n por correo electr\u00f3nico?"],"Email notification deleted!":["\u00a1Notificaci\u00f3n de correo electr\u00f3nico eliminada!"],"URL is missing Top Level Domain (TLD).":["Falta el dominio de nivel superior (TLD) en la URL."],"This form is now closed as the maximum number of entries has been received.":["Este formulario est\u00e1 cerrado ya que se ha recibido el n\u00famero m\u00e1ximo de entradas."],"Publish Your Form":["Publica tu formulario"],"Enable This to Instantly Publish the Form":["Habilitar esto para publicar el formulario instant\u00e1neamente"],"Style Your Instant Form Page Here":["Estiliza tu p\u00e1gina de formulario instant\u00e1neo aqu\u00ed"],"Quizzes":["Cuestionarios"],"%s - Description":["%s - Descripci\u00f3n"],"Send entries to 100+ popular apps.":["Env\u00eda entradas a m\u00e1s de 100 aplicaciones populares."],"Build automated workflows that run instantly.":["Crea flujos de trabajo automatizados que se ejecutan al instante."],"Create custom app integrations using our Custom App feature.":["Crea integraciones de aplicaciones personalizadas utilizando nuestra funci\u00f3n de Aplicaci\u00f3n Personalizada."],"Keep your tools in sync automatically.":["Mant\u00e9n tus herramientas sincronizadas autom\u00e1ticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Esto instalar\u00e1 y activar\u00e1 OttoKit en su sitio de WordPress para habilitar funciones de automatizaci\u00f3n."],"Automate Your Forms with OttoKit":["Automatiza tus formularios con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada env\u00edo de formulario deber\u00eda activar algo: una alerta de Slack, un cliente potencial en el CRM, un correo electr\u00f3nico de seguimiento o una nueva fila en Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Crea cuestionarios interactivos para involucrar a tu audiencia y recopilar informaci\u00f3n."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Dise\u00f1a cuestionarios atractivos con varios tipos de preguntas, retroalimentaci\u00f3n personalizada y puntuaci\u00f3n automatizada para cautivar a tu audiencia y obtener valiosos conocimientos."],"Create interactive quizzes with multiple question types.":["Crea cuestionarios interactivos con m\u00faltiples tipos de preguntas."],"Provide personalized feedback based on user responses.":["Proporciona comentarios personalizados basados en las respuestas del usuario."],"Automate scoring and lead segmentation for better insights.":["Automatiza la puntuaci\u00f3n y la segmentaci\u00f3n de leads para obtener mejores insights."],"Heading 1":["Encabezado 1"],"Heading 2":["Encabezado 2"],"Heading 3":["Encabezado 3"],"Heading 4":["Encabezado 4"],"Heading 5":["Encabezado 5"],"Heading 6":["Encabezado 6"],"Form settings saved.":["Configuraci\u00f3n del formulario guardada."],"The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature.":["El l\u00edmite de entradas se basa en las entradas almacenadas para contar las presentaciones. Mientras la Configuraci\u00f3n de Cumplimiento tenga habilitada la opci\u00f3n \"Nunca almacenar datos de entrada despu\u00e9s del env\u00edo del formulario\", este l\u00edmite no se aplicar\u00e1. Desactive esa opci\u00f3n o elimine el l\u00edmite de entradas para usar esta funci\u00f3n."],"Settings saved, but post attributes (password \/ title \/ content) failed to update. Retry to persist them.":["Configuraciones guardadas, pero los atributos de la publicaci\u00f3n (contrase\u00f1a \/ t\u00edtulo \/ contenido) no se actualizaron. Intente de nuevo para persistirlos."],"Failed to save form settings.":["Error al guardar la configuraci\u00f3n del formulario."],"Saving\u2026":["Guardando\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Cuando est\u00e9 habilitado, este formulario no almacenar\u00e1 la IP del usuario, el nombre del navegador ni el nombre del dispositivo en las entradas."],"Failed to save. Please try again.":["Error al guardar. Por favor, int\u00e9ntalo de nuevo."],"reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.":["Las claves de la API de reCAPTCHA para la versi\u00f3n seleccionada no est\u00e1n configuradas. Establ\u00e9zcalas en Configuraci\u00f3n Global."],"Please select a reCAPTCHA version.":["Por favor, seleccione una versi\u00f3n de reCAPTCHA."],"hCaptcha API keys are not configured. Set them in Global Settings.":["Las claves de API de hCaptcha no est\u00e1n configuradas. Establ\u00e9celas en Configuraci\u00f3n Global."],"Cloudflare Turnstile API keys are not configured. Set them in Global Settings.":["Las claves API de Cloudflare Turnstile no est\u00e1n configuradas. Establ\u00e9zcalas en Configuraci\u00f3n Global."],"Form data":["Datos del formulario"],"Some fields need attention":["Algunos campos necesitan atenci\u00f3n"],"Unsaved changes":["Cambios no guardados"],"A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.":["Se requiere una direcci\u00f3n de correo electr\u00f3nico del destinatario y una l\u00ednea de asunto antes de que se pueda guardar esta notificaci\u00f3n. Corrija los campos resaltados o descarte sus cambios para volver atr\u00e1s."],"You have unsaved changes for this notification. Discard them to go back, or stay to save them.":["Tienes cambios no guardados para esta notificaci\u00f3n. Desc\u00e1rtalos para volver, o qu\u00e9date para guardarlos."],"Discard & go back":["Descartar y volver"],"Stay & fix":["Qu\u00e9date y arregla"],"Keep editing":["Sigue editando"],"Please provide a recipient email address.":["Por favor, proporcione una direcci\u00f3n de correo electr\u00f3nico del destinatario."],"Please provide a subject line.":["Por favor, proporcione una l\u00ednea de asunto."],"Please provide a custom URL.":["Por favor, proporcione una URL personalizada."],"You have unsaved changes. Discard them to continue, or stay to save your changes.":["Tienes cambios no guardados. Des\u00e9chalos para continuar, o qu\u00e9date para guardar tus cambios."],"Discard & continue":["Descartar y continuar"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-es_ES-46b85b18ab0a35677f7beff46af30190.json b/languages/sureforms-es_ES-46b85b18ab0a35677f7beff46af30190.json new file mode 100644 index 000000000..27011bff0 --- /dev/null +++ b/languages/sureforms-es_ES-46b85b18ab0a35677f7beff46af30190.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/htmlFormDetector.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Converted form":["Forma convertida"],"SureForms could not authenticate this request. Please reload the editor and try again.":["SureForms no pudo autenticar esta solicitud. Por favor, recargue el editor e intente de nuevo."],"%s \u2014 Converted form":["%s \u2014 Forma convertida"],"Form converted to SureForms using AI. Review the new form for any tweaks.":["Formulario convertido a SureForms usando IA. Revise el nuevo formulario para cualquier ajuste."],"Form converted to SureForms.":["Formulario convertido a SureForms."],"You do not have permission to convert this form.":["No tienes permiso para convertir este formulario."],"This form is too large to convert. Try simplifying the markup or building the form manually.":["Este formulario es demasiado grande para convertirlo. Intenta simplificar el marcado o construir el formulario manualmente."],"SureForms could not derive any fields from this form.":["SureForms no pudo derivar ning\u00fan campo de este formulario."],"The SureForms AI service could not process this form. Please try again or build the form manually.":["El servicio de SureForms AI no pudo procesar este formulario. Por favor, int\u00e9ntelo de nuevo o construya el formulario manualmente."],"SureForms received an unexpected response. Please try again.":["SureForms recibi\u00f3 una respuesta inesperada. Por favor, int\u00e9ntelo de nuevo."],"Could not convert this form to SureForms. Please try again.":["No se pudo convertir este formulario a SureForms. Por favor, int\u00e9ntelo de nuevo."],"Converting\u2026":["Convirtiendo\u2026"],"Convert to SureForms":["Convertir a SureForms"]}}} \ No newline at end of file diff --git a/languages/sureforms-es_ES-4b62e3f004dea2c587b5a3069263d994.json b/languages/sureforms-es_ES-4b62e3f004dea2c587b5a3069263d994.json index fe1d80b9a..416b291e1 100644 --- a/languages/sureforms-es_ES-4b62e3f004dea2c587b5a3069263d994.json +++ b/languages/sureforms-es_ES-4b62e3f004dea2c587b5a3069263d994.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Configuraciones"],"Search":["Buscar"],"Fields":["Campos"],"Image":["Imagen"],"Submit":["Enviar"],"Required":["Requerido"],"Form Title":["T\u00edtulo del formulario"],"Show":["Mostrar"],"Hide":["Ocultar"],"Edit Form":["Editar formulario"],"Icon":["Icono"],"Desktop":["Escritorio"],"Medium":["Medio"],"Mobile":["M\u00f3vil"],"Repeat":["Repetir"],"Scroll":["Desplazar"],"Tablet":["Tableta"],"Basic":["B\u00e1sico"],"(no title)":["(sin t\u00edtulo)"],"Select a Form":["Selecciona un formulario"],"No forms found\u2026":["No se encontraron formularios\u2026"],"Choose":["Elegir"],"Create New":["Crear nuevo"],"Change Form":["Cambiar formulario"],"This form has been deleted or is unavailable.":["Este formulario ha sido eliminado o no est\u00e1 disponible."],"Form Settings":["Configuraci\u00f3n del formulario"],"Show Form Title on this Page":["Mostrar el t\u00edtulo del formulario en esta p\u00e1gina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Nota: Para editar SureForms, consulte el Editor de SureForms -"],"Field preview":["Vista previa del campo"],"General":["General"],"Style":["Estilo"],"Advanced":["Avanzado"],"No tags available":["No hay etiquetas disponibles"],"Device":["Dispositivo"],"Select Shortcodes":["Seleccionar c\u00f3digos cortos"],"Page Break Label":["Etiqueta de salto de p\u00e1gina"],"Next":["Siguiente"],"Back":["Atr\u00e1s"],"Reset":["Restablecer"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["P\u00edxel"],"Em":["Em"],"Select Units":["Seleccionar unidades"],"%s units":["%s unidades"],"Margin":["Margen"],"Attributes":["Atributos"],"Input Pattern":["Patr\u00f3n de entrada"],"None":["Ninguno"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personalizado"],"Custom Mask":["M\u00e1scara personalizada"],"Please check the documentation to manage custom input pattern ":["Por favor, consulte la documentaci\u00f3n para gestionar el patr\u00f3n de entrada personalizado"],"here":["aqu\u00ed"],"Default Value":["Valor predeterminado"],"Error Message":["Mensaje de error"],"Help Text":["Texto de ayuda"],"Number Format":["Formato de n\u00famero"],"US Style (Eg: 9,999.99)":["Estilo estadounidense (Ej: 9,999.99)"],"EU Style (Eg: 9.999,99)":["Estilo UE (Ej: 9.999,99)"],"Minimum Value":["Valor m\u00ednimo"],"Maximum Value":["Valor m\u00e1ximo"],"Please check the Minimum and Maximum value":["Por favor, verifica el valor M\u00ednimo y M\u00e1ximo"],"Enable Email Confirmation":["Habilitar confirmaci\u00f3n de correo electr\u00f3nico"],"Checked by Default":["Marcado por defecto"],"Error message":["Mensaje de error"],"Checked by default":["Marcado por defecto"],"Please add a option props to MultiButtonsControl":["Por favor, a\u00f1ade una opci\u00f3n de propiedades a MultiButtonsControl"],"Icon Library":["Biblioteca de Iconos"],"Close":["Cerrar"],"All Icons":["Todos los iconos"],"Other":["Otro"],"No Icons Found":["No se encontraron iconos"],"Insert Icon":["Insertar icono"],"Change Icon":["Cambiar \u00edcono"],"Choose Icon":["Elegir \u00edcono"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Procesando\u2026"],"Select Video":["Seleccionar video"],"Change Video":["Cambiar video"],"Select Lottie Animation":["Seleccionar animaci\u00f3n Lottie"],"Change Lottie Animation":["Cambiar animaci\u00f3n Lottie"],"Upload SVG":["Subir SVG"],"Change SVG":["Cambiar SVG"],"Select Image":["Seleccionar imagen"],"Change Image":["Cambiar imagen"],"Upload SVG?":["\u00bfSubir SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Subir SVG puede ser potencialmente arriesgado. \u00bfEst\u00e1s seguro?"],"Upload Anyway":["Subir de todos modos"],"Bulk Add":["Agregar en masa"],"Bulk Add Options":["Agregar Opciones en Masa"],"Enter each option on a new line.":["Ingrese cada opci\u00f3n en una nueva l\u00ednea."],"Insert Options":["Insertar opciones"],"Full Width":["Ancho completo"],"Option Type":["Tipo de opci\u00f3n"],"Edit Options":["Opciones de edici\u00f3n"],"Add New Option":["Agregar nueva opci\u00f3n"],"ADD":["A\u00d1ADIR"],"Enable Auto Country Detection":["Habilitar la detecci\u00f3n autom\u00e1tica de pa\u00eds"],"%s Width":["Ancho %s"],"Upgrade":["Actualizar"],"Clear":["Claro"],"Select Color":["Seleccionar color"],"Primary Color":["Color primario"],"Text Color":["Color del texto"],"Field Spacing":["Espaciado de campo"],"Small":["Peque\u00f1o"],"Large":["Grande"],"Left":["Izquierda"],"Center":["Centro"],"Right":["Correcto"],"Color":["Color"],"Background Color":["Color de fondo"],"Auto":["Auto"],"Default":["Predeterminado"],"Normal":["Normal"],"%":["%"],"Top":["Superior"],"Bottom":["Fondo"],"Width":["Ancho"],"Size":["Tama\u00f1o"],"EM":["EM"],"Padding":["Relleno"],"Color 1":["Color 1"],"Color 2":["Color 2"],"Type":["Tipo"],"Linear":["Lineal"],"Radial":["Radial"],"Location 1":["Ubicaci\u00f3n 1"],"Location 2":["Ubicaci\u00f3n 2"],"Angle":["\u00c1ngulo"],"Classic":["Cl\u00e1sico"],"Gradient":["Gradiente"],"Horizontal":["Horizontal"],"Vertical":["Vertical"],"Background":["Antecedentes"],"Cover":["Cubrir"],"Contain":["Contener"],"Layout":["Dise\u00f1o"],"Overlay":["Superposici\u00f3n"],"No Repeat":["No repetir"],"Overlay Opacity":["Opacidad de superposici\u00f3n"],"Conditional Logic":["L\u00f3gica condicional"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Actualiza al Plan Starter de SureForms para crear formularios din\u00e1micos que se adaptan seg\u00fan la entrada del usuario, ofreciendo una experiencia de formulario personalizada y eficiente."],"Enable Conditional Logic":["Habilitar l\u00f3gica condicional"],"this field if":["este campo si"],"Configure Conditions":["Configurar condiciones"],"Premium":["Premium"],"Overlay Type":["Tipo de superposici\u00f3n"],"Image Overlay Color":["Color de superposici\u00f3n de imagen"],"Image Position":["Posici\u00f3n de la imagen"],"Attachment":["Adjunto"],"Fixed":["Fijo"],"Blend Mode":["Modo de fusi\u00f3n"],"Multiply":["Multiplicar"],"Screen":["Pantalla"],"Darken":["Oscurecer"],"Lighten":["Aligerar"],"Color Dodge":["Sobreexponer color"],"Saturation":["Saturaci\u00f3n"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repetir-y"],"PX":["PX"],"Button":["Bot\u00f3n"],"Prefix Label":["Etiqueta de prefijo"],"Suffix Label":["Etiqueta de sufijo"],"Border Radius":["Radio de borde"],"Form Theme":["Tema del formulario"],"Select Gradient":["Seleccionar degradado"],"Unlock Conditional Logic Editor":["Desbloquear el Editor de L\u00f3gica Condicional"],"Rich Text Editor":["Editor de texto enriquecido"],"Read Only":["Solo lectura"],"Select Country":["Seleccionar pa\u00eds"],"Default Country":["Pa\u00eds predeterminado"],"Subscription":["Suscripci\u00f3n"],"One Time":["Una vez"],"Unique Entry":["Entrada \u00danica"],"Maximum Characters":["M\u00e1ximo de caracteres"],"Textarea Height":["Altura del \u00e1rea de texto"],"Minimum Selections":["Selecciones M\u00ednimas"],"Maximum Selections":["Selecciones M\u00e1ximas"],"Add Numeric Values to Options":["Agregar valores num\u00e9ricos a las opciones"],"Single Choice Only":["Solo una opci\u00f3n"],"Enable Dropdown Search":["Habilitar b\u00fasqueda desplegable"],"Allow Multiple":["Permitir m\u00faltiples"],"%1$s fields are required. Please configure these fields in the block settings.":["Se requieren los campos %1$s. Por favor, configure estos campos en la configuraci\u00f3n del bloque."],"%1$s field is required. Please configure this field in the block settings.":["El campo %1$s es obligatorio. Por favor, configure este campo en la configuraci\u00f3n del bloque."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Necesitas configurar una cuenta de pago para recibir pagos de este formulario. Por favor, configura tu proveedor de pagos para continuar."],"Configure Payment Account":["Configurar cuenta de pago"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Este es un marcador de posici\u00f3n para el bloque de Pago. Los campos de pago reales para su(s) proveedor(es) de pago configurado(s) solo aparecer\u00e1n cuando previsualice o publique el formulario."],"2 Payments":["2 Pagos"],"3 Payments":["3 Pagos"],"4 Payments":["4 Pagos"],"5 Payments":["5 Pagos"],"Never":["Nunca"],"Stop Subscription After":["Detener suscripci\u00f3n despu\u00e9s"],"Choose when to automatically stop the subscription":["Elige cu\u00e1ndo detener autom\u00e1ticamente la suscripci\u00f3n"],"Number of Payments":["N\u00famero de pagos"],"Enter a number between 1 to 100":["Introduce un n\u00famero entre 1 y 100"],"Form Field":["Campo de formulario"],"Payment Type":["Tipo de pago"],"Subscription Plan Name":["Nombre del Plan de Suscripci\u00f3n"],"Billing Interval":["Intervalo de facturaci\u00f3n"],"Daily":["Diario"],"Weekly":["Semanal"],"Monthly":["Mensual"],"Quarterly":["Trimestral"],"Yearly":["Anual"],"Amount Type":["Tipo de Monto"],"Fixed Amount":["Cantidad Fija"],"Dynamic Amount":["Cantidad Din\u00e1mica"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Elija si desea cobrar una cantidad fija o cobrar la cantidad basada en la entrada del usuario en otros campos del formulario."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Establece la cantidad exacta que deseas cobrar. Los usuarios no podr\u00e1n cambiarla"],"Choose Amount Field":["Elegir campo de cantidad"],"Select a field\u2026":["Seleccione un campo\u2026"],"Minimum Amount":["Cantidad m\u00ednima"],"Set the minimum amount users can enter (0 for no minimum)":["Establezca la cantidad m\u00ednima que los usuarios pueden ingresar (0 para sin m\u00ednimo)"],"Customer Name Field (Required)":["Campo de Nombre del Cliente (Obligatorio)"],"Customer Name Field (Optional)":["Campo de Nombre del Cliente (Opcional)"],"Select the input field that contains the customer name (Required for subscriptions)":["Seleccione el campo de entrada que contiene el nombre del cliente (Requerido para suscripciones)"],"Select the input field that contains the customer name":["Seleccione el campo de entrada que contiene el nombre del cliente"],"Customer Email Field (Required)":["Campo de correo electr\u00f3nico del cliente (obligatorio)"],"Select the email field that contains the customer email":["Seleccione el campo de correo electr\u00f3nico que contiene el correo electr\u00f3nico del cliente"],"Payment":["Pago"],"%s - Order ID":["%s - ID de pedido"],"%s - Amount":["%s - Cantidad"],"%s - Customer Email":["%s - Correo Electr\u00f3nico del Cliente"],"%s - Customer Name":["%s - Nombre del Cliente"],"%s - Status":["%s - Estado"],"Button Alignment":["Alineaci\u00f3n del bot\u00f3n"],"Placeholder":["Marcador de posici\u00f3n"],"Preselect this option":["Preselecciona esta opci\u00f3n"],"Restrict Country Codes":["Restringir c\u00f3digos de pa\u00eds"],"Restriction Type":["Tipo de restricci\u00f3n"],"Allow":["Permitir"],"Block":["Bloque"],"Select Allowed Countries":["Seleccionar pa\u00edses permitidos"],"Choose countries\u2026":["Elige pa\u00edses\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Elija qu\u00e9 c\u00f3digos de pa\u00eds pueden seleccionar los usuarios en el campo del n\u00famero de tel\u00e9fono. Deje vac\u00edo para permitir todos los c\u00f3digos de pa\u00eds."],"Select Blocked Countries":["Seleccionar pa\u00edses bloqueados"],"These countries will be hidden from the dropdown.":["Estos pa\u00edses se ocultar\u00e1n del men\u00fa desplegable."],"Bulk Edit":["Edici\u00f3n masiva"],"Select Layout":["Seleccionar dise\u00f1o"],"Number of Columns":["N\u00famero de columnas"],"Validation Message for Duplicate":["Mensaje de validaci\u00f3n para duplicado"],"Click here to insert a form":["Haga clic aqu\u00ed para insertar un formulario"],"Inherit Form's Original Style":["Heredar el estilo original del formulario"],"Text on Primary":["Texto en Primario"],"%s - Description":["%s - Descripci\u00f3n"],"Upgrade to Unlock":["Actualiza para desbloquear"],"Custom (Premium)":["Personalizado (Premium)"],"Select a theme style for this form embed.":["Seleccione un estilo de tema para este formulario incrustado."],"Colors":["Colores"],"Advanced Styling":["Estilo Avanzado"],"Unlock Custom Styling":["Desbloquear estilo personalizado"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Cambia a Modo Personalizado para tener control total sobre el dise\u00f1o y el espaciado de tu formulario."],"Full color control (buttons, fields, text)":["Control total del color (botones, campos, texto)"],"Row and column gap control":["Control de separaci\u00f3n de filas y columnas"],"Field spacing and layout precision":["Precisi\u00f3n en el espaciado y dise\u00f1o de campos"],"Complete button styling":["Estilo completo del bot\u00f3n"],"Payment Description":["Descripci\u00f3n del pago"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Se muestra en los recibos de pago y en su panel de pagos (Stripe y PayPal). Deje en blanco para usar el valor predeterminado."],"Slug":["Babosa"],"Auto-generated on save":["Generado autom\u00e1ticamente al guardar"],"This slug is already used by another field. It will revert to the previous value.":["Este slug ya est\u00e1 siendo utilizado por otro campo. Volver\u00e1 al valor anterior."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Cambiar el slug puede romper los env\u00edos de formularios, la l\u00f3gica condicional, las integraciones o cualquier otra caracter\u00edstica que actualmente haga referencia a este slug. Necesitar\u00e1s actualizar todas esas referencias manualmente."],"Field Slug":["Identificador de campo"],"Location Services":["Servicios de ubicaci\u00f3n"],"Unlock Address Autocomplete":["Desbloquear la autocompletaci\u00f3n de direcciones"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Actualiza para habilitar la autocompletaci\u00f3n de direcciones de Google con vista previa de mapa interactivo, haciendo que la entrada de direcciones sea m\u00e1s r\u00e1pida y precisa para tus usuarios."],"Enable Google Autocomplete":["Habilitar la autocompletar de Google"],"Show Interactive Map":["Mostrar mapa interactivo"],"Payments Per Page":["Pagos por p\u00e1gina"],"Show Subscriptions Section":["Mostrar secci\u00f3n de suscripciones"],"Show a dedicated subscriptions section above payment history.":["Muestra una secci\u00f3n dedicada a suscripciones por encima del historial de pagos."],"Payment Dashboard":["Panel de Pagos"],"View your payments and manage subscriptions in a single dashboard.":["Vea sus pagos y gestione sus suscripciones en un solo panel."],"Dynamic Default Value":["Valor Predeterminado Din\u00e1mico"],"Minimum Characters":["Caracteres m\u00ednimos"],"Minimum characters cannot exceed Maximum characters.":["Los caracteres m\u00ednimos no pueden exceder los caracteres m\u00e1ximos."],"Both":["Ambos"],"One-Time Label":["Etiqueta de un solo uso"],"Label shown to users for the one-time payment option.":["Etiqueta mostrada a los usuarios para la opci\u00f3n de pago \u00fanico."],"Subscription Label":["Etiqueta de suscripci\u00f3n"],"Label shown to users for the subscription option.":["Etiqueta mostrada a los usuarios para la opci\u00f3n de suscripci\u00f3n."],"Default Selection":["Selecci\u00f3n predeterminada"],"Which option is pre-selected when the form loads.":["\u00bfQu\u00e9 opci\u00f3n est\u00e1 preseleccionada cuando se carga el formulario?"],"One-Time Amount Type":["Tipo de Monto \u00danico"],"Set how the one-time payment amount is determined.":["Establezca c\u00f3mo se determina el monto del pago \u00fanico."],"One-Time Fixed Amount":["Monto fijo \u00fanico"],"Amount charged for a one-time payment.":["Cantidad cobrada por un pago \u00fanico."],"One-Time Amount Field":["Campo de Monto \u00danico"],"Pick a form field whose value determines the one-time payment amount.":["Elija un campo de formulario cuyo valor determine el monto del pago \u00fanico."],"One-Time Minimum Amount":["Monto m\u00ednimo \u00fanico"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Monto m\u00ednimo que los usuarios pueden ingresar para un pago \u00fanico (0 para sin m\u00ednimo)."],"Subscription Amount Type":["Tipo de Monto de Suscripci\u00f3n"],"Set how the subscription amount is determined.":["Establezca c\u00f3mo se determina el monto de la suscripci\u00f3n."],"Subscription Fixed Amount":["Monto fijo de suscripci\u00f3n"],"Recurring amount charged per billing interval.":["Monto recurrente cobrado por intervalo de facturaci\u00f3n."],"Subscription Amount Field":["Campo de Monto de Suscripci\u00f3n"],"Pick a form field whose value determines the subscription amount.":["Elija un campo de formulario cuyo valor determine el monto de la suscripci\u00f3n."],"Subscription Minimum Amount":["Monto M\u00ednimo de Suscripci\u00f3n"],"Minimum amount users can enter for subscription (0 for no minimum).":["Cantidad m\u00ednima que los usuarios pueden ingresar para la suscripci\u00f3n (0 para sin m\u00ednimo)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Elige un campo de tu formulario como un n\u00famero, un desplegable, una opci\u00f3n m\u00faltiple o un campo oculto cuyo valor deba determinar el monto del pago."]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Configuraciones"],"Search":["Buscar"],"Fields":["Campos"],"Image":["Imagen"],"Submit":["Enviar"],"Required":["Requerido"],"Form Title":["T\u00edtulo del formulario"],"Show":["Mostrar"],"Hide":["Ocultar"],"Edit Form":["Editar formulario"],"Icon":["Icono"],"Desktop":["Escritorio"],"Medium":["Medio"],"Mobile":["M\u00f3vil"],"Repeat":["Repetir"],"Scroll":["Desplazar"],"Tablet":["Tableta"],"Basic":["B\u00e1sico"],"(no title)":["(sin t\u00edtulo)"],"Select a Form":["Selecciona un formulario"],"No forms found\u2026":["No se encontraron formularios\u2026"],"Choose":["Elegir"],"Create New":["Crear nuevo"],"Change Form":["Cambiar formulario"],"This form has been deleted or is unavailable.":["Este formulario ha sido eliminado o no est\u00e1 disponible."],"Form Settings":["Configuraci\u00f3n del formulario"],"Show Form Title on this Page":["Mostrar el t\u00edtulo del formulario en esta p\u00e1gina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Nota: Para editar SureForms, consulte el Editor de SureForms -"],"Field preview":["Vista previa del campo"],"General":["General"],"Style":["Estilo"],"Advanced":["Avanzado"],"No tags available":["No hay etiquetas disponibles"],"Device":["Dispositivo"],"Select Shortcodes":["Seleccionar c\u00f3digos cortos"],"Page Break Label":["Etiqueta de salto de p\u00e1gina"],"Next":["Siguiente"],"Back":["Atr\u00e1s"],"Reset":["Restablecer"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["P\u00edxel"],"Em":["Em"],"Select Units":["Seleccionar unidades"],"%s units":["%s unidades"],"Margin":["Margen"],"Attributes":["Atributos"],"Input Pattern":["Patr\u00f3n de entrada"],"None":["Ninguno"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personalizado"],"Custom Mask":["M\u00e1scara personalizada"],"Please check the documentation to manage custom input pattern ":["Por favor, consulte la documentaci\u00f3n para gestionar el patr\u00f3n de entrada personalizado"],"here":["aqu\u00ed"],"Default Value":["Valor predeterminado"],"Error Message":["Mensaje de error"],"Help Text":["Texto de ayuda"],"Number Format":["Formato de n\u00famero"],"US Style (Eg: 9,999.99)":["Estilo estadounidense (Ej: 9,999.99)"],"EU Style (Eg: 9.999,99)":["Estilo UE (Ej: 9.999,99)"],"Minimum Value":["Valor m\u00ednimo"],"Maximum Value":["Valor m\u00e1ximo"],"Please check the Minimum and Maximum value":["Por favor, verifica el valor M\u00ednimo y M\u00e1ximo"],"Enable Email Confirmation":["Habilitar confirmaci\u00f3n de correo electr\u00f3nico"],"Checked by Default":["Marcado por defecto"],"Error message":["Mensaje de error"],"Checked by default":["Marcado por defecto"],"Please add a option props to MultiButtonsControl":["Por favor, a\u00f1ade una opci\u00f3n de propiedades a MultiButtonsControl"],"Icon Library":["Biblioteca de Iconos"],"Close":["Cerrar"],"All Icons":["Todos los iconos"],"Other":["Otro"],"No Icons Found":["No se encontraron iconos"],"Insert Icon":["Insertar icono"],"Change Icon":["Cambiar \u00edcono"],"Choose Icon":["Elegir \u00edcono"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Procesando\u2026"],"Select Video":["Seleccionar video"],"Change Video":["Cambiar video"],"Select Lottie Animation":["Seleccionar animaci\u00f3n Lottie"],"Change Lottie Animation":["Cambiar animaci\u00f3n Lottie"],"Upload SVG":["Subir SVG"],"Change SVG":["Cambiar SVG"],"Select Image":["Seleccionar imagen"],"Change Image":["Cambiar imagen"],"Upload SVG?":["\u00bfSubir SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Subir SVG puede ser potencialmente arriesgado. \u00bfEst\u00e1s seguro?"],"Upload Anyway":["Subir de todos modos"],"Bulk Add":["Agregar en masa"],"Bulk Add Options":["Agregar Opciones en Masa"],"Enter each option on a new line.":["Ingrese cada opci\u00f3n en una nueva l\u00ednea."],"Insert Options":["Insertar opciones"],"Full Width":["Ancho completo"],"Option Type":["Tipo de opci\u00f3n"],"Edit Options":["Opciones de edici\u00f3n"],"Add New Option":["Agregar nueva opci\u00f3n"],"ADD":["A\u00d1ADIR"],"Enable Auto Country Detection":["Habilitar la detecci\u00f3n autom\u00e1tica de pa\u00eds"],"%s Width":["Ancho %s"],"Upgrade":["Actualizar"],"Clear":["Claro"],"Select Color":["Seleccionar color"],"Primary Color":["Color primario"],"Text Color":["Color del texto"],"Field Spacing":["Espaciado de campo"],"Small":["Peque\u00f1o"],"Large":["Grande"],"Left":["Izquierda"],"Center":["Centro"],"Right":["Correcto"],"Color":["Color"],"Background Color":["Color de fondo"],"Auto":["Auto"],"Default":["Predeterminado"],"Normal":["Normal"],"%":["%"],"Top":["Superior"],"Bottom":["Fondo"],"Width":["Ancho"],"Size":["Tama\u00f1o"],"EM":["EM"],"Padding":["Relleno"],"Color 1":["Color 1"],"Color 2":["Color 2"],"Type":["Tipo"],"Linear":["Lineal"],"Radial":["Radial"],"Location 1":["Ubicaci\u00f3n 1"],"Location 2":["Ubicaci\u00f3n 2"],"Angle":["\u00c1ngulo"],"Classic":["Cl\u00e1sico"],"Gradient":["Gradiente"],"Horizontal":["Horizontal"],"Vertical":["Vertical"],"Background":["Antecedentes"],"Cover":["Cubrir"],"Contain":["Contener"],"Layout":["Dise\u00f1o"],"Overlay":["Superposici\u00f3n"],"No Repeat":["No repetir"],"Overlay Opacity":["Opacidad de superposici\u00f3n"],"Conditional Logic":["L\u00f3gica condicional"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Actualiza al Plan Starter de SureForms para crear formularios din\u00e1micos que se adaptan seg\u00fan la entrada del usuario, ofreciendo una experiencia de formulario personalizada y eficiente."],"Enable Conditional Logic":["Habilitar l\u00f3gica condicional"],"this field if":["este campo si"],"Configure Conditions":["Configurar condiciones"],"Premium":["Premium"],"Overlay Type":["Tipo de superposici\u00f3n"],"Image Overlay Color":["Color de superposici\u00f3n de imagen"],"Image Position":["Posici\u00f3n de la imagen"],"Attachment":["Adjunto"],"Fixed":["Fijo"],"Blend Mode":["Modo de fusi\u00f3n"],"Multiply":["Multiplicar"],"Screen":["Pantalla"],"Darken":["Oscurecer"],"Lighten":["Aligerar"],"Color Dodge":["Sobreexponer color"],"Saturation":["Saturaci\u00f3n"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repetir-y"],"PX":["PX"],"Button":["Bot\u00f3n"],"Prefix Label":["Etiqueta de prefijo"],"Suffix Label":["Etiqueta de sufijo"],"Border Radius":["Radio de borde"],"Form Theme":["Tema del formulario"],"Select Gradient":["Seleccionar degradado"],"Unlock Conditional Logic Editor":["Desbloquear el Editor de L\u00f3gica Condicional"],"Rich Text Editor":["Editor de texto enriquecido"],"Read Only":["Solo lectura"],"Select Country":["Seleccionar pa\u00eds"],"Default Country":["Pa\u00eds predeterminado"],"Subscription":["Suscripci\u00f3n"],"One Time":["Una vez"],"Unique Entry":["Entrada \u00danica"],"Maximum Characters":["M\u00e1ximo de caracteres"],"Textarea Height":["Altura del \u00e1rea de texto"],"Minimum Selections":["Selecciones M\u00ednimas"],"Maximum Selections":["Selecciones M\u00e1ximas"],"Add Numeric Values to Options":["Agregar valores num\u00e9ricos a las opciones"],"Single Choice Only":["Solo una opci\u00f3n"],"Enable Dropdown Search":["Habilitar b\u00fasqueda desplegable"],"Allow Multiple":["Permitir m\u00faltiples"],"%1$s fields are required. Please configure these fields in the block settings.":["Se requieren los campos %1$s. Por favor, configure estos campos en la configuraci\u00f3n del bloque."],"%1$s field is required. Please configure this field in the block settings.":["El campo %1$s es obligatorio. Por favor, configure este campo en la configuraci\u00f3n del bloque."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Necesitas configurar una cuenta de pago para recibir pagos de este formulario. Por favor, configura tu proveedor de pagos para continuar."],"Configure Payment Account":["Configurar cuenta de pago"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Este es un marcador de posici\u00f3n para el bloque de Pago. Los campos de pago reales para su(s) proveedor(es) de pago configurado(s) solo aparecer\u00e1n cuando previsualice o publique el formulario."],"2 Payments":["2 Pagos"],"3 Payments":["3 Pagos"],"4 Payments":["4 Pagos"],"5 Payments":["5 Pagos"],"Never":["Nunca"],"Stop Subscription After":["Detener suscripci\u00f3n despu\u00e9s"],"Choose when to automatically stop the subscription":["Elige cu\u00e1ndo detener autom\u00e1ticamente la suscripci\u00f3n"],"Number of Payments":["N\u00famero de pagos"],"Enter a number between 1 to 100":["Introduce un n\u00famero entre 1 y 100"],"Form Field":["Campo de formulario"],"Payment Type":["Tipo de pago"],"Subscription Plan Name":["Nombre del Plan de Suscripci\u00f3n"],"Billing Interval":["Intervalo de facturaci\u00f3n"],"Daily":["Diario"],"Weekly":["Semanal"],"Monthly":["Mensual"],"Quarterly":["Trimestral"],"Yearly":["Anual"],"Amount Type":["Tipo de Monto"],"Fixed Amount":["Cantidad Fija"],"Dynamic Amount":["Cantidad Din\u00e1mica"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Elija si desea cobrar una cantidad fija o cobrar la cantidad basada en la entrada del usuario en otros campos del formulario."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Establece la cantidad exacta que deseas cobrar. Los usuarios no podr\u00e1n cambiarla"],"Choose Amount Field":["Elegir campo de cantidad"],"Select a field\u2026":["Seleccione un campo\u2026"],"Minimum Amount":["Cantidad m\u00ednima"],"Set the minimum amount users can enter (0 for no minimum)":["Establezca la cantidad m\u00ednima que los usuarios pueden ingresar (0 para sin m\u00ednimo)"],"Customer Name Field (Required)":["Campo de Nombre del Cliente (Obligatorio)"],"Customer Name Field (Optional)":["Campo de Nombre del Cliente (Opcional)"],"Select the input field that contains the customer name (Required for subscriptions)":["Seleccione el campo de entrada que contiene el nombre del cliente (Requerido para suscripciones)"],"Select the input field that contains the customer name":["Seleccione el campo de entrada que contiene el nombre del cliente"],"Customer Email Field (Required)":["Campo de correo electr\u00f3nico del cliente (obligatorio)"],"Select the email field that contains the customer email":["Seleccione el campo de correo electr\u00f3nico que contiene el correo electr\u00f3nico del cliente"],"Payment":["Pago"],"%s - Order ID":["%s - ID de pedido"],"%s - Amount":["%s - Cantidad"],"%s - Customer Email":["%s - Correo Electr\u00f3nico del Cliente"],"%s - Customer Name":["%s - Nombre del Cliente"],"%s - Status":["%s - Estado"],"Button Alignment":["Alineaci\u00f3n del bot\u00f3n"],"Placeholder":["Marcador de posici\u00f3n"],"Preselect this option":["Preselecciona esta opci\u00f3n"],"Restrict Country Codes":["Restringir c\u00f3digos de pa\u00eds"],"Restriction Type":["Tipo de restricci\u00f3n"],"Allow":["Permitir"],"Block":["Bloque"],"Select Allowed Countries":["Seleccionar pa\u00edses permitidos"],"Choose countries\u2026":["Elige pa\u00edses\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Elija qu\u00e9 c\u00f3digos de pa\u00eds pueden seleccionar los usuarios en el campo del n\u00famero de tel\u00e9fono. Deje vac\u00edo para permitir todos los c\u00f3digos de pa\u00eds."],"Select Blocked Countries":["Seleccionar pa\u00edses bloqueados"],"These countries will be hidden from the dropdown.":["Estos pa\u00edses se ocultar\u00e1n del men\u00fa desplegable."],"Bulk Edit":["Edici\u00f3n masiva"],"Select Layout":["Seleccionar dise\u00f1o"],"Number of Columns":["N\u00famero de columnas"],"Validation Message for Duplicate":["Mensaje de validaci\u00f3n para duplicado"],"Click here to insert a form":["Haga clic aqu\u00ed para insertar un formulario"],"Inherit Form's Original Style":["Heredar el estilo original del formulario"],"Text on Primary":["Texto en Primario"],"%s - Description":["%s - Descripci\u00f3n"],"Upgrade to Unlock":["Actualiza para desbloquear"],"Custom (Premium)":["Personalizado (Premium)"],"Select a theme style for this form embed.":["Seleccione un estilo de tema para este formulario incrustado."],"Colors":["Colores"],"Advanced Styling":["Estilo Avanzado"],"Unlock Custom Styling":["Desbloquear estilo personalizado"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Cambia a Modo Personalizado para tener control total sobre el dise\u00f1o y el espaciado de tu formulario."],"Full color control (buttons, fields, text)":["Control total del color (botones, campos, texto)"],"Row and column gap control":["Control de separaci\u00f3n de filas y columnas"],"Field spacing and layout precision":["Precisi\u00f3n en el espaciado y dise\u00f1o de campos"],"Complete button styling":["Estilo completo del bot\u00f3n"],"Payment Description":["Descripci\u00f3n del pago"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Se muestra en los recibos de pago y en su panel de pagos (Stripe y PayPal). Deje en blanco para usar el valor predeterminado."],"Slug":["Babosa"],"Auto-generated on save":["Generado autom\u00e1ticamente al guardar"],"This slug is already used by another field. It will revert to the previous value.":["Este slug ya est\u00e1 siendo utilizado por otro campo. Volver\u00e1 al valor anterior."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Cambiar el slug puede romper los env\u00edos de formularios, la l\u00f3gica condicional, las integraciones o cualquier otra caracter\u00edstica que actualmente haga referencia a este slug. Necesitar\u00e1s actualizar todas esas referencias manualmente."],"Field Slug":["Identificador de campo"],"Location Services":["Servicios de ubicaci\u00f3n"],"Unlock Address Autocomplete":["Desbloquear la autocompletaci\u00f3n de direcciones"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Actualiza para habilitar la autocompletaci\u00f3n de direcciones de Google con vista previa de mapa interactivo, haciendo que la entrada de direcciones sea m\u00e1s r\u00e1pida y precisa para tus usuarios."],"Enable Google Autocomplete":["Habilitar la autocompletar de Google"],"Show Interactive Map":["Mostrar mapa interactivo"],"Payments Per Page":["Pagos por p\u00e1gina"],"Show Subscriptions Section":["Mostrar secci\u00f3n de suscripciones"],"Show a dedicated subscriptions section above payment history.":["Muestra una secci\u00f3n dedicada a suscripciones por encima del historial de pagos."],"Payment Dashboard":["Panel de Pagos"],"View your payments and manage subscriptions in a single dashboard.":["Vea sus pagos y gestione sus suscripciones en un solo panel."],"Dynamic Default Value":["Valor Predeterminado Din\u00e1mico"],"Minimum Characters":["Caracteres m\u00ednimos"],"Minimum characters cannot exceed Maximum characters.":["Los caracteres m\u00ednimos no pueden exceder los caracteres m\u00e1ximos."],"Both":["Ambos"],"One-Time Label":["Etiqueta de un solo uso"],"Label shown to users for the one-time payment option.":["Etiqueta mostrada a los usuarios para la opci\u00f3n de pago \u00fanico."],"Subscription Label":["Etiqueta de suscripci\u00f3n"],"Label shown to users for the subscription option.":["Etiqueta mostrada a los usuarios para la opci\u00f3n de suscripci\u00f3n."],"Default Selection":["Selecci\u00f3n predeterminada"],"Which option is pre-selected when the form loads.":["\u00bfQu\u00e9 opci\u00f3n est\u00e1 preseleccionada cuando se carga el formulario?"],"One-Time Amount Type":["Tipo de Monto \u00danico"],"Set how the one-time payment amount is determined.":["Establezca c\u00f3mo se determina el monto del pago \u00fanico."],"One-Time Fixed Amount":["Monto fijo \u00fanico"],"Amount charged for a one-time payment.":["Cantidad cobrada por un pago \u00fanico."],"One-Time Amount Field":["Campo de Monto \u00danico"],"Pick a form field whose value determines the one-time payment amount.":["Elija un campo de formulario cuyo valor determine el monto del pago \u00fanico."],"One-Time Minimum Amount":["Monto m\u00ednimo \u00fanico"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Monto m\u00ednimo que los usuarios pueden ingresar para un pago \u00fanico (0 para sin m\u00ednimo)."],"Subscription Amount Type":["Tipo de Monto de Suscripci\u00f3n"],"Set how the subscription amount is determined.":["Establezca c\u00f3mo se determina el monto de la suscripci\u00f3n."],"Subscription Fixed Amount":["Monto fijo de suscripci\u00f3n"],"Recurring amount charged per billing interval.":["Monto recurrente cobrado por intervalo de facturaci\u00f3n."],"Subscription Amount Field":["Campo de Monto de Suscripci\u00f3n"],"Pick a form field whose value determines the subscription amount.":["Elija un campo de formulario cuyo valor determine el monto de la suscripci\u00f3n."],"Subscription Minimum Amount":["Monto M\u00ednimo de Suscripci\u00f3n"],"Minimum amount users can enter for subscription (0 for no minimum).":["Cantidad m\u00ednima que los usuarios pueden ingresar para la suscripci\u00f3n (0 para sin m\u00ednimo)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Elige un campo de tu formulario como un n\u00famero, un desplegable, una opci\u00f3n m\u00faltiple o un campo oculto cuyo valor deba determinar el monto del pago."],"Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.":["Utiliza una etiqueta inteligente como {get_input:country}. La primera opci\u00f3n cuyo t\u00edtulo coincida con el valor resuelto se preseleccionar\u00e1."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.":["Utiliza una etiqueta inteligente como {get_input:colors} y pasa valores separados por barras verticales en la URL (por ejemplo, ?colors=Red|Blue). Cada opci\u00f3n cuyo t\u00edtulo coincida con un valor ser\u00e1 seleccionada. Tambi\u00e9n puedes encadenar m\u00faltiples etiquetas inteligentes separadas por barras verticales."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.":["Utiliza una etiqueta inteligente como {get_input:colors} y pasa valores separados por barras verticales en la URL (por ejemplo, ?colors=Red|Blue). Cada opci\u00f3n cuya etiqueta coincida con un valor ser\u00e1 preseleccionada. Tambi\u00e9n puedes encadenar m\u00faltiples etiquetas inteligentes separadas por barras verticales."],"Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.":["Utiliza una etiqueta inteligente como {get_input:country}. La primera opci\u00f3n cuyo etiqueta coincida con el valor resuelto ser\u00e1 preseleccionada."]}}} \ No newline at end of file diff --git a/languages/sureforms-es_ES-51635fe6489fc8288d603fe596c755ca.json b/languages/sureforms-es_ES-51635fe6489fc8288d603fe596c755ca.json index f9aa74480..240d15861 100644 --- a/languages/sureforms-es_ES-51635fe6489fc8288d603fe596c755ca.json +++ b/languages/sureforms-es_ES-51635fe6489fc8288d603fe596c755ca.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tablero"],"Settings":["Configuraciones"],"Entries":["Entradas"],"Activated":["Activado"],"Activate":["Activar"],"Monday":["Lunes"],"Forms":["Formularios"],"GitHub":["GitHub"],"General":["General"],"Other":["Otro"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["La instalaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Plugin activation failed, Please try again later.":["La activaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Integrations":["Integraciones"],"What's New?":["\u00bfQu\u00e9 hay de nuevo?"],"Core":["N\u00facleo"],"Unlicensed":["Sin licencia"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar y activar"],"Send Email To":["Enviar correo electr\u00f3nico a"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validaciones"],"Spam Protection":["Protecci\u00f3n contra el spam"],"Email Summaries":["Res\u00famenes de correo electr\u00f3nico"],"Tuesday":["Martes"],"Wednesday":["Mi\u00e9rcoles"],"Thursday":["Jueves"],"Friday":["Viernes"],"Saturday":["S\u00e1bado"],"Sunday":["Domingo"],"Test Email":["Correo de prueba"],"Schedule Reports":["Programar informes"],"IP Logging":["Registro de IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Si esta opci\u00f3n est\u00e1 activada, la direcci\u00f3n IP del usuario se guardar\u00e1 con los datos del formulario"],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s representa las selecciones m\u00ednimas necesarias. Por ejemplo: \u201cSe requieren un m\u00ednimo de 2 selecciones.\u201d"],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s representa el m\u00e1ximo de selecciones permitidas. Por ejemplo: \u201cSe permiten un m\u00e1ximo de 4 selecciones.\u201d"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s representa las opciones m\u00ednimas necesarias. Por ejemplo: \"Se requiere un m\u00ednimo de 1 selecci\u00f3n.\""],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s representa las opciones m\u00e1ximas permitidas. Por ejemplo: \"Se permiten un m\u00e1ximo de 3 selecciones.\""]," Error Message":["Mensaje de error"],"Auto":["Auto"],"Light":["Luz"],"Dark":["Oscuro"],"Turnstile":["Torniquete"],"Honeypot":["Honeypot"],"Get Keys":["Obtener llaves"],"Documentation":["Documentaci\u00f3n"],"Site Key":["Clave del sitio"],"Secret Key":["Clave secreta"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Modo de apariencia"],"Enable Honeypot Security":["Habilitar la seguridad Honeypot"],"Enable Honeypot Security for better spam protection":["Habilitar la seguridad Honeypot para una mejor protecci\u00f3n contra el spam"],"This field cannot be left blank.":["Este campo no puede dejarse en blanco."],"Confirmation Email Mismatch Message":["Mensaje de discrepancia de correo electr\u00f3nico de confirmaci\u00f3n"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s representa el valor m\u00ednimo de entrada. Por ejemplo: \"El valor m\u00ednimo es 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s representa el valor m\u00e1ximo de entrada. Por ejemplo: \"El valor m\u00e1ximo es 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Con\u00e9ctate con OttoKit"],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["\u00bfListo para ir m\u00e1s all\u00e1 del plan gratuito?"],"Upgrade now":["Actualiza ahora"],"and unlock the full power of SureForms!":["y desbloquea todo el poder de SureForms!"],"Upgrade SureForms":["Actualizar SureForms"],"Upgrade Now":["Actualiza ahora"],"Form Validation":["Validaci\u00f3n de formulario"],"Required Error Messages":["Mensajes de error requeridos"],"Other Error Messages":["Otros mensajes de error"],"Input Field Unique":["Campo de entrada \u00fanico"],"Email Field Unique":["Campo de correo electr\u00f3nico \u00fanico"],"Invalid URL":["URL no v\u00e1lida"],"Phone Field Unique":["Campo de Tel\u00e9fono \u00danico"],"Invalid Field Number Block":["Bloque de N\u00famero de Campo Inv\u00e1lido"],"Invalid Email":["Correo electr\u00f3nico no v\u00e1lido"],"Number Minimum Value":["Valor M\u00ednimo del N\u00famero"],"Number Maximum Value":["Valor M\u00e1ximo del N\u00famero"],"Dropdown Minimum Selections":["M\u00ednimo de selecciones en el men\u00fa desplegable"],"Dropdown Maximum Selections":["Selecciones M\u00e1ximas del Desplegable"],"Multiple Choice Minimum Selections":["M\u00faltiples opciones de selecci\u00f3n m\u00ednima"],"Multiple Choice Maximum Selections":["Selecciones M\u00faltiples de Opci\u00f3n M\u00faltiple"],"Input Field":["Campo de entrada"],"Email Field":["Campo de correo electr\u00f3nico"],"URL Field":["Campo de URL"],"Phone Field":["Campo de Tel\u00e9fono"],"Textarea Field":["Campo de \u00e1rea de texto"],"Checkbox Field":["Campo de casilla de verificaci\u00f3n"],"Dropdown Field":["Campo desplegable"],"Multiple Choice Field":["Campo de opci\u00f3n m\u00faltiple"],"Address Field":["Campo de direcci\u00f3n"],"Number Field":["Campo num\u00e9rico"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Para habilitar la funci\u00f3n reCAPTCHA en sus SureForms, por favor habilite la opci\u00f3n reCAPTCHA en la configuraci\u00f3n de sus bloques y seleccione la versi\u00f3n. Agregue aqu\u00ed la clave secreta y la clave del sitio de Google reCAPTCHA. reCAPTCHA se a\u00f1adir\u00e1 a su p\u00e1gina en el front-end."],"Enter your %s here":["Introduce tu %s aqu\u00ed"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Para habilitar hCAPTCHA, por favor a\u00f1ade tu clave del sitio y clave secreta. Configura estos ajustes dentro del formulario individual."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Para habilitar Cloudflare Turnstile, por favor a\u00f1ade tu clave de sitio y clave secreta. Configura estos ajustes dentro del formulario individual."],"Save":["Guardar"],"Anonymous Analytics":["Anal\u00edtica An\u00f3nima"],"Learn More":["Aprende m\u00e1s"],"Admin Notification":["Notificaci\u00f3n de administrador"],"Enable Admin Notification":["Habilitar notificaci\u00f3n de administrador"],"Admin notifications keep you informed about new form entries since your last visit.":["Las notificaciones de administrador te mantienen informado sobre nuevas entradas de formularios desde tu \u00faltima visita."],"Continue":["Continuar"],"Get Started":["Comenzar"],"Integration":["Integraci\u00f3n"],"Connect Native Integrations with SureForms":["Conecta integraciones nativas con SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Desbloquea potentes integraciones en el plan Premium para automatizar tus flujos de trabajo y conectar SureForms directamente con tus herramientas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms":["Env\u00eda las presentaciones de formularios directamente a los CRM, correo electr\u00f3nico y plataformas de marketing"],"Automate repetitive tasks with seamless data syncing":["Automatiza tareas repetitivas con una sincronizaci\u00f3n de datos sin problemas"],"Access exclusive native integrations for faster workflows":["Accede a integraciones nativas exclusivas para flujos de trabajo m\u00e1s r\u00e1pidos"],"Payments":["Pagos"],"Stripe account disconnected successfully.":["Cuenta de Stripe desconectada con \u00e9xito."],"Failed to create webhook.":["Error al crear el webhook."],"Failed to connect to Stripe.":["Error al conectar con Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Base de Conocimientos"],"What\u2019s New":["Qu\u00e9 hay de nuevo"],"delete":["eliminar"],"Please type \"%s\" in the input box":["Por favor, escribe \"%s\" en el cuadro de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, escriba \"%s\" en el cuadro de abajo:"],"Type \"%s\"":["Escribe \"%s\""],"Go to OttoKit Settings":["Ve a la configuraci\u00f3n de OttoKit"],"USD - US Dollar":["USD - D\u00f3lar estadounidense"],"Payment Mode":["Modo de pago"],"Test Mode":["Modo de prueba"],"Live Mode":["Modo en vivo"],"General Settings":["Configuraci\u00f3n general"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Configure res\u00famenes de correo electr\u00f3nico, alertas de administrador y preferencias de datos para gestionar tus formularios con facilidad."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personaliza los mensajes de error predeterminados que se muestran cuando los usuarios env\u00edan entradas de formulario inv\u00e1lidas o incompletas."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Habilita la protecci\u00f3n contra spam para tus formularios utilizando servicios CAPTCHA o seguridad honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Conecta y gestiona tus pasarelas de pago para aceptar transacciones de forma segura a trav\u00e9s de tus formularios."],"1% transaction and payment gateway fees apply.":["Se aplican tarifas del 1% por transacciones y pasarelas de pago."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Se aplican tarifas de transacci\u00f3n y de pasarela de pago del 2.9%. Activa la licencia para reducir las tarifas de transacci\u00f3n."],"2.9% transaction and payment gateway fees apply.":["Se aplican tarifas del 2.9% por transacciones y pasarelas de pago."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Por favor, visita %1$s, elimina un webhook no utilizado, luego haz clic abajo para reintentar."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms no pudo crear un webhook porque tu cuenta de Stripe se ha quedado sin espacios libres. Los webhooks son necesarios para recibir actualizaciones sobre los pagos."],"Stripe Dashboard":["Panel de control de Stripe"],"Creating\u2026":["Creando\u2026"],"Create Webhook":["Crear Webhook"],"Successfully connected to Stripe!":["\u00a1Conectado exitosamente a Stripe!"],"Invalid response from server. Please try again.":["Respuesta inv\u00e1lida del servidor. Por favor, int\u00e9ntelo de nuevo."],"Failed to disconnect Stripe account.":["Error al desconectar la cuenta de Stripe."],"Webhook created successfully!":["\u00a1Webhook creado con \u00e9xito!"],"Select Currency":["Seleccionar moneda"],"Select the default currency for payment forms.":["Seleccione la moneda predeterminada para los formularios de pago."],"Connection Status":["Estado de la conexi\u00f3n"],"Disconnect Stripe Account":["Desconectar cuenta de Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["\u00bfEst\u00e1 seguro de que desea desconectar su cuenta de Stripe? Esto detendr\u00e1 todos los pagos activos, suscripciones y transacciones de formularios conectados a esta cuenta."],"Disconnect":["Desconectar"],"Disconnecting\u2026":["Desconectando\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook conectado con \u00e9xito, todos los eventos de Stripe est\u00e1n siendo rastreados."],"Connect your Stripe account to start accepting payments through your forms.":["Conecta tu cuenta de Stripe para comenzar a aceptar pagos a trav\u00e9s de tus formularios."],"Connect to Stripe":["Conectar a Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Con\u00e9ctate de forma segura a Stripe con solo unos clics para comenzar a aceptar pagos."],"Payment Methods":["M\u00e9todos de pago"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["El modo de prueba te permite procesar pagos sin cargos reales. Cambia al modo en vivo para transacciones reales."],"General Payment Settings":["Configuraci\u00f3n General de Pagos"],"These settings apply to all payment gateways.":["Estos ajustes se aplican a todas las pasarelas de pago."],"Stripe Settings":["Configuraci\u00f3n de Stripe"],"Left ($100)":["Izquierda ($100)"],"Right (100$)":["Correcto (100$)"],"Left Space ($ 100)":["Espacio Izquierdo ($ 100)"],"Right Space (100 $)":["Espacio Derecho (100 $)"],"Currency Sign Position":["Posici\u00f3n del signo de moneda"],"Select the position of the currency symbol relative to the amount.":["Seleccione la posici\u00f3n del s\u00edmbolo de moneda en relaci\u00f3n con la cantidad."],"Learn":["Aprender"],"Enable email summaries":["Habilitar res\u00famenes de correo electr\u00f3nico"],"Enable IP logging":["Habilitar el registro de IP"],"Turn on Admin Notification from here.":["Activa la notificaci\u00f3n de administrador desde aqu\u00ed."],"Send entries to 100+ popular apps.":["Env\u00eda entradas a m\u00e1s de 100 aplicaciones populares."],"Build automated workflows that run instantly.":["Crea flujos de trabajo automatizados que se ejecutan al instante."],"Create custom app integrations using our Custom App feature.":["Crea integraciones de aplicaciones personalizadas utilizando nuestra funci\u00f3n de Aplicaci\u00f3n Personalizada."],"Keep your tools in sync automatically.":["Mant\u00e9n tus herramientas sincronizadas autom\u00e1ticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Esto instalar\u00e1 y activar\u00e1 OttoKit en su sitio de WordPress para habilitar funciones de automatizaci\u00f3n."],"Automate Your Forms with OttoKit":["Automatiza tus formularios con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada env\u00edo de formulario deber\u00eda activar algo: una alerta de Slack, un cliente potencial en el CRM, un correo electr\u00f3nico de seguimiento o una nueva fila en Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configura los permisos del cliente de IA y la configuraci\u00f3n del servidor MCP."],"View documentation":["Ver documentaci\u00f3n"],"Copy to clipboard":["Copiar al portapapeles"],"Claude Desktop":["Escritorio Claude"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) o %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["C\u00f3digo Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (proyecto) o ~\/.claude.json (global)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (proyecto) o settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml o config.json"],"Your client's MCP configuration file":["El archivo de configuraci\u00f3n MCP de su cliente"],"Connect Your AI Client":["Conecta tu cliente de IA"],"AI Client":["Cliente de IA"],"Create an Application Password \u2014 ":["Crear una Contrase\u00f1a de Aplicaci\u00f3n \u2014"],"Open Application Passwords":["Abrir contrase\u00f1as de aplicaciones"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["O utiliza este comando CLI para a\u00f1adir el servidor r\u00e1pidamente (a\u00fan necesitar\u00e1s configurar las variables de entorno):"],"Copy the JSON config below into: ":["Copie la configuraci\u00f3n JSON a continuaci\u00f3n en:"],"Replace \"your-application-password\" with the password from Step 1.":["Reemplace \"your-application-password\" con la contrase\u00f1a del Paso 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 el punto final MCP de tu sitio. WP_API_USERNAME \u2014 tu nombre de usuario de WordPress. WP_API_PASSWORD \u2014 la contrase\u00f1a de la aplicaci\u00f3n que generaste."],"View setup docs":["Ver documentos de configuraci\u00f3n"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["El complemento MCP Adapter est\u00e1 instalado pero no activo. Act\u00edvalo para configurar los ajustes de MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["El complemento MCP Adapter es necesario para conectar clientes de IA a tus formularios. Desc\u00e1rgalo e inst\u00e1lalo desde GitHub, luego act\u00edvalo."],"Download the latest release from":["Descarga la \u00faltima versi\u00f3n desde"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Instala el complemento a trav\u00e9s de Complementos > A\u00f1adir nuevo complemento > Subir complemento."],"Activate the MCP Adapter plugin.":["Activa el complemento del adaptador MCP."],"Activating\u2026":["Activando\u2026"],"Activate MCP Adapter":["Activar adaptador MCP"],"Download MCP Adapter":["Descargar el adaptador MCP"],"Experimental":["Experimental"],"Enable Abilities":["Habilitar habilidades"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registra las habilidades de SureForms con la API de Habilidades de WordPress. Cuando est\u00e1 habilitado, los clientes de IA pueden listar, leer, crear, editar y eliminar tus formularios y entradas. Cuando est\u00e1 deshabilitado, no se registran habilidades y los clientes de IA no pueden realizar ninguna acci\u00f3n en tus formularios."],"Abilities API \u2014 Edit":["API de habilidades \u2014 Editar"],"Enable Edit Abilities":["Habilitar habilidades de edici\u00f3n"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Cuando est\u00e1 habilitado, los clientes de IA pueden crear nuevos formularios, actualizar t\u00edtulos de formularios, campos y configuraciones, duplicar formularios y modificar los estados de las entradas. Cuando est\u00e1 deshabilitado, estas habilidades se desregistran y los clientes de IA solo pueden leer sus datos."],"Abilities API \u2014 Delete":["API de habilidades \u2014 Eliminar"],"Enable Delete Abilities":["Habilitar habilidades de eliminaci\u00f3n"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Cuando est\u00e1 habilitado, los clientes de IA pueden eliminar permanentemente formularios y entradas. Los datos eliminados no se pueden recuperar. Cuando est\u00e1 deshabilitado, las capacidades de eliminaci\u00f3n se desregistran y los clientes de IA no pueden eliminar ning\u00fan dato."],"MCP Server":["Servidor MCP"],"Enable MCP Server":["Habilitar servidor MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Crea un punto final dedicado de SureForms MCP al que los clientes de IA como Claude pueden conectarse. Cuando est\u00e1 deshabilitado, el punto final se elimina y los clientes de IA externos no pueden descubrir ni llamar a ninguna capacidad de SureForms."],"Learn more":["Aprende m\u00e1s"],"MCP Adapter Required":["Adaptador MCP Requerido"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configura la clave de la API de Google Maps para la autocompletaci\u00f3n de direcciones y la vista previa del mapa."],"Help shape the future of SureForms":["Ayuda a dar forma al futuro de SureForms"],"Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ":["Comparte c\u00f3mo usas el complemento para que podamos desarrollar funciones que importen, solucionar problemas m\u00e1s r\u00e1pido y tomar decisiones m\u00e1s inteligentes."],"Enable Google Address Autocomplete":["Habilitar la autocompletar de direcciones de Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Actualiza al Plan de Negocios de SureForms para agregar la autocompletaci\u00f3n de direcciones impulsada por Google con vista previa de mapa interactivo a tus formularios."],"Auto-suggest addresses as users type for faster, error-free submissions":["Sugerir direcciones autom\u00e1ticamente mientras los usuarios escriben para env\u00edos m\u00e1s r\u00e1pidos y sin errores"],"Show an interactive map preview with draggable pin for precise locations":["Muestra una vista previa de mapa interactivo con un marcador arrastrable para ubicaciones precisas"],"Automatically populate address fields like city, state, and postal code":["Rellenar autom\u00e1ticamente campos de direcci\u00f3n como ciudad, estado y c\u00f3digo postal"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tablero"],"Settings":["Configuraciones"],"Entries":["Entradas"],"Activated":["Activado"],"Activate":["Activar"],"Monday":["Lunes"],"Forms":["Formularios"],"New Form Submission - %s":["Nueva presentaci\u00f3n de formulario - %s"],"GitHub":["GitHub"],"(no title)":["(sin t\u00edtulo)"],"General":["General"],"No tags available":["No hay etiquetas disponibles"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Other":["Otro"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["La instalaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Plugin activation failed, Please try again later.":["La activaci\u00f3n del complemento fall\u00f3, por favor intente de nuevo m\u00e1s tarde."],"Integrations":["Integraciones"],"What's New?":["\u00bfQu\u00e9 hay de nuevo?"],"Core":["N\u00facleo"],"Unlicensed":["Sin licencia"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar y activar"],"Compliance Settings":["Configuraci\u00f3n de Cumplimiento"],"Enable GDPR Compliance":["Habilitar el cumplimiento del RGPD"],"Never store entry data after form submission":["Nunca almacenes los datos de entrada despu\u00e9s de enviar el formulario"],"When enabled this form will never store Entries.":["Cuando est\u00e9 habilitado, este formulario nunca almacenar\u00e1 entradas."],"Automatically delete entries":["Eliminar autom\u00e1ticamente las entradas"],"When enabled this form will automatically delete entries after a certain period of time.":["Cuando est\u00e9 habilitado, este formulario eliminar\u00e1 autom\u00e1ticamente las entradas despu\u00e9s de un cierto per\u00edodo de tiempo."],"Entries older than the days set will be deleted automatically.":["Las entradas m\u00e1s antiguas que los d\u00edas establecidos se eliminar\u00e1n autom\u00e1ticamente."],"Visual":["Visual"],"HTML":["HTML"],"All Data":["Todos los datos"],"Add Shortcode":["Agregar c\u00f3digo corto"],"Form input tags":["Etiquetas de entrada de formulario"],"Comma separated values are also accepted.":["Tambi\u00e9n se aceptan valores separados por comas."],"Email Notification":["Notificaci\u00f3n de correo electr\u00f3nico"],"Name":["Nombre"],"Send Email To":["Enviar correo electr\u00f3nico a"],"Subject":["Asunto"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Responder a"],"Add Key":["Agregar clave"],"Add Value":["A\u00f1adir valor"],"Add":["A\u00f1adir"],"Confirmation Message":["Mensaje de confirmaci\u00f3n"],"After Form Submission":["Despu\u00e9s del env\u00edo del formulario"],"Hide Form":["Ocultar formulario"],"Reset Form":["Restablecer formulario"],"Custom URL":["URL personalizada"],"Add Query Parameters":["Agregar par\u00e1metros de consulta"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Seleccione si desea agregar pares clave-valor para los campos del formulario que se incluir\u00e1n en los par\u00e1metros de consulta"],"Query Parameters":["Par\u00e1metros de consulta"],"Success Message":["Mensaje de \u00e9xito"],"Redirect":["Redirigir"],"Redirect to":["Redirigir a"],"Page":["P\u00e1gina"],"Form Confirmation":["Confirmaci\u00f3n de formulario"],"Confirmation Type":["Tipo de confirmaci\u00f3n"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validaciones"],"Spam Protection":["Protecci\u00f3n contra el spam"],"Email Summaries":["Res\u00famenes de correo electr\u00f3nico"],"Tuesday":["Martes"],"Wednesday":["Mi\u00e9rcoles"],"Thursday":["Jueves"],"Friday":["Viernes"],"Saturday":["S\u00e1bado"],"Sunday":["Domingo"],"Test Email":["Correo de prueba"],"Schedule Reports":["Programar informes"],"IP Logging":["Registro de IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Si esta opci\u00f3n est\u00e1 activada, la direcci\u00f3n IP del usuario se guardar\u00e1 con los datos del formulario"],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s representa las selecciones m\u00ednimas necesarias. Por ejemplo: \u201cSe requieren un m\u00ednimo de 2 selecciones.\u201d"],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s representa el m\u00e1ximo de selecciones permitidas. Por ejemplo: \u201cSe permiten un m\u00e1ximo de 4 selecciones.\u201d"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s representa las opciones m\u00ednimas necesarias. Por ejemplo: \"Se requiere un m\u00ednimo de 1 selecci\u00f3n.\""],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s representa las opciones m\u00e1ximas permitidas. Por ejemplo: \"Se permiten un m\u00e1ximo de 3 selecciones.\""]," Error Message":["Mensaje de error"],"Auto":["Auto"],"Light":["Luz"],"Dark":["Oscuro"],"Turnstile":["Torniquete"],"Honeypot":["Honeypot"],"Get Keys":["Obtener llaves"],"Documentation":["Documentaci\u00f3n"],"Site Key":["Clave del sitio"],"Secret Key":["Clave secreta"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Modo de apariencia"],"Enable Honeypot Security":["Habilitar la seguridad Honeypot"],"Enable Honeypot Security for better spam protection":["Habilitar la seguridad Honeypot para una mejor protecci\u00f3n contra el spam"],"Confirmation Email Mismatch Message":["Mensaje de discrepancia de correo electr\u00f3nico de confirmaci\u00f3n"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s representa el valor m\u00ednimo de entrada. Por ejemplo: \"El valor m\u00ednimo es 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s representa el valor m\u00e1ximo de entrada. Por ejemplo: \"El valor m\u00e1ximo es 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Con\u00e9ctate con OttoKit"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam. Alternativamente, intente usar una direcci\u00f3n de remitente que coincida con el dominio de su sitio web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam."],"We strongly recommend that you install the free ":["Recomendamos encarecidamente que instale el gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["\u00a1Complemento! El asistente de configuraci\u00f3n facilita la correcci\u00f3n de tus correos electr\u00f3nicos."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativamente, intenta usar una direcci\u00f3n de remitente que coincida con el dominio de tu sitio web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Por favor, introduce una direcci\u00f3n de correo electr\u00f3nico v\u00e1lida. Tus notificaciones no se enviar\u00e1n si el campo no est\u00e1 rellenado correctamente."],"From Name":["De Nombre"],"From Email":["De correo electr\u00f3nico"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam. Alternativamente, intente usar una Direcci\u00f3n del Remitente que coincida con el dominio de su sitio web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["La direcci\u00f3n de 'Correo Electr\u00f3nico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electr\u00f3nicos de notificaci\u00f3n sean bloqueados o marcados como spam."],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["\u00bfListo para ir m\u00e1s all\u00e1 del plan gratuito?"],"Upgrade now":["Actualiza ahora"],"and unlock the full power of SureForms!":["y desbloquea todo el poder de SureForms!"],"Upgrade SureForms":["Actualizar SureForms"],"Upgrade Now":["Actualiza ahora"],"Entries older than the selected days will be deleted.":["Las entradas anteriores a los d\u00edas seleccionados ser\u00e1n eliminadas."],"Entries Time Period":["Per\u00edodo de tiempo de las entradas"],"Notifications can use only one From Email so please enter a single address.":["Las notificaciones solo pueden usar un \u00fanico correo electr\u00f3nico de origen, as\u00ed que por favor ingrese una sola direcci\u00f3n."],"Select Page to redirect":["Seleccionar p\u00e1gina para redirigir"],"Search for a page":["Buscar una p\u00e1gina"],"Select a page":["Selecciona una p\u00e1gina"],"Form Validation":["Validaci\u00f3n de formulario"],"Required Error Messages":["Mensajes de error requeridos"],"Other Error Messages":["Otros mensajes de error"],"Input Field Unique":["Campo de entrada \u00fanico"],"Email Field Unique":["Campo de correo electr\u00f3nico \u00fanico"],"Invalid URL":["URL no v\u00e1lida"],"Phone Field Unique":["Campo de Tel\u00e9fono \u00danico"],"Invalid Field Number Block":["Bloque de N\u00famero de Campo Inv\u00e1lido"],"Invalid Email":["Correo electr\u00f3nico no v\u00e1lido"],"Number Minimum Value":["Valor M\u00ednimo del N\u00famero"],"Number Maximum Value":["Valor M\u00e1ximo del N\u00famero"],"Dropdown Minimum Selections":["M\u00ednimo de selecciones en el men\u00fa desplegable"],"Dropdown Maximum Selections":["Selecciones M\u00e1ximas del Desplegable"],"Multiple Choice Minimum Selections":["M\u00faltiples opciones de selecci\u00f3n m\u00ednima"],"Multiple Choice Maximum Selections":["Selecciones M\u00faltiples de Opci\u00f3n M\u00faltiple"],"Input Field":["Campo de entrada"],"Email Field":["Campo de correo electr\u00f3nico"],"URL Field":["Campo de URL"],"Phone Field":["Campo de Tel\u00e9fono"],"Textarea Field":["Campo de \u00e1rea de texto"],"Checkbox Field":["Campo de casilla de verificaci\u00f3n"],"Dropdown Field":["Campo desplegable"],"Multiple Choice Field":["Campo de opci\u00f3n m\u00faltiple"],"Address Field":["Campo de direcci\u00f3n"],"Number Field":["Campo num\u00e9rico"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Para habilitar la funci\u00f3n reCAPTCHA en sus SureForms, por favor habilite la opci\u00f3n reCAPTCHA en la configuraci\u00f3n de sus bloques y seleccione la versi\u00f3n. Agregue aqu\u00ed la clave secreta y la clave del sitio de Google reCAPTCHA. reCAPTCHA se a\u00f1adir\u00e1 a su p\u00e1gina en el front-end."],"Enter your %s here":["Introduce tu %s aqu\u00ed"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Para habilitar hCAPTCHA, por favor a\u00f1ade tu clave del sitio y clave secreta. Configura estos ajustes dentro del formulario individual."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Para habilitar Cloudflare Turnstile, por favor a\u00f1ade tu clave de sitio y clave secreta. Configura estos ajustes dentro del formulario individual."],"Save":["Guardar"],"Anonymous Analytics":["Anal\u00edtica An\u00f3nima"],"Learn More":["Aprende m\u00e1s"],"Admin Notification":["Notificaci\u00f3n de administrador"],"Enable Admin Notification":["Habilitar notificaci\u00f3n de administrador"],"Admin notifications keep you informed about new form entries since your last visit.":["Las notificaciones de administrador te mantienen informado sobre nuevas entradas de formularios desde tu \u00faltima visita."],"Continue":["Continuar"],"Maximum Number of Entries":["N\u00famero m\u00e1ximo de entradas"],"Maximum Entries":["Entradas M\u00e1ximas"],"Response Description After Maximum Entries":["Descripci\u00f3n de la respuesta despu\u00e9s del m\u00e1ximo de entradas"],"Get Started":["Comenzar"],"Integration":["Integraci\u00f3n"],"Connect Native Integrations with SureForms":["Conecta integraciones nativas con SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Desbloquea potentes integraciones en el plan Premium para automatizar tus flujos de trabajo y conectar SureForms directamente con tus herramientas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms":["Env\u00eda las presentaciones de formularios directamente a los CRM, correo electr\u00f3nico y plataformas de marketing"],"Automate repetitive tasks with seamless data syncing":["Automatiza tareas repetitivas con una sincronizaci\u00f3n de datos sin problemas"],"Access exclusive native integrations for faster workflows":["Accede a integraciones nativas exclusivas para flujos de trabajo m\u00e1s r\u00e1pidos"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato esperado para correos electr\u00f3nicos: email@sureforms.com o John Doe "],"Payments":["Pagos"],"Stripe account disconnected successfully.":["Cuenta de Stripe desconectada con \u00e9xito."],"Failed to create webhook.":["Error al crear el webhook."],"Failed to connect to Stripe.":["Error al conectar con Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Base de Conocimientos"],"What\u2019s New":["Qu\u00e9 hay de nuevo"],"delete":["eliminar"],"Please type \"%s\" in the input box":["Por favor, escribe \"%s\" en el cuadro de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, escriba \"%s\" en el cuadro de abajo:"],"Type \"%s\"":["Escribe \"%s\""],"Go to OttoKit Settings":["Ve a la configuraci\u00f3n de OttoKit"],"USD - US Dollar":["USD - D\u00f3lar estadounidense"],"Payment Mode":["Modo de pago"],"Test Mode":["Modo de prueba"],"Live Mode":["Modo en vivo"],"General Settings":["Configuraci\u00f3n general"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Configure res\u00famenes de correo electr\u00f3nico, alertas de administrador y preferencias de datos para gestionar tus formularios con facilidad."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personaliza los mensajes de error predeterminados que se muestran cuando los usuarios env\u00edan entradas de formulario inv\u00e1lidas o incompletas."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Habilita la protecci\u00f3n contra spam para tus formularios utilizando servicios CAPTCHA o seguridad honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Conecta y gestiona tus pasarelas de pago para aceptar transacciones de forma segura a trav\u00e9s de tus formularios."],"1% transaction and payment gateway fees apply.":["Se aplican tarifas del 1% por transacciones y pasarelas de pago."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Se aplican tarifas de transacci\u00f3n y de pasarela de pago del 2.9%. Activa la licencia para reducir las tarifas de transacci\u00f3n."],"2.9% transaction and payment gateway fees apply.":["Se aplican tarifas del 2.9% por transacciones y pasarelas de pago."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Por favor, visita %1$s, elimina un webhook no utilizado, luego haz clic abajo para reintentar."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms no pudo crear un webhook porque tu cuenta de Stripe se ha quedado sin espacios libres. Los webhooks son necesarios para recibir actualizaciones sobre los pagos."],"Stripe Dashboard":["Panel de control de Stripe"],"Creating\u2026":["Creando\u2026"],"Create Webhook":["Crear Webhook"],"Successfully connected to Stripe!":["\u00a1Conectado exitosamente a Stripe!"],"Invalid response from server. Please try again.":["Respuesta inv\u00e1lida del servidor. Por favor, int\u00e9ntelo de nuevo."],"Failed to disconnect Stripe account.":["Error al desconectar la cuenta de Stripe."],"Webhook created successfully!":["\u00a1Webhook creado con \u00e9xito!"],"Select Currency":["Seleccionar moneda"],"Select the default currency for payment forms.":["Seleccione la moneda predeterminada para los formularios de pago."],"Connection Status":["Estado de la conexi\u00f3n"],"Disconnect Stripe Account":["Desconectar cuenta de Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["\u00bfEst\u00e1 seguro de que desea desconectar su cuenta de Stripe? Esto detendr\u00e1 todos los pagos activos, suscripciones y transacciones de formularios conectados a esta cuenta."],"Disconnect":["Desconectar"],"Disconnecting\u2026":["Desconectando\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook conectado con \u00e9xito, todos los eventos de Stripe est\u00e1n siendo rastreados."],"Connect your Stripe account to start accepting payments through your forms.":["Conecta tu cuenta de Stripe para comenzar a aceptar pagos a trav\u00e9s de tus formularios."],"Connect to Stripe":["Conectar a Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Con\u00e9ctate de forma segura a Stripe con solo unos clics para comenzar a aceptar pagos."],"Set the total number of submissions allowed for this form.":["Establezca el n\u00famero total de env\u00edos permitidos para este formulario."],"Payment Methods":["M\u00e9todos de pago"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["El modo de prueba te permite procesar pagos sin cargos reales. Cambia al modo en vivo para transacciones reales."],"General Payment Settings":["Configuraci\u00f3n General de Pagos"],"These settings apply to all payment gateways.":["Estos ajustes se aplican a todas las pasarelas de pago."],"Stripe Settings":["Configuraci\u00f3n de Stripe"],"Left ($100)":["Izquierda ($100)"],"Right (100$)":["Correcto (100$)"],"Left Space ($ 100)":["Espacio Izquierdo ($ 100)"],"Right Space (100 $)":["Espacio Derecho (100 $)"],"Currency Sign Position":["Posici\u00f3n del signo de moneda"],"Select the position of the currency symbol relative to the amount.":["Seleccione la posici\u00f3n del s\u00edmbolo de moneda en relaci\u00f3n con la cantidad."],"Learn":["Aprender"],"Enable email summaries":["Habilitar res\u00famenes de correo electr\u00f3nico"],"Enable IP logging":["Habilitar el registro de IP"],"Turn on Admin Notification from here.":["Activa la notificaci\u00f3n de administrador desde aqu\u00ed."],"Send entries to 100+ popular apps.":["Env\u00eda entradas a m\u00e1s de 100 aplicaciones populares."],"Build automated workflows that run instantly.":["Crea flujos de trabajo automatizados que se ejecutan al instante."],"Create custom app integrations using our Custom App feature.":["Crea integraciones de aplicaciones personalizadas utilizando nuestra funci\u00f3n de Aplicaci\u00f3n Personalizada."],"Keep your tools in sync automatically.":["Mant\u00e9n tus herramientas sincronizadas autom\u00e1ticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Esto instalar\u00e1 y activar\u00e1 OttoKit en su sitio de WordPress para habilitar funciones de automatizaci\u00f3n."],"Automate Your Forms with OttoKit":["Automatiza tus formularios con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada env\u00edo de formulario deber\u00eda activar algo: una alerta de Slack, un cliente potencial en el CRM, un correo electr\u00f3nico de seguimiento o una nueva fila en Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configura los permisos del cliente de IA y la configuraci\u00f3n del servidor MCP."],"View documentation":["Ver documentaci\u00f3n"],"Copy to clipboard":["Copiar al portapapeles"],"Claude Desktop":["Escritorio Claude"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) o %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["C\u00f3digo Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (proyecto) o ~\/.claude.json (global)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (proyecto) o settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml o config.json"],"Your client's MCP configuration file":["El archivo de configuraci\u00f3n MCP de su cliente"],"Connect Your AI Client":["Conecta tu cliente de IA"],"AI Client":["Cliente de IA"],"Create an Application Password \u2014 ":["Crear una Contrase\u00f1a de Aplicaci\u00f3n \u2014"],"Open Application Passwords":["Abrir contrase\u00f1as de aplicaciones"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["O utiliza este comando CLI para a\u00f1adir el servidor r\u00e1pidamente (a\u00fan necesitar\u00e1s configurar las variables de entorno):"],"Copy the JSON config below into: ":["Copie la configuraci\u00f3n JSON a continuaci\u00f3n en:"],"Replace \"your-application-password\" with the password from Step 1.":["Reemplace \"your-application-password\" con la contrase\u00f1a del Paso 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 el punto final MCP de tu sitio. WP_API_USERNAME \u2014 tu nombre de usuario de WordPress. WP_API_PASSWORD \u2014 la contrase\u00f1a de la aplicaci\u00f3n que generaste."],"View setup docs":["Ver documentos de configuraci\u00f3n"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["El complemento MCP Adapter est\u00e1 instalado pero no activo. Act\u00edvalo para configurar los ajustes de MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["El complemento MCP Adapter es necesario para conectar clientes de IA a tus formularios. Desc\u00e1rgalo e inst\u00e1lalo desde GitHub, luego act\u00edvalo."],"Download the latest release from":["Descarga la \u00faltima versi\u00f3n desde"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Instala el complemento a trav\u00e9s de Complementos > A\u00f1adir nuevo complemento > Subir complemento."],"Activate the MCP Adapter plugin.":["Activa el complemento del adaptador MCP."],"Activating\u2026":["Activando\u2026"],"Activate MCP Adapter":["Activar adaptador MCP"],"Download MCP Adapter":["Descargar el adaptador MCP"],"Experimental":["Experimental"],"Enable Abilities":["Habilitar habilidades"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registra las habilidades de SureForms con la API de Habilidades de WordPress. Cuando est\u00e1 habilitado, los clientes de IA pueden listar, leer, crear, editar y eliminar tus formularios y entradas. Cuando est\u00e1 deshabilitado, no se registran habilidades y los clientes de IA no pueden realizar ninguna acci\u00f3n en tus formularios."],"Abilities API \u2014 Edit":["API de habilidades \u2014 Editar"],"Enable Edit Abilities":["Habilitar habilidades de edici\u00f3n"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Cuando est\u00e1 habilitado, los clientes de IA pueden crear nuevos formularios, actualizar t\u00edtulos de formularios, campos y configuraciones, duplicar formularios y modificar los estados de las entradas. Cuando est\u00e1 deshabilitado, estas habilidades se desregistran y los clientes de IA solo pueden leer sus datos."],"Abilities API \u2014 Delete":["API de habilidades \u2014 Eliminar"],"Enable Delete Abilities":["Habilitar habilidades de eliminaci\u00f3n"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Cuando est\u00e1 habilitado, los clientes de IA pueden eliminar permanentemente formularios y entradas. Los datos eliminados no se pueden recuperar. Cuando est\u00e1 deshabilitado, las capacidades de eliminaci\u00f3n se desregistran y los clientes de IA no pueden eliminar ning\u00fan dato."],"MCP Server":["Servidor MCP"],"Enable MCP Server":["Habilitar servidor MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Crea un punto final dedicado de SureForms MCP al que los clientes de IA como Claude pueden conectarse. Cuando est\u00e1 deshabilitado, el punto final se elimina y los clientes de IA externos no pueden descubrir ni llamar a ninguna capacidad de SureForms."],"Learn more":["Aprende m\u00e1s"],"MCP Adapter Required":["Adaptador MCP Requerido"],"Heading 1":["Encabezado 1"],"Heading 2":["Encabezado 2"],"Heading 3":["Encabezado 3"],"Heading 4":["Encabezado 4"],"Heading 5":["Encabezado 5"],"Heading 6":["Encabezado 6"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configura la clave de la API de Google Maps para la autocompletaci\u00f3n de direcciones y la vista previa del mapa."],"Help shape the future of SureForms":["Ayuda a dar forma al futuro de SureForms"],"Enable Google Address Autocomplete":["Habilitar la autocompletar de direcciones de Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Actualiza al Plan de Negocios de SureForms para agregar la autocompletaci\u00f3n de direcciones impulsada por Google con vista previa de mapa interactivo a tus formularios."],"Auto-suggest addresses as users type for faster, error-free submissions":["Sugerir direcciones autom\u00e1ticamente mientras los usuarios escriben para env\u00edos m\u00e1s r\u00e1pidos y sin errores"],"Show an interactive map preview with draggable pin for precise locations":["Muestra una vista previa de mapa interactivo con un marcador arrastrable para ubicaciones precisas"],"Automatically populate address fields like city, state, and postal code":["Rellenar autom\u00e1ticamente campos de direcci\u00f3n como ciudad, estado y c\u00f3digo postal"],"This form is now closed as we've received all the entries.":["Este formulario est\u00e1 ahora cerrado ya que hemos recibido todas las inscripciones."],"Thank you for contacting us! We will be in touch with you shortly.":["\u00a1Gracias por contactarnos! Nos pondremos en contacto contigo en breve."],"Saving\u2026":["Guardando\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Cuando est\u00e9 habilitado, este formulario no almacenar\u00e1 la IP del usuario, el nombre del navegador ni el nombre del dispositivo en las entradas."],"Form data":["Datos del formulario"],"Unsaved changes":["Cambios no guardados"],"Keep editing":["Sigue editando"],"Global Defaults":["Valores predeterminados globales"],"Form Restrictions":["Restricciones del formulario"],"Configure default settings that apply to newly created forms.":["Configurar los ajustes predeterminados que se aplican a los formularios reci\u00e9n creados."],"Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ":["Recopila informaci\u00f3n no sensible de tu sitio web, como la versi\u00f3n de PHP y las caracter\u00edsticas utilizadas, para ayudarnos a corregir errores m\u00e1s r\u00e1pido, tomar decisiones m\u00e1s inteligentes y desarrollar funciones que realmente te importen. "],"Failed to load pages. Please refresh and try again.":["Error al cargar las p\u00e1ginas. Por favor, actualice e intente de nuevo."],"Failed to load settings. Please refresh and try again.":["Error al cargar la configuraci\u00f3n. Por favor, actualice e intente de nuevo."],"Form Validation fields cannot be left blank.":["Los campos de validaci\u00f3n de formularios no pueden dejarse en blanco."],"Recipient email is required when email summaries are enabled.":["Se requiere el correo electr\u00f3nico del destinatario cuando los res\u00famenes de correo electr\u00f3nico est\u00e1n habilitados."],"Please enter a valid recipient email.":["Por favor, introduce un correo electr\u00f3nico de destinatario v\u00e1lido."],"Settings saved.":["Configuraciones guardadas."],"Failed to save settings.":["Error al guardar la configuraci\u00f3n."],"Some settings failed to save. Please retry.":["Algunas configuraciones no se pudieron guardar. Por favor, int\u00e9ntalo de nuevo."],"Some fields have unsaved changes. Discard them to continue, or stay to save your edits.":["Algunos campos tienen cambios no guardados. Des\u00e9chelos para continuar, o permanezca para guardar sus ediciones."],"Discard & switch":["Descartar y cambiar"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-es_ES-8cf77722f0a349f4f2e7f56437f288f9.json b/languages/sureforms-es_ES-8cf77722f0a349f4f2e7f56437f288f9.json index 689df4194..96c9fb074 100644 --- a/languages/sureforms-es_ES-8cf77722f0a349f4f2e7f56437f288f9.json +++ b/languages/sureforms-es_ES-8cf77722f0a349f4f2e7f56437f288f9.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tablero"],"Settings":["Configuraciones"],"Entries":["Entradas"],"Move to Trash":["Mover a la papelera"],"Export":["Exportar"],"Trash":["Basura"],"Published":["Publicado"],"Restore":["Restaurar"],"Delete Permanently":["Eliminar permanentemente"],"Clear Filter":["Limpiar filtro"],"Activated":["Activado"],"Edit":["Editar"],"Import Form":["Formulario de Importaci\u00f3n"],"Add New Form":["Agregar nuevo formulario"],"View Form":["Ver formulario"],"Forms":["Formularios"],"Shortcode":["C\u00f3digo corto"],"(no title)":["(sin t\u00edtulo)"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"What's New?":["\u00bfQu\u00e9 hay de nuevo?"],"Core":["N\u00facleo"],"Unlicensed":["Sin licencia"],"Page":["P\u00e1gina"],"No Date":["Sin fecha"],"Invalid Date":["Fecha no v\u00e1lida"],"Ready to go beyond free plan?":["\u00bfListo para ir m\u00e1s all\u00e1 del plan gratuito?"],"Upgrade now":["Actualiza ahora"],"and unlock the full power of SureForms!":["y desbloquea todo el poder de SureForms!"],"Upgrade SureForms":["Actualizar SureForms"],"Clear Filters":["Limpiar filtros"],"Select Date Range":["Seleccionar rango de fechas"],"Actions":["Acciones"],"Duplicate":["Duplicado"],"All Forms":["Todas las formas"],"Date & Time":["Fecha y hora"],"Payments":["Pagos"],"Knowledge Base":["Base de Conocimientos"],"What\u2019s New":["Qu\u00e9 hay de nuevo"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/yyyy - dd\/mm\/yyyy"],"out of":["fuera de"],"No entries found":["No se encontraron entradas"],"delete":["eliminar"],"Please type \"%s\" in the input box":["Por favor, escribe \"%s\" en el cuadro de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, escriba \"%s\" en el cuadro de abajo:"],"Type \"%s\"":["Escribe \"%s\""],"No results found":["No se encontraron resultados"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["No pudimos encontrar ning\u00fan registro que coincida con tus filtros. Intenta ajustar los filtros o restablecerlos para ver todos los resultados."],"Please select a file to import.":["Por favor, seleccione un archivo para importar."],"Invalid JSON file format.":["Formato de archivo JSON no v\u00e1lido."],"Failed to read file.":["Error al leer el archivo."],"Import failed.":["La importaci\u00f3n fall\u00f3."],"An error occurred during import.":["Ocurri\u00f3 un error durante la importaci\u00f3n."],"Import Forms":["Importar formularios"],"Please select a valid JSON file.":["Por favor, seleccione un archivo JSON v\u00e1lido."],"Drag and drop or browse files":["Arrastra y suelta o busca archivos"],"Importing\u2026":["Importando\u2026"],"Drafts":["Borradores"],"Search forms\u2026":["Buscar formularios\u2026"],"No forms found":["No se encontraron formularios"],"Title":["T\u00edtulo"],"Copied!":["\u00a1Copiado!"],"Copy Shortcode":["Copiar c\u00f3digo corto"],"No Forms":["Sin formularios"],"Hi there, let's get you started":["Hola, vamos a empezar"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Parece que a\u00fan no has creado ning\u00fan formulario. Comienza a construir con SureForms y lanza formularios potentes en solo unos clics."],"Design forms with our Gutenberg-native builder.":["Dise\u00f1a formularios con nuestro creador nativo de Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Utiliza la IA para generar formularios al instante a partir de un simple aviso."],"Build engaging conversational, calculation, and multi-step forms.":["Construye formularios conversacionales, de c\u00e1lculo y de m\u00faltiples pasos atractivos."],"Create Form":["Crear formulario"],"An error occurred while fetching forms.":["Ocurri\u00f3 un error al obtener los formularios."],"%d form moved to trash.":["%d formulario movido a la papelera."],"%d form restored.":["%d formulario restaurado."],"%d form permanently deleted.":["%d formulario eliminado permanentemente."],"An error occurred while performing the action.":["Ocurri\u00f3 un error al realizar la acci\u00f3n."],"%d form imported successfully.":["%d formulario importado con \u00e9xito."],"%d form will be moved to trash and can be restored later.":["%d formulario ser\u00e1 movido a la papelera y podr\u00e1 ser restaurado m\u00e1s tarde."],"Delete Form":["Eliminar formulario"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["\u00bfEst\u00e1 seguro de que desea eliminar permanentemente el formulario %d? Esta acci\u00f3n no se puede deshacer."],"Restore Form":["Restaurar formulario"],"%d form will be restored from trash.":["El formulario %d ser\u00e1 restaurado de la papelera."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["\u00bfEst\u00e1 seguro de que desea eliminar este formulario de forma permanente? Esta acci\u00f3n no se puede deshacer."],"This form will be moved to trash and can be restored later.":["Este formulario se mover\u00e1 a la papelera y se podr\u00e1 restaurar m\u00e1s tarde."],"An error occurred while duplicating the form.":["Ocurri\u00f3 un error al duplicar el formulario."],"This will create a copy of \"%s\" with all its settings.":["Esto crear\u00e1 una copia de \"%s\" con todas sus configuraciones."],"Learn":["Aprender"],"Export failed: no data received.":["Exportaci\u00f3n fallida: no se recibieron datos."],"Select a SureForms export file (.json) to import.":["Seleccione un archivo de exportaci\u00f3n de SureForms (.json) para importar."],"Drop a form file (.json) here":["Coloca un archivo de formulario (.json) aqu\u00ed"],"(Draft)":["(Borrador)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Crea formularios instant\u00e1neos y comp\u00e1rtelos con un enlace, sin necesidad de incrustarlos."],"Form \"%s\" duplicated successfully.":["Formulario \"%s\" duplicado con \u00e9xito."],"Error loading forms":["Error al cargar los formularios"],"Move form to trash?":["\u00bfMover formulario a la papelera?"],"Delete form?":["\u00bfEliminar formulario?"],"Duplicate form?":["\u00bfFormulario duplicado?"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tablero"],"Settings":["Configuraciones"],"Entries":["Entradas"],"Move to Trash":["Mover a la papelera"],"Export":["Exportar"],"Trash":["Basura"],"Published":["Publicado"],"Restore":["Restaurar"],"Delete Permanently":["Eliminar permanentemente"],"Clear Filter":["Limpiar filtro"],"Activated":["Activado"],"Edit":["Editar"],"Import Form":["Formulario de Importaci\u00f3n"],"Add New Form":["Agregar nuevo formulario"],"View Form":["Ver formulario"],"Forms":["Formularios"],"Shortcode":["C\u00f3digo corto"],"(no title)":["(sin t\u00edtulo)"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"What's New?":["\u00bfQu\u00e9 hay de nuevo?"],"Core":["N\u00facleo"],"Unlicensed":["Sin licencia"],"Page":["P\u00e1gina"],"No Date":["Sin fecha"],"Invalid Date":["Fecha no v\u00e1lida"],"Ready to go beyond free plan?":["\u00bfListo para ir m\u00e1s all\u00e1 del plan gratuito?"],"Upgrade now":["Actualiza ahora"],"and unlock the full power of SureForms!":["y desbloquea todo el poder de SureForms!"],"Upgrade SureForms":["Actualizar SureForms"],"Clear Filters":["Limpiar filtros"],"Select Date Range":["Seleccionar rango de fechas"],"Actions":["Acciones"],"Duplicate":["Duplicado"],"All Forms":["Todas las formas"],"Date & Time":["Fecha y hora"],"Payments":["Pagos"],"Knowledge Base":["Base de Conocimientos"],"What\u2019s New":["Qu\u00e9 hay de nuevo"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/yyyy - dd\/mm\/yyyy"],"out of":["fuera de"],"No entries found":["No se encontraron entradas"],"delete":["eliminar"],"Please type \"%s\" in the input box":["Por favor, escribe \"%s\" en el cuadro de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, escriba \"%s\" en el cuadro de abajo:"],"Type \"%s\"":["Escribe \"%s\""],"No results found":["No se encontraron resultados"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["No pudimos encontrar ning\u00fan registro que coincida con tus filtros. Intenta ajustar los filtros o restablecerlos para ver todos los resultados."],"Please select a file to import.":["Por favor, seleccione un archivo para importar."],"Invalid JSON file format.":["Formato de archivo JSON no v\u00e1lido."],"Failed to read file.":["Error al leer el archivo."],"Import failed.":["La importaci\u00f3n fall\u00f3."],"An error occurred during import.":["Ocurri\u00f3 un error durante la importaci\u00f3n."],"Import Forms":["Importar formularios"],"Please select a valid JSON file.":["Por favor, seleccione un archivo JSON v\u00e1lido."],"Drag and drop or browse files":["Arrastra y suelta o busca archivos"],"Importing\u2026":["Importando\u2026"],"Drafts":["Borradores"],"Search forms\u2026":["Buscar formularios\u2026"],"No forms found":["No se encontraron formularios"],"Title":["T\u00edtulo"],"Copied!":["\u00a1Copiado!"],"Copy Shortcode":["Copiar c\u00f3digo corto"],"No Forms":["Sin formularios"],"Hi there, let's get you started":["Hola, vamos a empezar"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Parece que a\u00fan no has creado ning\u00fan formulario. Comienza a construir con SureForms y lanza formularios potentes en solo unos clics."],"Design forms with our Gutenberg-native builder.":["Dise\u00f1a formularios con nuestro creador nativo de Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Utiliza la IA para generar formularios al instante a partir de un simple aviso."],"Build engaging conversational, calculation, and multi-step forms.":["Construye formularios conversacionales, de c\u00e1lculo y de m\u00faltiples pasos atractivos."],"Create Form":["Crear formulario"],"An error occurred while fetching forms.":["Ocurri\u00f3 un error al obtener los formularios."],"%d form moved to trash.":["%d formulario movido a la papelera."],"%d form restored.":["%d formulario restaurado."],"%d form permanently deleted.":["%d formulario eliminado permanentemente."],"An error occurred while performing the action.":["Ocurri\u00f3 un error al realizar la acci\u00f3n."],"%d form imported successfully.":["%d formulario importado con \u00e9xito."],"%d form will be moved to trash and can be restored later.":["%d formulario ser\u00e1 movido a la papelera y podr\u00e1 ser restaurado m\u00e1s tarde."],"Delete Form":["Eliminar formulario"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["\u00bfEst\u00e1 seguro de que desea eliminar permanentemente el formulario %d? Esta acci\u00f3n no se puede deshacer."],"Restore Form":["Restaurar formulario"],"%d form will be restored from trash.":["El formulario %d ser\u00e1 restaurado de la papelera."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["\u00bfEst\u00e1 seguro de que desea eliminar este formulario de forma permanente? Esta acci\u00f3n no se puede deshacer."],"This form will be moved to trash and can be restored later.":["Este formulario se mover\u00e1 a la papelera y se podr\u00e1 restaurar m\u00e1s tarde."],"An error occurred while duplicating the form.":["Ocurri\u00f3 un error al duplicar el formulario."],"This will create a copy of \"%s\" with all its settings.":["Esto crear\u00e1 una copia de \"%s\" con todas sus configuraciones."],"Learn":["Aprender"],"Export failed: no data received.":["Exportaci\u00f3n fallida: no se recibieron datos."],"Select a SureForms export file (.json) to import.":["Seleccione un archivo de exportaci\u00f3n de SureForms (.json) para importar."],"Drop a form file (.json) here":["Coloca un archivo de formulario (.json) aqu\u00ed"],"(Draft)":["(Borrador)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Crea formularios instant\u00e1neos y comp\u00e1rtelos con un enlace, sin necesidad de incrustarlos."],"Form \"%s\" duplicated successfully.":["Formulario \"%s\" duplicado con \u00e9xito."],"Error loading forms":["Error al cargar los formularios"],"Move form to trash?":["\u00bfMover formulario a la papelera?"],"Delete form?":["\u00bfEliminar formulario?"],"Duplicate form?":["\u00bfFormulario duplicado?"],"Switch to Draft":["Cambiar a borrador"],"%d form switched to draft.":["%d formulario cambiado a borrador."],"Switch form to draft?":["\u00bfCambiar el formulario a borrador?"],"%d form will be switched to draft and will no longer be publicly accessible.":["%d formulario se cambiar\u00e1 a borrador y ya no ser\u00e1 accesible p\u00fablicamente."],"This form will be switched to draft and will no longer be publicly accessible.":["Este formulario se cambiar\u00e1 a borrador y ya no ser\u00e1 accesible p\u00fablicamente."]}}} \ No newline at end of file diff --git a/languages/sureforms-es_ES-e2cfcb2408d95abf73e3ead4a0965656.json b/languages/sureforms-es_ES-e2cfcb2408d95abf73e3ead4a0965656.json new file mode 100644 index 000000000..0bd49202b --- /dev/null +++ b/languages/sureforms-es_ES-e2cfcb2408d95abf73e3ead4a0965656.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T16:34:28+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/partialEntriesEmptyState.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tablero"],"Settings":["Configuraciones"],"Entries":["Entradas"],"Activated":["Activado"],"Forms":["Formularios"],"What's New?":["\u00bfQu\u00e9 hay de nuevo?"],"Core":["N\u00facleo"],"Unlicensed":["Sin licencia"],"Ready to go beyond free plan?":["\u00bfListo para ir m\u00e1s all\u00e1 del plan gratuito?"],"Upgrade now":["Actualiza ahora"],"and unlock the full power of SureForms!":["y desbloquea todo el poder de SureForms!"],"Upgrade SureForms":["Actualizar SureForms"],"Payments":["Pagos"],"Knowledge Base":["Base de Conocimientos"],"What\u2019s New":["Qu\u00e9 hay de nuevo"],"Learn":["Aprender"],"Upgrade to SureForms":["Actualiza a SureForms"],"Partial Entries Placeholder":["Marcador de posici\u00f3n de entradas parciales"],"Capture in-progress form data the moment visitors stop typing \u2014 no submit required":["Captura los datos del formulario en progreso en el momento en que los visitantes dejan de escribir, sin necesidad de enviar"],"Recover abandoned submissions and follow up with prospects you would otherwise lose":["Recupera las presentaciones abandonadas y haz un seguimiento con los prospectos que de otro modo perder\u00edas"],"Let visitors pick up where they left off with secure, shareable resume links":["Permite a los visitantes retomar donde lo dejaron con enlaces de reanudaci\u00f3n seguros y compartibles"],"Stop Losing Leads to Abandoned Forms":["Deja de perder clientes potenciales por formularios abandonados"],"See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:":["Vea lo que escribieron los visitantes antes de irse. Actualice a SureForms Premium para desbloquear las Entradas Parciales:"]}}} \ No newline at end of file diff --git a/languages/sureforms-es_ES.mo b/languages/sureforms-es_ES.mo index bb4142e7f..2cf8e4db1 100644 Binary files a/languages/sureforms-es_ES.mo and b/languages/sureforms-es_ES.mo differ diff --git a/languages/sureforms-es_ES.po b/languages/sureforms-es_ES.po index 585447fd5..8c768855b 100644 --- a/languages/sureforms-es_ES.po +++ b/languages/sureforms-es_ES.po @@ -14,9 +14,9 @@ msgstr "" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -43,13 +43,14 @@ msgstr "Una forma simple pero poderosa de crear formularios modernos para tu sit msgid "https://sureforms.com/" msgstr "https://sureforms.com/" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -58,15 +59,16 @@ msgstr "https://sureforms.com/" msgid "Dashboard" msgstr "Tablero" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -74,21 +76,22 @@ msgstr "Tablero" msgid "Settings" msgstr "Configuraciones" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "Nuevo formulario" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -97,7 +100,7 @@ msgid "Entries" msgstr "Entradas" #. Translators: Post Title. -#: admin/admin.php:843 +#: admin/admin.php:869 #, php-format msgid "Edit %1$s" msgstr "Editar %1$s" @@ -111,25 +114,25 @@ msgstr "Editar %1$s" #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "La verificación del nonce falló." #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 +#: admin/admin.php:1504 #, php-format msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "Por favor, %1$sactiva%2$s tu copia de %3$s para obtener nuevas funciones, acceder al soporte, recibir notificaciones de actualizaciones y más." #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 +#: admin/admin.php:1522 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "SureForms %1$s requiere un mínimo de %2$s %3$s para funcionar correctamente. Por favor, actualice a la última versión desde %4$saquí%5$s." -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 @@ -197,7 +200,7 @@ msgstr "Basura" msgid "Published" msgstr "Publicado" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "Ver" @@ -286,17 +289,18 @@ msgstr "No se especificó ningún complemento" msgid "Plugin Successfully Activated" msgstr "Plugin activado con éxito" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "Activando..." -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -305,17 +309,17 @@ msgstr "Activando..." msgid "Activated" msgstr "Activado" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "Activar" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "Instalando..." -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "Instalado" @@ -323,14 +327,14 @@ msgstr "Instalado" msgid "You do not have permission to access this page." msgstr "No tienes permiso para acceder a esta página." -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "Nonce no válido." @@ -339,7 +343,7 @@ msgid "Form ID is required." msgstr "Se requiere el ID del formulario." #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1001 msgid "Invalid form ID." msgstr "ID de formulario no válido." @@ -591,28 +595,23 @@ msgstr "Hubo un error al intentar enviar su formulario. Por favor, inténtelo de msgid "Test Email Sent Successfully." msgstr "Correo de prueba enviado con éxito." -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "No se encontraron formularios." #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "Lunes" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" -msgstr "¡Error al guardar la configuración!" - -#: inc/global-settings/global-settings.php:122 #: assets/build/formEditor.js:172 msgid "Global Settings" msgstr "Configuración global" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "Configuración guardada con éxito." @@ -626,7 +625,6 @@ msgid "Advanced Fields" msgstr "Campos avanzados" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "Este campo es obligatorio." @@ -681,7 +679,7 @@ msgstr "Ocultar" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "Editar formulario" @@ -705,37 +703,38 @@ msgstr "Crear" msgid "Import Form" msgstr "Formulario de Importación" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "Agregar nuevo formulario" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "No se encontraron registros" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "Aquí es donde aparecerán las entradas de su formulario" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "Ver formulario" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "Ver formularios" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -743,32 +742,37 @@ msgstr "Ver formularios" msgid "Forms" msgstr "Formularios" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "Formularios de búsqueda" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "Formularios de los padres:" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "No se encontraron formularios en la papelera." -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "Formulario publicado." -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "Formulario actualizado." -#: inc/post-types.php:977 +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 msgid "Admin Notification Email" msgstr "Correo Electrónico de Notificación del Administrador" #. translators: %s: Form title smart tag -#: inc/post-types.php:984 +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 #, php-format msgid "New Form Submission - %s" msgstr "Nueva presentación de formulario - %s" @@ -8232,7 +8236,7 @@ msgstr "Social" msgid "Travel" msgstr "Viajar" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "Formulario en blanco" @@ -8262,6 +8266,7 @@ msgstr "Creado con ♡ %s" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "(sin título)" @@ -8288,7 +8293,7 @@ msgstr "Cambiar formulario" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "Este formulario ha sido eliminado o no está disponible." @@ -8334,6 +8339,7 @@ msgstr "Avanzado" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "No hay etiquetas disponibles" @@ -8378,6 +8384,7 @@ msgstr "Restablecer" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "Etiquetas genéricas" @@ -8757,6 +8764,7 @@ msgstr "Integraciones" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8769,6 +8777,7 @@ msgstr "¿Qué hay de nuevo?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8781,6 +8790,7 @@ msgstr "Núcleo" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8789,52 +8799,52 @@ msgid "Unlicensed" msgstr "Sin licencia" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 #, js-format msgid "%s Removed from Quick Action Bar." msgstr "%s eliminado de la barra de acción rápida." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "Agregar a la barra de acción rápida" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 #, js-format msgid "%s Added to Quick Action Bar." msgstr "%s añadido a la barra de acción rápida." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "Ya presente en la barra de acción rápida" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "No se encontraron resultados." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "el objeto de datos está vacío" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "Agregar bloques a la barra de acción rápida" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "Reorganizar bloque dentro de la Barra de Acción Rápida" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -8860,30 +8870,37 @@ msgid "Install & Activate" msgstr "Instalar y activar" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Compliance Settings" msgstr "Configuración de Cumplimiento" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "Habilitar el cumplimiento del RGPD" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "Nunca almacenes los datos de entrada después de enviar el formulario" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "Cuando esté habilitado, este formulario nunca almacenará entradas." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "Eliminar automáticamente las entradas" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "Cuando esté habilitado, este formulario eliminará automáticamente las entradas después de un cierto período de tiempo." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "Las entradas más antiguas que los días establecidos se eliminarán automáticamente." @@ -8896,34 +8913,42 @@ msgid "The following CSS styles added below will only apply to this form contain msgstr "Los siguientes estilos CSS añadidos a continuación solo se aplicarán a este contenedor de formulario." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "Visual" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "HTML" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "Todos los datos" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "Agregar código corto" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "Etiquetas de entrada de formulario" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Comma separated values are also accepted." msgstr "También se aceptan valores separados por comas." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "Notificación de correo electrónico" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Name" msgstr "Nombre" @@ -8933,18 +8958,22 @@ msgid "Send Email To" msgstr "Enviar correo electrónico a" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Subject" msgstr "Asunto" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "CC" msgstr "CC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "BCC" msgstr "BCC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reply To" msgstr "Responder a" @@ -8953,54 +8982,57 @@ msgid "Add Notification" msgstr "Agregar notificación" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." -msgstr "Notificación de correo electrónico desactivada con éxito." - -#: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." -msgstr "Notificación por correo electrónico habilitada con éxito." - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "Agregar clave" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "Añadir valor" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "Añadir" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "Mensaje de confirmación" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "Después del envío del formulario" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "Ocultar formulario" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "Restablecer formulario" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "URL personalizada" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "Agregar parámetros de consulta" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "Seleccione si desea agregar pares clave-valor para los campos del formulario que se incluirán en los parámetros de consulta" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "Parámetros de consulta" @@ -9013,14 +9045,17 @@ msgid "Suggestion: URL should use HTTPS" msgstr "Sugerencia: la URL debería usar HTTPS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Success Message" msgstr "Mensaje de éxito" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect" msgstr "Redirigir" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect to" msgstr "Redirigir a" @@ -9028,14 +9063,17 @@ msgstr "Redirigir a" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "Página" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form Confirmation" msgstr "Confirmación de formulario" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "Tipo de confirmación" @@ -9177,7 +9215,7 @@ msgstr "Centro" msgid "Right" msgstr "Correcto" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1178 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" @@ -9187,7 +9225,7 @@ msgstr "Google reCAPTCHA" msgid "CloudFlare Turnstile" msgstr "CloudFlare Turnstile" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1182 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" @@ -9246,7 +9284,8 @@ msgstr "Salto de página" msgid "Previous" msgstr "Anterior" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 #: assets/build/formEditor.js:172 msgid "Thank you" msgstr "Gracias" @@ -9465,7 +9504,7 @@ msgstr "Clave del sitio" msgid "Secret Key" msgstr "Clave secreta" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1186 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "Cloudflare Turnstile" @@ -9482,10 +9521,6 @@ msgstr "Habilitar la seguridad Honeypot" msgid "Enable Honeypot Security for better spam protection" msgstr "Habilitar la seguridad Honeypot para una mejor protección contra el spam" -#: assets/build/settings.js:172 -msgid "This field cannot be left blank." -msgstr "Este campo no puede dejarse en blanco." - #: assets/build/templatePicker.js:172 msgid "Connect Now" msgstr "Conectar ahora" @@ -10425,7 +10460,7 @@ msgstr "Agrega impresionantes iconos personalizables a tu sitio web." msgid "icon" msgstr "icono" -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "Califica SureForms" @@ -10481,18 +10516,18 @@ msgstr "Desbloquear Añadir Nota" msgid "With the SureForms Starter plan, enhance your submitted form entries by adding personalized notes for better clarity and tracking." msgstr "Con el plan SureForms Starter, mejora tus entradas de formulario enviadas añadiendo notas personalizadas para una mejor claridad y seguimiento." -#: inc/form-submit.php:823 +#: inc/form-submit.php:852 msgid "Email notification passed to the sending server" msgstr "Notificación de correo electrónico pasada al servidor de envío" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 +#: inc/form-submit.php:925 #, php-format msgid "Email notification recipient: %s" msgstr "Destinatario de la notificación por correo electrónico: %s" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 +#: inc/form-submit.php:942 #, php-format msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "El servidor de correo no pudo enviar la notificación por correo electrónico. Destinatario: %1$s. Razón: %2$s" @@ -10535,7 +10570,7 @@ msgstr "Desbloquear formularios conversacionales" msgid "With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience." msgstr "Con el Plan SureForms Pro, puedes transformar tus formularios en diseños conversacionales atractivos para una experiencia de usuario fluida." -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "Obtén SureForms Pro" @@ -10631,7 +10666,7 @@ msgstr "PX" msgid "Button" msgstr "Botón" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" @@ -10663,46 +10698,56 @@ msgid "SUREFORMS PREMIUM FIELDS" msgstr "CAMPOS PREMIUM DE SUREFORMS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "La dirección de 'Correo Electrónico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electrónicos de notificación sean bloqueados o marcados como spam. Alternativamente, intente usar una dirección de remitente que coincida con el dominio de su sitio web (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "La dirección de 'Correo Electrónico del Remitente' actual no coincide con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electrónicos de notificación sean bloqueados o marcados como spam." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "We strongly recommend that you install the free " msgstr "Recomendamos encarecidamente que instale el gratuito" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "¡Complemento! El asistente de configuración facilita la corrección de tus correos electrónicos." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "Alternativamente, intenta usar una dirección de remitente que coincida con el dominio de tu sitio web (admin@%s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "Por favor, introduce una dirección de correo electrónico válida. Tus notificaciones no se enviarán si el campo no está rellenado correctamente." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Name" msgstr "De Nombre" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Email" msgstr "De correo electrónico" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "La dirección de 'Correo Electrónico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%1$s). Esto puede hacer que sus correos electrónicos de notificación sean bloqueados o marcados como spam. Alternativamente, intente usar una Dirección del Remitente que coincida con el dominio de su sitio web (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "La dirección de 'Correo Electrónico del Remitente' actual puede no coincidir con el nombre de dominio de su sitio web (%s). Esto puede hacer que sus correos electrónicos de notificación sean bloqueados o marcados como spam." @@ -10736,24 +10781,24 @@ msgstr "Seleccionar degradado" msgid "reCAPTCHA" msgstr "reCAPTCHA" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1122 msgid "Captcha validation failed. No error code provided." msgstr "La validación del captcha falló. No se proporcionó un código de error." -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1123 msgid "Captcha validation failed." msgstr "La validación del captcha falló." -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1190 msgid "Unknown Captcha" msgstr "Captcha desconocido" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1191 msgid "Invalid captcha type." msgstr "Tipo de captcha no válido." #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 +#: inc/form-submit.php:1204 #, php-format msgid "%s verification failed. Please contact your site administrator." msgstr "La verificación de %s falló. Por favor, contacte a su administrador del sitio." @@ -10776,11 +10821,11 @@ msgstr "La verificación del sitekey de HCaptcha falló. Por favor, contacte a s msgid "%s sitekey is missing. Please contact your site administrator." msgstr "Falta el sitekey de %s. Por favor, contacte a su administrador del sitio." -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "SureMail" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "Plantillas de inicio" @@ -10821,6 +10866,7 @@ msgstr "Fecha no válida" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10833,6 +10879,7 @@ msgstr "¿Listo para ir más allá del plan gratuito?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10845,6 +10892,7 @@ msgstr "Actualiza ahora" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10857,6 +10905,7 @@ msgstr "y desbloquea todo el poder de SureForms!" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10947,10 +10996,12 @@ msgid "Free" msgstr "Gratis" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "Las entradas anteriores a los días seleccionados serán eliminadas." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "Período de tiempo de las entradas" @@ -10959,6 +11010,7 @@ msgid "Custom CSS Panel" msgstr "Panel de CSS personalizado" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "Las notificaciones solo pueden usar un único correo electrónico de origen, así que por favor ingrese una sola dirección." @@ -10986,14 +11038,17 @@ msgid "Delete" msgstr "Eliminar" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "Seleccionar página para redirigir" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "Buscar una página" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "Selecciona una página" @@ -11119,6 +11174,7 @@ msgstr "Para habilitar hCAPTCHA, por favor añade tu clave del sitio y clave sec msgid "To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form." msgstr "Para habilitar Cloudflare Turnstile, por favor añade tu clave de sitio y clave secreta. Configura estos ajustes dentro del formulario individual." +#: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Save" msgstr "Guardar" @@ -11139,8 +11195,8 @@ msgstr "Describe el formulario que deseas crear" msgid "We are building your form…" msgstr "Estamos construyendo tu formulario…" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "SMTP" @@ -11270,28 +11326,28 @@ msgstr "Habilitar notificación de administrador" msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "Las notificaciones de administrador te mantienen informado sobre nuevas entradas de formularios desde tu última visita." -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "Usuario no autorizado." #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 +#: admin/admin.php:1774 #, php-format msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "%1$sComienza %2$screando tu primer formulario%3$s.%4$s%5$sExperimenta el poder de nuestro intuitivo Creador de Formularios AI%6$s" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "¡SureForms te está esperando!" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "Construir mi primer formulario" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "Descartar" @@ -11311,51 +11367,51 @@ msgstr "Iniciar sesión" msgid "Register" msgstr "Registrar" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "Entradas Recientes" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "( Últimos 7 días )" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "Usa lógica condicional para mostrar solo lo que importa" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "Divide tu formulario en pasos para mantenerlo sencillo" -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "Permite que las personas suban archivos directamente a tu formulario" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "Convierte las respuestas en PDFs descargables automáticamente" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "Permitir que los usuarios firmen con un campo de firma simple" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "Conecta tu formulario a otras herramientas usando webhooks" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "Utiliza Formularios Conversacionales para una experiencia similar a un chat" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "Permitir a los usuarios registrarse o iniciar sesión a través de su formulario" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "Crear formularios que generen cuentas de usuario de WordPress" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "Agrega cálculos para totalizar automáticamente las puntuaciones o precios" @@ -11585,21 +11641,21 @@ msgstr "Toques finales que marcan la diferencia:" msgid "Build Your First Form" msgstr "Construye tu primer formulario" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "Acción o nombre de nonce no válido." -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "Token de seguridad no válido." -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "Tipo de solicitud no válido." -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "No tienes permiso para realizar esta acción." @@ -11677,10 +11733,12 @@ msgid "Form Restriction" msgstr "Restricción de formulario" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "Número máximo de entradas" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "Entradas Máximas" @@ -11698,6 +11756,7 @@ msgid "Click here" msgstr "Haz clic aquí" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "Descripción de la respuesta después del máximo de entradas" @@ -11711,7 +11770,7 @@ msgstr "Hola," msgid "Email Summary of your last week - %1$s to %2$s" msgstr "Resumen del correo electrónico de la semana pasada - %1$s a %2$s" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "Complementos definitivos para Elementor" @@ -11773,7 +11832,7 @@ msgstr "Explora SureDash" msgid "Something went wrong. We have logged the error for further investigation" msgstr "Algo salió mal. Hemos registrado el error para una investigación posterior." -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "El campo no es válido." @@ -11837,16 +11896,18 @@ msgid "SureForms Video Thumbnail" msgstr "Miniatura de video de SureForms" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Expected format for emails - email@sureforms.com or John Doe " msgstr "Formato esperado para correos electrónicos: email@sureforms.com o John Doe " -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -12010,47 +12071,47 @@ msgstr "El modo de prueba está habilitado:" msgid "Click here to enable live mode and accept payment" msgstr "Haz clic aquí para activar el modo en vivo y aceptar pagos" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "¡Mejora la entregabilidad de tus correos electrónicos al instante!" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "Accede a un servicio de entrega de correos electrónicos potente y fácil de usar que garantiza que tus correos lleguen a las bandejas de entrada, no a las carpetas de spam. Automatiza tus flujos de trabajo de correo electrónico de WordPress con confianza usando SureMail." -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "Automatiza tus flujos de trabajo de WordPress sin esfuerzo." -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "Conecta tus plugins de WordPress y tus aplicaciones favoritas, automatiza tareas y sincroniza datos sin esfuerzo utilizando el constructor de flujos de trabajo visual y limpio de OttoKit, sin necesidad de programación ni configuraciones complejas." -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "¡Lanza hermosos sitios web en minutos!" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "Elige entre plantillas diseñadas profesionalmente, importa con un solo clic y personaliza sin esfuerzo para que coincida con tu marca." -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "¡Potencia Elementor para crear sitios web impresionantes más rápido!" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "Mejora Elementor con potentes widgets y plantillas. Crea sitios web impresionantes y de alto rendimiento más rápido con elementos de diseño creativos y personalización sin fisuras." -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "SureRank" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "¡Eleva tu SEO y asciende en los rankings de búsqueda sin esfuerzo!" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "Aumenta la visibilidad de tu sitio web con una automatización SEO inteligente. Optimiza el contenido, rastrea el rendimiento de las palabras clave y obtén información procesable, todo dentro de WordPress." @@ -12175,49 +12236,49 @@ msgstr "%1$d pago(s) eliminado(s) con éxito. %2$d falló." msgid "Failed to delete payments. Please try again." msgstr "Error al eliminar los pagos. Por favor, inténtelo de nuevo." -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "Formulario desconocido" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "No disponible" #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "Subscription" msgstr "Suscripción" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "Renovación" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "Una vez" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "Desconocido" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -12233,7 +12294,7 @@ msgstr "Se requiere un correo electrónico válido del cliente para los pagos." #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -12312,7 +12373,7 @@ msgstr "Error inesperado: %s" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "ID de suscripción no encontrado." @@ -12375,9 +12436,9 @@ msgstr "Verificación de suscripción" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 +#: inc/payments/stripe/stripe-webhook.php:1120 #, php-format msgid "Subscription ID: %s" msgstr "ID de suscripción: %s" @@ -12392,13 +12453,13 @@ msgstr "ID de suscripción: %s" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 #, php-format msgid "Payment Gateway: %s" msgstr "Pasarela de Pago: %s" @@ -12411,7 +12472,7 @@ msgstr "ID de intención de pago: %s" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 +#: inc/payments/stripe/stripe-webhook.php:1050 #, php-format msgid "Charge ID: %s" msgstr "ID de cargo: %s" @@ -12421,14 +12482,14 @@ msgstr "ID de cargo: %s" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 +#: inc/payments/stripe/admin-stripe-handler.php:516 #, php-format msgid "Subscription Status: %s" msgstr "Estado de la suscripción: %s" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 +#: inc/payments/stripe/stripe-webhook.php:1124 #, php-format msgid "Customer ID: %s" msgstr "ID de cliente: %s" @@ -12437,8 +12498,8 @@ msgstr "ID de cliente: %s" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 #, php-format msgid "Amount: %1$s %2$s" msgstr "Cantidad: %1$s %2$s" @@ -12473,7 +12534,7 @@ msgstr "Verificación de Pago" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 +#: inc/payments/stripe/stripe-webhook.php:1112 #, php-format msgid "Transaction ID: %s" msgstr "ID de transacción: %s" @@ -12482,7 +12543,7 @@ msgstr "ID de transacción: %s" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 #, php-format msgid "Status: %s" msgstr "Estado: %s" @@ -12850,23 +12911,23 @@ msgid "Unknown error" msgstr "Error desconocido" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "Falta el ID de pago." -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "No tienes permiso para realizar esta acción." #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "Pago no encontrado en la base de datos." #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "Esto no es un pago de suscripción." @@ -12876,7 +12937,7 @@ msgid "Subscription cancellation failed." msgstr "La cancelación de la suscripción falló." #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "Error al actualizar el estado de la suscripción en la base de datos." @@ -12885,58 +12946,58 @@ msgstr "Error al actualizar el estado de la suscripción en la base de datos." msgid "Invalid payment data." msgstr "Datos de pago no válidos." -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "Solo los pagos exitosos o parcialmente reembolsados pueden ser reembolsados." -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "Incongruencia en el ID de transacción." -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "Formato de ID de transacción inválido para el reembolso." -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "Error al procesar el reembolso a través de la API de Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "Error al actualizar el registro de pago después del reembolso." #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "Reembolso realizado con éxito." #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "Error al procesar el reembolso. Por favor, inténtelo de nuevo." -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "La pausa de la suscripción falló." -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "Completo" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "Parcial" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 #, php-format msgid "Refund ID: %s" msgstr "ID de reembolso: %s" @@ -12944,9 +13005,9 @@ msgstr "ID de reembolso: %s" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 #, php-format msgid "Refund Amount: %1$s %2$s" msgstr "Monto del reembolso: %1$s %2$s" @@ -12954,9 +13015,9 @@ msgstr "Monto del reembolso: %1$s %2$s" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 #, php-format msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "Total reembolsado: %1$s %2$s de %3$s %4$s" @@ -12964,9 +13025,9 @@ msgstr "Total reembolsado: %1$s %2$s de %3$s %4$s" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 #, php-format msgid "Refund Status: %s" msgstr "Estado del reembolso: %s" @@ -12975,10 +13036,10 @@ msgstr "Estado del reembolso: %s" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 #, php-format msgid "Payment Status: %s" msgstr "Estado del Pago: %s" @@ -12986,132 +13047,132 @@ msgstr "Estado del Pago: %s" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 #, php-format msgid "Refunded by: %s" msgstr "Reembolsado por: %s" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 #, php-format msgid "Refund Notes: %s" msgstr "Notas de reembolso: %s" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 #, php-format msgid "%s Payment Refund" msgstr "Reembolso de pago %s" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 #, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "Los webhooks mantienen a SureForms sincronizado con Stripe al actualizar automáticamente los datos de pago y suscripción. Por favor, %1$s Webhook." -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "configurar" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "Parámetros de reembolso inválidos proporcionados." -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "Este pago no está relacionado con una suscripción." -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "Solo los pagos de suscripción activos, exitosos o parcialmente reembolsados pueden ser reembolsados." -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "La creación del reembolso de Stripe falló. Por favor, revisa tu panel de Stripe para más detalles." -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "El reembolso fue procesado por Stripe, pero no se actualizó en los registros locales. Por favor, revise sus registros de pago manualmente." -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "Reembolso del pago de la suscripción realizado con éxito." #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 +#: inc/payments/stripe/admin-stripe-handler.php:977 #, php-format msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "El monto del reembolso excede el monto disponible. Máximo reembolsable: %1$s %2$s" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "El monto del reembolso debe ser mayor que cero." -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "El monto del reembolso debe ser al menos de $0.50." -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "No se puede determinar el método de reembolso adecuado para este pago de suscripción." #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 +#: inc/payments/stripe/admin-stripe-handler.php:1256 #, php-format msgid "%s Subscription Payment Refund" msgstr "Reembolso del pago de suscripción %s" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "Este pago ya ha sido reembolsado por completo." -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "No se pudo encontrar el pago en Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "El monto del reembolso excede el monto disponible para reembolso." -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "No se pudo encontrar el pago de esta suscripción." -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "No se pudo encontrar la suscripción en Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "Esta suscripción no tiene pagos exitosos para reembolsar." -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "El método de pago para esta suscripción no es válido." -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "Permisos insuficientes para procesar reembolsos." -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "Demasiadas solicitudes. Por favor, inténtelo de nuevo en un momento." -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "Error de red. Por favor, verifica tu conexión e inténtalo de nuevo." #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 +#: inc/payments/stripe/admin-stripe-handler.php:1308 #, php-format msgid "Subscription refund failed: %s" msgstr "Reembolso de suscripción fallido: %s" @@ -13261,7 +13322,7 @@ msgstr "Cancelado a las: %s" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 +#: inc/payments/stripe/stripe-webhook.php:892 #, php-format msgid "Cancellation Reason: %s" msgstr "Razón de cancelación: %s" @@ -13280,24 +13341,24 @@ msgstr "Suscripción cancelada" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "Webhook" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "Reembolso cancelado" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:882 #, php-format msgid "Canceled Refund Amount: %1$s %2$s" msgstr "Monto de reembolso cancelado: %1$s %2$s" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 +#: inc/payments/stripe/stripe-webhook.php:885 #, php-format msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "Reembolso restante: %1$s %2$s de %3$s %4$s" @@ -13306,52 +13367,52 @@ msgstr "Reembolso restante: %1$s %2$s de %3$s %4$s" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:896 #, php-format msgid "Canceled by: %s" msgstr "Cancelado por: %s" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "El pago inicial de la suscripción se realizó con éxito" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 #, php-format msgid "Invoice ID: %s" msgstr "ID de factura: %s" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "Estado del pago: Exitoso" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "Estado de la suscripción: Activa" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "Pago de Cargo de Suscripción" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "Exitoso" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 +#: inc/payments/stripe/stripe-webhook.php:1126 #, php-format msgid "Customer Email: %s" msgstr "Correo Electrónico del Cliente: %s" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 +#: inc/payments/stripe/stripe-webhook.php:1128 #, php-format msgid "Customer Name: %s" msgstr "Nombre del cliente: %s" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "Creado a través del ciclo de facturación por suscripción" @@ -13359,19 +13420,20 @@ msgstr "Creado a través del ciclo de facturación por suscripción" msgid "Edit this form" msgstr "Edita este formulario" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." msgstr "Su formulario ha sido enviado con éxito. Revisaremos sus detalles y nos pondremos en contacto con usted pronto." #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "Se requiere el ID de entrada." #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "Entrada no encontrada." @@ -13571,6 +13633,7 @@ msgstr "Seleccione el campo de correo electrónico que contiene el correo electr #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13583,6 +13646,7 @@ msgstr "Base de Conocimientos" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13664,6 +13728,7 @@ msgid "Go to Forms" msgstr "Ir a Formularios" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13671,6 +13736,7 @@ msgid "delete" msgstr "eliminar" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13679,6 +13745,7 @@ msgid "Please type \"%s\" in the input box" msgstr "Por favor, escribe \"%s\" en el cuadro de entrada" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13687,6 +13754,7 @@ msgid "To confirm, type \"%s\" in the box below:" msgstr "Para confirmar, escriba \"%s\" en el cuadro de abajo:" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14113,7 +14181,7 @@ msgstr "Utiliza la IA para generar formularios al instante a partir de un simple msgid "Build engaging conversational, calculation, and multi-step forms." msgstr "Construye formularios conversacionales, de cálculo y de múltiples pasos atractivos." -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "Crear formulario" @@ -14897,22 +14965,22 @@ msgstr "Nota: La suscripción ha sido cancelada permanentemente. El cliente ya n #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "Pausado" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 +#: inc/payments/stripe/admin-stripe-handler.php:521 #, php-format msgid "Paused by: %s" msgstr "Pausado por: %s" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "Nota: La facturación de la suscripción ha sido pausada. No se realizarán cargos hasta que se reanude la suscripción." -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "Suscripción pausada" @@ -14921,6 +14989,7 @@ msgid "This entry will be moved to trash and can be restored later." msgstr "Esta entrada se moverá a la papelera y se podrá restaurar más tarde." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "Establezca el número total de envíos permitidos para este formulario." @@ -15048,7 +15117,7 @@ msgstr "Se requiere el valor del campo de cantidad variable." msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "Importe del pago por debajo del mínimo. Mínimo: %1$s, recibido %2$s." -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "(Copiar)" @@ -15109,12 +15178,14 @@ msgstr "Esto creará una copia de \"%s\" con todas sus configuraciones." msgid "Pay with credit or debit card" msgstr "Paga con tarjeta de crédito o débito" +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 msgid "This form is not yet available. Please check back after the scheduled start time." msgstr "Este formulario aún no está disponible. Por favor, vuelva a consultar después de la hora de inicio programada." #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "Este formulario ya no acepta envíos. El período de envío ha terminado." @@ -15133,7 +15204,7 @@ msgstr "El procesamiento de reembolsos no es compatible con la pasarela %s." msgid "Number field configuration not found." msgstr "No se encontró la configuración del campo numérico." -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "Parámetros de reembolso no válidos." @@ -15248,24 +15319,24 @@ msgid "Stripe Settings" msgstr "Configuración de Stripe" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 +#: admin/admin.php:1439 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "SureForms %1$s requiere un mínimo de %2$s %3$s para funcionar correctamente. Por favor, actualice a la última versión." -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "Actualizar ahora" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "SureContact" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "¡Convierte correos electrónicos en ingresos con un CRM diseñado para tu sitio web!" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "Envía boletines, ejecuta campañas, configura automatizaciones, gestiona contactos y ve exactamente cuánto ingreso generan tus correos electrónicos, todo en un solo lugar." @@ -15301,13 +15372,14 @@ msgstr "Posición del signo de moneda" msgid "Select the position of the currency symbol relative to the amount." msgstr "Seleccione la posición del símbolo de moneda en relación con la cantidad." -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -15315,40 +15387,40 @@ msgstr "Seleccione la posición del símbolo de moneda en relación con la canti msgid "Learn" msgstr "Aprender" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "¡Increíble! SureForms está impulsando tus formularios y envíos - ¡sigamos creciendo juntos!" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "Si SureForms ha sido útil, ¿te importaría tomarte un momento para dejar una reseña de 5 estrellas en WordPress.org?" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "Quizás más tarde" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "Ya lo hice" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "SureForms está listo para potenciar tus formularios — ¡explora lo que es posible!" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "Administra tus formularios, realiza un seguimiento de las presentaciones y descubre funciones como el Creador de Formularios con IA, integraciones de pago y más desde el panel de SureForms." -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "Ir al panel de control" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "Ya lo sé" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "Parámetros no válidos." @@ -15510,7 +15582,7 @@ msgstr "Se requiere al menos un campo de formulario." msgid "Failed to generate form fields from the provided data." msgstr "Error al generar los campos del formulario a partir de los datos proporcionados." -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "Error al crear el formulario." @@ -15730,15 +15802,16 @@ msgstr "Campo de texto" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "Este formulario aún no está disponible. Vuelve a consultar después de la hora de inicio programada." +#: inc/admin/html-form-detector.php:268 #: inc/form-submit.php:99 #: inc/form-submit.php:400 #: inc/form-submit.php:445 -#: inc/form-submit.php:968 +#: inc/form-submit.php:997 #: inc/payments/front-end.php:78 #: inc/payments/front-end.php:263 #: inc/rest-api.php:98 @@ -15752,9 +15825,10 @@ msgstr "Este formulario aún no está disponible. Vuelve a consultar después de #: inc/rest-api.php:667 #: inc/rest-api.php:716 #: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 msgid "Security verification failed. Please refresh the page and try again." msgstr "La verificación de seguridad falló. Por favor, actualice la página e inténtelo de nuevo." @@ -15787,19 +15861,19 @@ msgstr "Por favor, revise el formulario en busca de errores." msgid "Your submission was flagged as spam. Please try again." msgstr "Tu envío fue marcado como spam. Por favor, inténtalo de nuevo." -#: inc/form-submit.php:651 +#: inc/form-submit.php:680 msgid "Unable to submit form. Please try again." msgstr "No se puede enviar el formulario. Por favor, inténtelo de nuevo." -#: inc/form-submit.php:903 +#: inc/form-submit.php:932 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "No se detectó ningún complemento SMTP. Por favor, configure un complemento SMTP para habilitar el envío de correos electrónicos." -#: inc/form-submit.php:904 +#: inc/form-submit.php:933 msgid "Email sending failed for an unknown reason." msgstr "El envío del correo electrónico falló por una razón desconocida." -#: inc/form-submit.php:943 +#: inc/form-submit.php:972 msgid "No emails were sent." msgstr "No se enviaron correos electrónicos." @@ -15984,7 +16058,7 @@ msgstr "No se puede crear el pago. Por favor, contacte con el soporte." msgid "Subscription canceled successfully!" msgstr "¡Suscripción cancelada con éxito!" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "¡Suscripción pausada con éxito!" @@ -16016,8 +16090,8 @@ msgstr "No se puede eliminar el webhook." msgid "Unable to connect to Stripe." msgstr "No se puede conectar a Stripe." -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "Este formulario está cerrado. El período de presentación ha terminado." @@ -16056,28 +16130,28 @@ msgstr "Acción no válida. Usa \"leer\" o \"no leído\"." msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "Acción no válida. Usa \"trash\" o \"restore\"." -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "Seleccione al menos un formulario y especifique una acción." -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "Formulario no encontrado o no es un tipo de formulario válido." -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "Este formulario ya está en la papelera." -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "Este formulario no está en la papelera." -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "Acción no válida." #. translators: %s: action name -#: inc/rest-api.php:1100 +#: inc/rest-api.php:1124 #, php-format msgid "Failed to %s this form. Please try again." msgstr "Error al %s este formulario. Por favor, inténtelo de nuevo." @@ -16220,10 +16294,6 @@ msgstr "Información de entrada" msgid "Resend Email Notification" msgstr "Reenviar notificación de correo electrónico" -#: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." -msgstr "Cuando esté habilitado, este formulario no almacenará la IP del usuario, el nombre del navegador ni el nombre del dispositivo en las entradas." - #: assets/build/formEditor.js:172 msgid "Select a spam protection service. Configure API keys in Global Settings before enabling." msgstr "Seleccione un servicio de protección contra spam. Configure las claves API en Configuración Global antes de habilitarlo." @@ -16691,26 +16761,27 @@ msgstr "Secreto del webhook no configurado." msgid "Invalid webhook signature." msgstr "Firma de webhook no válida." -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "Cuestionarios" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "Entradas del cuestionario" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "Nuevo" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1006 msgid "Invalid form." msgstr "Formulario no válido." -#: inc/form-submit.php:982 +#: inc/form-submit.php:1011 msgid "Too many requests. Please try again shortly." msgstr "Demasiadas solicitudes. Por favor, inténtelo de nuevo en breve." @@ -16922,10 +16993,6 @@ msgstr "Política de Privacidad" msgid "Finish" msgstr "Terminar" -#: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." -msgstr "Elija un método de protección contra spam para este formulario para evitar envíos no deseados." - #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Send entries to 100+ popular apps." @@ -17005,6 +17072,7 @@ msgstr "Crea cuestionarios atractivos con SureForms" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "Convierte tus formularios en cuestionarios poderosos. Mejora a SureForms para desbloquear capacidades de cuestionario:" +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/surveyEmptyState.js:172 msgid "Upgrade to SureForms" @@ -17222,39 +17290,45 @@ msgstr "Perfecto para educación, formación y trivia divertida" msgid "Select this to create a quiz with scored questions and graded results." msgstr "Selecciona esto para crear un cuestionario con preguntas puntuadas y resultados calificados." -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "Informes de encuestas" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "Encabezado 1" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "Encabezado 2" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "Encabezado 3" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "Encabezado 4" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "Encabezado 5" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "Encabezado 6" @@ -17271,7 +17345,7 @@ msgid "Cancellation not supported for this gateway." msgstr "Cancelación no soportada para este gateway." #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "Suscripción cancelada con éxito." @@ -17488,10 +17562,6 @@ msgstr "Configura la clave de la API de Google Maps para la autocompletación de msgid "Help shape the future of SureForms" msgstr "Ayuda a dar forma al futuro de SureForms" -#: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " -msgstr "Comparte cómo usas el complemento para que podamos desarrollar funciones que importen, solucionar problemas más rápido y tomar decisiones más inteligentes." - #: assets/build/settings.js:172 msgid "Enable Google Address Autocomplete" msgstr "Habilitar la autocompletar de direcciones de Google" @@ -17576,16 +17646,16 @@ msgstr "Złoty polaco" msgid "Dynamic Default Value" msgstr "Valor Predeterminado Dinámico" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "¡Hola! Parece que estás creando un formulario. Crea un formulario listo para usar en menos de 30 segundos con SureForms AI, sin necesidad de configuración adicional." -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "Publicación no válida." -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "No puedes editar esta publicación." @@ -17624,7 +17694,7 @@ msgid "Error creating SureForms Form." msgstr "Error al crear el formulario de SureForms." #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 #, php-format msgid "Please enter at least %s characters." @@ -17782,22 +17852,374 @@ msgstr "La respuesta de la IA estaba vacía. Por favor, refine su solicitud y vu msgid "Unable to build form fields from the AI response." msgstr "No se pueden construir los campos del formulario a partir de la respuesta de la IA." -#: inc/post-types.php:205 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "Entradas parciales" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." +msgstr "Este formulario está ahora cerrado ya que hemos recibido todas las inscripciones." + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." +msgstr "Pestaña de configuración no válida." + +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "¡Gracias por contactarnos! Nos pondremos en contacto contigo en breve." + +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "Utiliza la acción de restaurar para recuperar un formulario eliminado antes de cambiarlo a borrador." + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "Este formulario ya es un borrador." + +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "No tienes permiso para editar este formulario." + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "Id. de formulario no válido." + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "Configuración del formulario guardada." + +#: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "El límite de entradas se basa en las entradas almacenadas para contar las presentaciones. Mientras la Configuración de Cumplimiento tenga habilitada la opción \"Nunca almacenar datos de entrada después del envío del formulario\", este límite no se aplicará. Desactive esa opción o elimine el límite de entradas para usar esta función." + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "Marcador de posición de entradas parciales" + +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "Texto de marcador de posición mostrado dentro del campo de entrada/área de texto vacío o como la primera opción vacía en un menú desplegable." + +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "Matriz de campos producida por el analizador del lado del editor." + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "HTML sin procesar de la fuente . Requerido cuando la confianza del analizador es baja para que podamos entregar el marcado al middleware de IA." + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "Descriptor de estilo de mejor esfuerzo (colores hexadecimales) extraído de los estilos en línea en el de origen." + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "No tienes permiso para convertir formularios HTML." + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "Forma convertida" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "El formulario HTML es demasiado grande para convertirlo. Por favor, simplifique el marcado o construya el formulario manualmente." + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "No se pudieron derivar campos del formulario proporcionado." + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "El servicio de SureForms AI no pudo procesar este formulario. Inténtalo de nuevo o construye el formulario manualmente." + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "El servicio de SureForms AI devolvió una respuesta inutilizable. Inténtalo de nuevo o construye el formulario manualmente." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "Utiliza una etiqueta inteligente como {get_input:country}. La primera opción cuyo título coincida con el valor resuelto se preseleccionará." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "Utiliza una etiqueta inteligente como {get_input:colors} y pasa valores separados por barras verticales en la URL (por ejemplo, ?colors=Red|Blue). Cada opción cuyo título coincida con un valor será seleccionada. También puedes encadenar múltiples etiquetas inteligentes separadas por barras verticales." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "Utiliza una etiqueta inteligente como {get_input:colors} y pasa valores separados por barras verticales en la URL (por ejemplo, ?colors=Red|Blue). Cada opción cuya etiqueta coincida con un valor será preseleccionada. También puedes encadenar múltiples etiquetas inteligentes separadas por barras verticales." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "Utiliza una etiqueta inteligente como {get_input:country}. La primera opción cuyo etiqueta coincida con el valor resuelto será preseleccionada." + +#: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "Configuraciones guardadas, pero los atributos de la publicación (contraseña / título / contenido) no se actualizaron. Intente de nuevo para persistirlos." + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "Error al guardar la configuración del formulario." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "Guardando…" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." +msgstr "Cuando esté habilitado, este formulario no almacenará la IP del usuario, el nombre del navegador ni el nombre del dispositivo en las entradas." + +#: assets/build/formEditor.js:172 +msgid "Failed to save. Please try again." +msgstr "Error al guardar. Por favor, inténtalo de nuevo." + +#: assets/build/formEditor.js:172 +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "Las claves de la API de reCAPTCHA para la versión seleccionada no están configuradas. Establézcalas en Configuración Global." + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "Por favor, seleccione una versión de reCAPTCHA." + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "Las claves de API de hCaptcha no están configuradas. Establécelas en Configuración Global." + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." +msgstr "Las claves API de Cloudflare Turnstile no están configuradas. Establézcalas en Configuración Global." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "Datos del formulario" + +#: assets/build/formEditor.js:172 +msgid "Some fields need attention" +msgstr "Algunos campos necesitan atención" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Unsaved changes" +msgstr "Cambios no guardados" + +#: assets/build/formEditor.js:172 +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "Se requiere una dirección de correo electrónico del destinatario y una línea de asunto antes de que se pueda guardar esta notificación. Corrija los campos resaltados o descarte sus cambios para volver atrás." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "Tienes cambios no guardados para esta notificación. Descártalos para volver, o quédate para guardarlos." + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "Descartar y volver" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "Quédate y arregla" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" +msgstr "Sigue editando" + +#: assets/build/formEditor.js:172 +msgid "Please provide a recipient email address." +msgstr "Por favor, proporcione una dirección de correo electrónico del destinatario." + +#: assets/build/formEditor.js:172 +msgid "Please provide a subject line." +msgstr "Por favor, proporcione una línea de asunto." + +#: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "Por favor, proporcione una URL personalizada." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "Tienes cambios no guardados. Deséchalos para continuar, o quédate para guardar tus cambios." + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "Descartar y continuar" + +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "Cambiar a borrador" + +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "%d formulario cambiado a borrador." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "¿Cambiar el formulario a borrador?" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "%d formulario se cambiará a borrador y ya no será accesible públicamente." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "Este formulario se cambiará a borrador y ya no será accesible públicamente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "SureForms no pudo autenticar esta solicitud. Por favor, recargue el editor e intente de nuevo." + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "%s — Forma convertida" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "Formulario convertido a SureForms usando IA. Revise el nuevo formulario para cualquier ajuste." + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "Formulario convertido a SureForms." + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "No tienes permiso para convertir este formulario." + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "Este formulario es demasiado grande para convertirlo. Intenta simplificar el marcado o construir el formulario manualmente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "SureForms no pudo derivar ningún campo de este formulario." + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "El servicio de SureForms AI no pudo procesar este formulario. Por favor, inténtelo de nuevo o construya el formulario manualmente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "SureForms recibió una respuesta inesperada. Por favor, inténtelo de nuevo." + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "No se pudo convertir este formulario a SureForms. Por favor, inténtelo de nuevo." + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "Convirtiendo…" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "Convertir a SureForms" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "Captura los datos del formulario en progreso en el momento en que los visitantes dejan de escribir, sin necesidad de enviar" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "Recupera las presentaciones abandonadas y haz un seguimiento con los prospectos que de otro modo perderías" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "Permite a los visitantes retomar donde lo dejaron con enlaces de reanudación seguros y compartibles" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "Deja de perder clientes potenciales por formularios abandonados" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "Vea lo que escribieron los visitantes antes de irse. Actualice a SureForms Premium para desbloquear las Entradas Parciales:" + +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "Valores predeterminados globales" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "Restricciones del formulario" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "Configurar los ajustes predeterminados que se aplican a los formularios recién creados." + +#: assets/build/settings.js:172 +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " +msgstr "Recopila información no sensible de tu sitio web, como la versión de PHP y las características utilizadas, para ayudarnos a corregir errores más rápido, tomar decisiones más inteligentes y desarrollar funciones que realmente te importen. " + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." +msgstr "Error al cargar las páginas. Por favor, actualice e intente de nuevo." + +#: assets/build/settings.js:172 +msgid "Failed to load settings. Please refresh and try again." +msgstr "Error al cargar la configuración. Por favor, actualice e intente de nuevo." + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "Los campos de validación de formularios no pueden dejarse en blanco." + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "Se requiere el correo electrónico del destinatario cuando los resúmenes de correo electrónico están habilitados." + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "Por favor, introduce un correo electrónico de destinatario válido." + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "Configuraciones guardadas." + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "Error al guardar la configuración." + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "Algunas configuraciones no se pudieron guardar. Por favor, inténtalo de nuevo." + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." +msgstr "Algunos campos tienen cambios no guardados. Deséchelos para continuar, o permanezca para guardar sus ediciones." + +#: assets/build/settings.js:172 +msgid "Discard & switch" +msgstr "Descartar y cambiar" + +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "Formularios" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "Formulario" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "Formularios" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "Agregar nuevo" @@ -18203,6 +18625,7 @@ msgstr "cuenta" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "Normal" diff --git a/languages/sureforms-fr_FR-1cb9ecd067cd971ff5d9db0b4dae2891.json b/languages/sureforms-fr_FR-1cb9ecd067cd971ff5d9db0b4dae2891.json index 62a980b7d..e230f0282 100644 --- a/languages/sureforms-fr_FR-1cb9ecd067cd971ff5d9db0b4dae2891.json +++ b/languages/sureforms-fr_FR-1cb9ecd067cd971ff5d9db0b4dae2891.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Statut"],"Form":["Formulaire"],"Fields":["Champs"],"Image":["Image"],"Activated":["Activ\u00e9"],"Activate":["Activer"],"Submit":["Soumettre"],"Global Settings":["Param\u00e8tres globaux"],"This field is required.":["Ce champ est requis."],"Form Title":["Titre du formulaire"],"Edit":["Modifier"],"Please enter a valid URL.":["Veuillez entrer une URL valide."],"Desktop":["Bureau"],"Medium":["Moyen"],"Mobile":["Mobile"],"Repeat":["R\u00e9p\u00e9ter"],"Scroll":["Faire d\u00e9filer"],"Signature":["Signature"],"Tablet":["Tablette"],"Upload":["T\u00e9l\u00e9charger"],"Basic":["De base"],"Form Settings":["Param\u00e8tres du formulaire"],"General":["G\u00e9n\u00e9ral"],"Style":["Style"],"Advanced":["Avanc\u00e9"],"No tags available":["Aucune \u00e9tiquette disponible"],"Device":["Appareil"],"Select Shortcodes":["S\u00e9lectionner les codes courts"],"Page Break Label":["\u00c9tiquette de saut de page"],"Next":["Suivant"],"Back":["Retour"],"Reset":["R\u00e9initialiser"],"Generic tags":["Balises g\u00e9n\u00e9riques"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["S\u00e9lectionner les unit\u00e9s"],"%s units":["%s unit\u00e9s"],"Margin":["Marge"],"None":["Aucun"],"Custom":["Personnalis\u00e9"],"Please add a option props to MultiButtonsControl":["Veuillez ajouter une option props \u00e0 MultiButtonsControl"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"Processing\u2026":["Traitement\u2026"],"Select Video":["S\u00e9lectionner la vid\u00e9o"],"Change Video":["Changer la vid\u00e9o"],"Select Lottie Animation":["S\u00e9lectionner l'animation Lottie"],"Change Lottie Animation":["Changer l'animation Lottie"],"Upload SVG":["T\u00e9l\u00e9charger SVG"],"Change SVG":["Modifier SVG"],"Select Image":["S\u00e9lectionner l'image"],"Change Image":["Changer l'image"],"Upload SVG?":["T\u00e9l\u00e9charger le SVG ?"],"Upload SVG can be potentially risky. Are you sure?":["T\u00e9l\u00e9charger un SVG peut \u00eatre potentiellement risqu\u00e9. \u00cates-vous s\u00fbr ?"],"Upload Anyway":["T\u00e9l\u00e9charger quand m\u00eame"],"Full Width":["Pleine largeur"],"Install":["Installer"],"Plugin Installation failed, Please try again later.":["L'installation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Plugin activation failed, Please try again later.":["L'activation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Integrations":["Int\u00e9grations"],"%s Removed from Quick Action Bar.":["%s retir\u00e9 de la barre d'action rapide."],"Add to Quick Action Bar":["Ajouter \u00e0 la barre d'action rapide"],"%s Added to Quick Action Bar.":["%s ajout\u00e9 \u00e0 la barre d'action rapide."],"Already Present in Quick Action Bar":["D\u00e9j\u00e0 pr\u00e9sent dans la barre d'action rapide"],"No results found.":["Aucun r\u00e9sultat trouv\u00e9."],"data object is empty":["l'objet de donn\u00e9es est vide"],"Add blocks to Quick Action Bar":["Ajouter des blocs \u00e0 la barre d'action rapide"],"Re-arrange block inside Quick Action Bar":["R\u00e9organiser le bloc dans la barre d'action rapide"],"Upgrade":["Mise \u00e0 niveau"],"Connecting\u2026":["Connexion\u2026"],"Install & Activate":["Installer et activer"],"Compliance Settings":["Param\u00e8tres de conformit\u00e9"],"Enable GDPR Compliance":["Activer la conformit\u00e9 RGPD"],"Never store entry data after form submission":["Ne jamais conserver les donn\u00e9es d'entr\u00e9e apr\u00e8s la soumission du formulaire"],"When enabled this form will never store Entries.":["Lorsqu'il est activ\u00e9, ce formulaire ne stockera jamais les entr\u00e9es."],"Automatically delete entries":["Supprimer automatiquement les entr\u00e9es"],"When enabled this form will automatically delete entries after a certain period of time.":["Lorsque cette option est activ\u00e9e, ce formulaire supprimera automatiquement les entr\u00e9es apr\u00e8s une certaine p\u00e9riode de temps."],"Entries older than the days set will be deleted automatically.":["Les entr\u00e9es plus anciennes que le nombre de jours d\u00e9fini seront supprim\u00e9es automatiquement."],"Custom CSS":["CSS personnalis\u00e9"],"The following CSS styles added below will only apply to this form container.":["Les styles CSS suivants ajout\u00e9s ci-dessous ne s'appliqueront qu'\u00e0 ce conteneur de formulaire."],"Visual":["Visuel"],"HTML":["HTML"],"All Data":["Toutes les donn\u00e9es"],"Add Shortcode":["Ajouter un shortcode"],"Form input tags":["Balises de saisie de formulaire"],"Comma separated values are also accepted.":["Les valeurs s\u00e9par\u00e9es par des virgules sont \u00e9galement accept\u00e9es."],"Email Notification":["Notification par e-mail"],"Name":["Nom"],"Send Email To":["Envoyer un e-mail \u00e0"],"Subject":["Sujet"],"CC":["CC"],"BCC":["Cci"],"Reply To":["R\u00e9pondre \u00e0"],"Add Notification":["Ajouter une notification"],"Email Notification disabled successfully.":["Notification par e-mail d\u00e9sactiv\u00e9e avec succ\u00e8s."],"Email Notification enabled successfully.":["Notification par e-mail activ\u00e9e avec succ\u00e8s."],"Add Key":["Ajouter une cl\u00e9"],"Add Value":["Ajouter de la valeur"],"Add":["Ajouter"],"Confirmation Message":["Message de confirmation"],"After Form Submission":["Apr\u00e8s la soumission du formulaire"],"Hide Form":["Masquer le formulaire"],"Reset Form":["R\u00e9initialiser le formulaire"],"Custom URL":["URL personnalis\u00e9e"],"Add Query Parameters":["Ajouter des param\u00e8tres de requ\u00eate"],"Select if you want to add key-value pairs for form fields to include in query parameters":["S\u00e9lectionnez si vous souhaitez ajouter des paires cl\u00e9-valeur pour les champs de formulaire \u00e0 inclure dans les param\u00e8tres de requ\u00eate"],"Query Parameters":["Param\u00e8tres de requ\u00eate"],"Please select a page.":["Veuillez s\u00e9lectionner une page."],"Suggestion: URL should use HTTPS":["Suggestion : l'URL devrait utiliser HTTPS"],"Success Message":["Message de r\u00e9ussite"],"Redirect":["Rediriger"],"Redirect to":["Rediriger vers"],"Page":["Page"],"Form Confirmation":["Confirmation du formulaire"],"Confirmation Type":["Type de confirmation"],"Use Labels as Placeholders":["Utilisez des \u00e9tiquettes comme espaces r\u00e9serv\u00e9s"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Ce param\u00e8tre placera les \u00e9tiquettes \u00e0 l'int\u00e9rieur des champs en tant que placeholders (lorsque c'est possible). Ce param\u00e8tre prend effet uniquement sur la page en direct, pas dans l'aper\u00e7u de l'\u00e9diteur."],"Page Break":["Saut de page"],"Show Labels":["Afficher les \u00e9tiquettes"],"First Page Label":["\u00c9tiquette de la premi\u00e8re page"],"Progress Indicator":["Indicateur de progression"],"Progress Bar":["Barre de progression"],"Connector":["Connecteur"],"Steps":["\u00c9tapes"],"Next Button Text":["Texte du bouton Suivant"],"Back Button Text":["Texte du bouton retour"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["\u00cates-vous s\u00fbr de vouloir fermer ? Vos modifications non enregistr\u00e9es seront perdues car vous avez des erreurs de validation."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Il y a quelques modifications non enregistr\u00e9es. Veuillez enregistrer vos modifications pour refl\u00e9ter les mises \u00e0 jour."],"Form Behavior":["Comportement du formulaire"],"Clear":["Clair"],"Select Color":["S\u00e9lectionner la couleur"],"Primary Color":["Couleur primaire"],"Text Color":["Couleur du texte"],"Text Color on Primary":["Couleur du texte sur primaire"],"Field Spacing":["Espacement des champs"],"Small":["Petit"],"Large":["Grand"],"Left":["Gauche"],"Center":["Centre"],"Right":["D'accord"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["Tourniquet CloudFlare"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["S\u00e9lecteur de date"],"Time Picker":["S\u00e9lecteur d'heure"],"Hidden":["Cach\u00e9"],"Slider":["Curseur"],"Rating":["\u00c9valuation"],"Upgrade to Unlock These Fields":["Mettez \u00e0 niveau pour d\u00e9bloquer ces champs"],"Add Block":["Ajouter un bloc"],"Customize with SureForms":["Personnalisez avec SureForms"],"Page break":["Saut de page"],"Previous":["Pr\u00e9c\u00e9dent"],"Thank you":["Merci"],"Form submitted successfully!":["Formulaire soumis avec succ\u00e8s !"],"Instant Form":["Formulaire instantan\u00e9"],"Enable Instant Form":["Activer le formulaire instantan\u00e9"],"Enable Preview":["Activer l'aper\u00e7u"],"Show Title":["Titre de l'\u00e9mission"],"Site Logo":["Logo du site"],"Banner Background":["Arri\u00e8re-plan de la banni\u00e8re"],"Color":["Couleur"],"Upload Image":["T\u00e9l\u00e9charger l'image"],"Background Color":["Couleur de fond"],"Use banner as page background":["Utiliser la banni\u00e8re comme arri\u00e8re-plan de page"],"Form Width":["Largeur du formulaire"],"URL":["URL"],"URL Slug":["Slug d'URL"],"The last part of the URL.":["La derni\u00e8re partie de l'URL."],"Learn more.":["En savoir plus."],"SureForms Description":["Description de SureForms"],"Form Options":["Options de formulaire"],"Form Shortcode":["Code court de formulaire"],"Paste this shortcode on the page or post to render this form.":["Collez ce shortcode sur la page ou l'article pour afficher ce formulaire."],"Spam Protection":["Protection contre le spam"],"Auto":["Auto"],"Normal":["Normal"],"%":["%"],"Top":["Haut"],"Bottom":["Bas"],"Solid":["Solide"],"Width":["Largeur"],"Size":["Taille"],"EM":["EM"],"Padding":["Rembourrage"],"Color 1":["Couleur 1"],"Color 2":["Couleur 2"],"Type":["Type"],"Linear":["Lin\u00e9aire"],"Radial":["Radial"],"Location 1":["Emplacement 1"],"Location 2":["Emplacement 2"],"Angle":["Angle"],"Classic":["Classique"],"Gradient":["Gradient"],"Background":["Contexte"],"Cover":["Couvrir"],"Contain":["Contenir"],"Overlay":["Superposition"],"No Repeat":["Pas de r\u00e9p\u00e9tition"],"Overlay Opacity":["Opacit\u00e9 de superposition"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Les noms de classe doivent \u00eatre s\u00e9par\u00e9s par des espaces. Chaque nom de classe ne doit pas commencer par un chiffre, un tiret ou un soulignement. Ils peuvent uniquement inclure des lettres (y compris les caract\u00e8res Unicode), des chiffres, des tirets et des soulignements."],"Conversational Layout":["Disposition conversationnelle"],"Unlock Conversational Forms":["D\u00e9verrouiller les formulaires conversationnels"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Avec le plan SureForms Pro, vous pouvez transformer vos formulaires en mises en page conversationnelles engageantes pour une exp\u00e9rience utilisateur fluide."],"Premium":["Premium"],"Overlay Type":["Type de superposition"],"Image Overlay Color":["Couleur de superposition d'image"],"Image Position":["Position de l'image"],"Attachment":["Pi\u00e8ce jointe"],"Fixed":["Fix\u00e9"],"Blend Mode":["Mode de fusion"],"Multiply":["Multiplier"],"Screen":["\u00c9cran"],"Darken":["Assombrir"],"Lighten":["All\u00e9ger"],"Color Dodge":["Superposition de couleurs"],"Saturation":["Saturation"],"Repeat-x":["R\u00e9p\u00e9ter-x"],"Repeat-y":["R\u00e9p\u00e8te-y"],"PX":["PX"],"Button":["Bouton"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connectez-vous avec OttoKit"],"SUREFORMS PREMIUM FIELDS":["CHAMPS PREMIUM SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%1$s). Cela peut entra\u00eener le blocage ou le marquage de vos e-mails de notification comme spam. Alternativement, essayez d'utiliser une adresse De qui correspond au nom de domaine de votre site web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%s). Cela peut entra\u00eener le blocage de vos e-mails de notification ou leur classement en tant que spam."],"We strongly recommend that you install the free ":["Nous vous recommandons vivement d'installer le gratuit"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin ! L'assistant de configuration facilite la correction de vos e-mails."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativement, essayez d'utiliser une adresse d'exp\u00e9diteur qui correspond au domaine de votre site web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Veuillez entrer une adresse e-mail valide. Vos notifications ne seront pas envoy\u00e9es si le champ n'est pas correctement rempli."],"From Name":["De la part de Nom"],"From Email":["De l'email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'adresse e-mail actuelle de l'exp\u00e9diteur peut ne pas correspondre au nom de domaine de votre site web (%1$s). Cela peut entra\u00eener le blocage ou le marquage comme spam de vos e-mails de notification. Alternativement, essayez d'utiliser une adresse de l'exp\u00e9diteur qui correspond au nom de domaine de votre site web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'adresse e-mail actuelle 'De' peut ne pas correspondre au nom de domaine de votre site web (%s). Cela peut entra\u00eener le blocage de vos e-mails de notification ou leur marquage comme spam."],"Border Radius":["Rayon de bordure"],"Form Theme":["Th\u00e8me du formulaire"],"Instant Form Padding":["Remplissage instantan\u00e9 de formulaire"],"Instant Form Border Radius":["Rayon de bordure de formulaire instantan\u00e9"],"Select Gradient":["S\u00e9lectionner le d\u00e9grad\u00e9"],"Upgrade Now":["Mettez \u00e0 niveau maintenant"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Les entr\u00e9es plus anciennes que les jours s\u00e9lectionn\u00e9s seront supprim\u00e9es."],"Entries Time Period":["P\u00e9riode des entr\u00e9es"],"Custom CSS Panel":["Panneau CSS personnalis\u00e9"],"Notifications can use only one From Email so please enter a single address.":["Les notifications ne peuvent utiliser qu'une seule adresse e-mail d'exp\u00e9diteur, veuillez donc entrer une seule adresse."],"Email Notifications":["Notifications par e-mail"],"Actions":["Actions"],"Duplicate":["Dupliquer"],"Delete":["Supprimer"],"Select Page to redirect":["S\u00e9lectionnez la page \u00e0 rediriger"],"Search for a page":["Rechercher une page"],"Select a page":["S\u00e9lectionnez une page"],"reCAPTCHA v2":["reCAPTCHA v2"],"Login":["Connexion"],"Register":["Inscrire"],"Date":["Date"],"Advanced Settings":["Param\u00e8tres avanc\u00e9s"],"Form Restriction":["Restriction de formulaire"],"Maximum Number of Entries":["Nombre maximum d'entr\u00e9es"],"Maximum Entries":["Entr\u00e9es maximales"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["Le param\u00e8tre de p\u00e9riode fonctionne selon le fuseau horaire de votre site WordPress. Cliquez ici<\/a> pour ouvrir les param\u00e8tres g\u00e9n\u00e9raux de WordPress, o\u00f9 vous pouvez le v\u00e9rifier et le mettre \u00e0 jour."],"Click here":["Cliquez ici"],"Response Description After Maximum Entries":["Description de la r\u00e9ponse apr\u00e8s le nombre maximum d'entr\u00e9es"],"All changes will be saved automatically when you press back.":["Toutes les modifications seront enregistr\u00e9es automatiquement lorsque vous appuyez sur retour."],"Repeater":["R\u00e9p\u00e9teur"],"OttoKit Settings":["Param\u00e8tres OttoKit"],"Get Started":["Commencer"],"Connect Native Integrations with SureForms":["Connectez les int\u00e9grations natives avec SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Format attendu pour les e-mails - email@sureforms.com ou John Doe "],"Payment":["Paiement"],"%s - Order ID":["%s - ID de commande"],"%s - Amount":["%s - Montant"],"%s - Customer Email":["%s - Email du client"],"%s - Customer Name":["%s - Nom du client"],"%s - Status":["%s - Statut"],"Add custom CSS rules to style this specific form independently of global styles.":["Ajoutez des r\u00e8gles CSS personnalis\u00e9es pour styliser ce formulaire sp\u00e9cifique ind\u00e9pendamment des styles globaux."],"Spam Protection Type":["Type de protection contre le spam"],"Select Security Type":["S\u00e9lectionner le type de s\u00e9curit\u00e9"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Remarque : L'utilisation de diff\u00e9rentes versions de reCAPTCHA (case \u00e0 cocher V2 et V3) sur la m\u00eame page cr\u00e9era des conflits entre les versions. Veuillez \u00e9viter d'utiliser diff\u00e9rentes versions sur la m\u00eame page."],"Select Version":["S\u00e9lectionner la version"],"Please configure the API keys correctly from the settings":["Veuillez configurer correctement les cl\u00e9s API depuis les param\u00e8tres"],"Control email alerts sent to admins or users after a form submission.":["Contr\u00f4lez les alertes par e-mail envoy\u00e9es aux administrateurs ou aux utilisateurs apr\u00e8s la soumission d'un formulaire."],"Customize the confirmation message or redirect the users after submitting the form.":["Personnalisez le message de confirmation ou redirigez les utilisateurs apr\u00e8s avoir soumis le formulaire."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["D\u00e9finissez des limites sur le nombre de fois qu'un formulaire peut \u00eatre soumis et g\u00e9rez les options de conformit\u00e9, y compris le RGPD et la conservation des donn\u00e9es."],"Go to OttoKit Settings":["Acc\u00e9dez aux param\u00e8tres OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Connectez SureForms \u00e0 vos applications pr\u00e9f\u00e9r\u00e9es pour automatiser les t\u00e2ches et synchroniser les donn\u00e9es en toute transparence."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["D\u00e9bloquez des int\u00e9grations puissantes dans le plan Premium pour automatiser vos flux de travail et connecter SureForms directement \u00e0 vos outils pr\u00e9f\u00e9r\u00e9s."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Envoyez les soumissions de formulaires directement aux CRM, par e-mail et aux plateformes de marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatisez les t\u00e2ches r\u00e9p\u00e9titives avec une synchronisation des donn\u00e9es transparente."],"Access exclusive native integrations for faster workflows.":["Acc\u00e9dez \u00e0 des int\u00e9grations natives exclusives pour des flux de travail plus rapides."],"PDF Generation":["G\u00e9n\u00e9ration de PDF"],"Generate and customize PDF copies of form submissions.":["G\u00e9n\u00e9rez et personnalisez des copies PDF des soumissions de formulaires."],"Generate Submission PDFs":["G\u00e9n\u00e9rer des PDF de soumission"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Transformez chaque entr\u00e9e de formulaire en un fichier PDF soign\u00e9, le rendant parfait pour les rapports, les archives ou le partage."],"Automatically generate PDFs from your form submissions.":["G\u00e9n\u00e9rez automatiquement des PDF \u00e0 partir de vos soumissions de formulaires."],"Customize PDF templates with your branding.":["Personnalisez les mod\u00e8les PDF avec votre marque."],"Download or email PDFs instantly.":["T\u00e9l\u00e9chargez ou envoyez des PDF par e-mail instantan\u00e9ment."],"User Registration":["Inscription de l'utilisateur"],"Onboard new users or update existing accounts through beautiful looking forms.":["Int\u00e9grez de nouveaux utilisateurs ou mettez \u00e0 jour les comptes existants gr\u00e2ce \u00e0 de magnifiques formulaires."],"Register Users with SureForms":["Enregistrez les utilisateurs avec SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Simplifiez l'ensemble du processus d'int\u00e9gration des utilisateurs pour vos sites avec des connexions et inscriptions fluides aliment\u00e9es par des formulaires."],"Register new users directly via your form submissions.":["Enregistrez de nouveaux utilisateurs directement via vos soumissions de formulaire."],"Create or update existing accounts by mapping form data to user fields.":["Cr\u00e9er ou mettre \u00e0 jour des comptes existants en associant les donn\u00e9es du formulaire aux champs utilisateur."],"Assign roles and control access automatically.":["Attribuez des r\u00f4les et contr\u00f4lez l'acc\u00e8s automatiquement."],"Post Feed":["Fil d'actualit\u00e9s"],"Transform your form submission into WordPress posts.":["Transformez votre soumission de formulaire en articles WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Transformez automatiquement les soumissions de formulaires en articles, pages ou types de publication personnalis\u00e9s WordPress. Gagnez beaucoup de temps et laissez vos formulaires publier du contenu directement."],"Create posts, pages, or CPTs from your form entries.":["Cr\u00e9ez des articles, des pages ou des CPT \u00e0 partir de vos entr\u00e9es de formulaire."],"Map form fields to your post fields easily.":["Associez facilement les champs de formulaire \u00e0 vos champs de publication."],"Automate the content publishing flow with few simple steps.":["Automatisez le flux de publication de contenu en quelques \u00e9tapes simples."],"Automations":["Automatisations"],"Unlock Advanced Styling":["D\u00e9verrouiller le style avanc\u00e9"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Obtenez un contr\u00f4le total sur l'apparence de votre formulaire avec des couleurs, des polices et des mises en page personnalis\u00e9es."],"Button Alignment":["Alignement du bouton"],"Add Custom CSS Class(es)":["Ajouter une ou plusieurs classes CSS personnalis\u00e9es"],"Set the total number of submissions allowed for this form.":["D\u00e9finissez le nombre total de soumissions autoris\u00e9es pour ce formulaire."],"Save & Progress":["Enregistrer et progresser"],"Allow users to save their progress and continue form completion later.":["Permettre aux utilisateurs de sauvegarder leur progression et de continuer \u00e0 remplir le formulaire plus tard."],"Save & Progress in SureForms":["Enregistrer & Progresser dans SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Donnez \u00e0 vos utilisateurs la flexibilit\u00e9 de remplir les formulaires \u00e0 leur propre rythme en leur permettant de sauvegarder leur progression et de revenir \u00e0 tout moment."],"Let users pause long or multi-step forms and continue later.":["Permettez aux utilisateurs de mettre en pause les formulaires longs ou \u00e0 \u00e9tapes multiples et de continuer plus tard."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["R\u00e9duisez l'abandon de formulaire avec des liens de reprise pratiques et acc\u00e9dez \u00e0 leur progression de n'importe o\u00f9."],"Improve user experience for lengthy, complex, or multi-page forms.":["Am\u00e9liorer l'exp\u00e9rience utilisateur pour les formulaires longs, complexes ou multi-pages."],"This form is not yet available. Please check back after the scheduled start time.":["Ce formulaire n'est pas encore disponible. Veuillez revenir apr\u00e8s l'heure de d\u00e9but pr\u00e9vue."],"This form is no longer accepting submissions. The submission period has ended.":["Ce formulaire n'accepte plus les soumissions. La p\u00e9riode de soumission est termin\u00e9e."],"The start date and time must be before the end date and time.":["La date et l'heure de d\u00e9but doivent \u00eatre ant\u00e9rieures \u00e0 la date et l'heure de fin."],"Form Scheduling":["Planification de formulaire"],"Enable Form Scheduling":["Activer la planification des formulaires"],"Set a time period during which this form will be available for submissions.":["D\u00e9finissez une p\u00e9riode pendant laquelle ce formulaire sera disponible pour les soumissions."],"Start Date & Time":["Date et heure de d\u00e9but"],"End Date & Time":["Date et heure de fin"],"Response Description Before Start Date":["Description de la r\u00e9ponse avant la date de d\u00e9but"],"Response Description After End Date":["Description de la r\u00e9ponse apr\u00e8s la date de fin"],"Conditional Confirmations":["Confirmations conditionnelles"],"Set up the message or redirect users will see after submitting the form.":["Configurez le message ou la redirection que les utilisateurs verront apr\u00e8s avoir soumis le formulaire."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Montrez le bon message au bon utilisateur en fonction de sa r\u00e9ponse. Personnalisez les confirmations avec des conditions intelligentes et guidez automatiquement les utilisateurs vers la prochaine meilleure \u00e9tape."],"Display different confirmation messages based on form responses.":["Afficher diff\u00e9rents messages de confirmation en fonction des r\u00e9ponses du formulaire."],"Redirect users to specific pages or URLs conditionally.":["Rediriger les utilisateurs vers des pages ou des URL sp\u00e9cifiques de mani\u00e8re conditionnelle."],"Create personalized thank-you messages without extra forms.":["Cr\u00e9ez des messages de remerciement personnalis\u00e9s sans formulaires suppl\u00e9mentaires."],"Lost Password":["Mot de passe perdu"],"Reset Password":["R\u00e9initialiser le mot de passe"],"When enabled, this form will not store user IP, browser name, or device name in entries.":["Lorsqu'elle est activ\u00e9e, ce formulaire ne stockera pas l'IP de l'utilisateur, le nom du navigateur ou le nom de l'appareil dans les entr\u00e9es."],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["S\u00e9lectionnez un service de protection contre le spam. Configurez les cl\u00e9s API dans les Param\u00e8tres Globaux avant de l'activer."],"Send as Raw HTML":["Envoyer en HTML brut"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Lorsqu'elle est activ\u00e9e, le corps de l'email en HTML sera conserv\u00e9 exactement tel qu'il est \u00e9crit et int\u00e9gr\u00e9 dans un mod\u00e8le d'email professionnel."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Les balises intelligentes qui font r\u00e9f\u00e9rence \u00e0 des champs soumis par l'utilisateur ne seront pas \u00e9chapp\u00e9es en mode HTML brut. \u00c9vitez d'ins\u00e9rer directement des valeurs de champs non fiables dans le corps de l'e-mail."],"Please provide a recipient email address and subject line.":["Veuillez fournir une adresse e-mail du destinataire et une ligne d'objet."],"Email notification duplicated!":["Notification par e-mail dupliqu\u00e9e !"],"Are you sure you want to delete this email notification?":["\u00cates-vous s\u00fbr de vouloir supprimer cette notification par e-mail ?"],"Email notification deleted!":["Notification par e-mail supprim\u00e9e !"],"URL is missing Top Level Domain (TLD).":["L'URL manque de domaine de premier niveau (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Ce formulaire est maintenant ferm\u00e9 car le nombre maximum d'entr\u00e9es a \u00e9t\u00e9 atteint."],"Publish Your Form":["Publiez votre formulaire"],"Enable This to Instantly Publish the Form":["Activez ceci pour publier instantan\u00e9ment le formulaire"],"Style Your Instant Form Page Here":["Stylisez votre page de formulaire instantan\u00e9 ici"],"Quizzes":["Quiz"],"%s - Description":["%s - Description"],"Choose a spam protection method for this form to prevent unwanted submissions.":["Choisissez une m\u00e9thode de protection contre le spam pour ce formulaire afin de pr\u00e9venir les soumissions ind\u00e9sirables."],"Send entries to 100+ popular apps.":["Envoyez des entr\u00e9es \u00e0 plus de 100 applications populaires."],"Build automated workflows that run instantly.":["Cr\u00e9ez des flux de travail automatis\u00e9s qui s'ex\u00e9cutent instantan\u00e9ment."],"Create custom app integrations using our Custom App feature.":["Cr\u00e9ez des int\u00e9grations d'applications personnalis\u00e9es en utilisant notre fonctionnalit\u00e9 d'application personnalis\u00e9e."],"Keep your tools in sync automatically.":["Gardez vos outils synchronis\u00e9s automatiquement."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Cela installera et activera OttoKit sur votre site WordPress pour activer les fonctionnalit\u00e9s d'automatisation."],"Automate Your Forms with OttoKit":["Automatisez vos formulaires avec OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Chaque soumission de formulaire devrait d\u00e9clencher quelque chose \u2014 une alerte Slack, un lead CRM, un e-mail de suivi, ou une nouvelle ligne dans Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Cr\u00e9ez des quiz interactifs pour engager votre audience et recueillir des informations."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Concevez des quiz engageants avec divers types de questions, des retours personnalis\u00e9s et une notation automatis\u00e9e pour captiver votre audience et obtenir des informations pr\u00e9cieuses."],"Create interactive quizzes with multiple question types.":["Cr\u00e9ez des quiz interactifs avec plusieurs types de questions."],"Provide personalized feedback based on user responses.":["Fournir des commentaires personnalis\u00e9s en fonction des r\u00e9ponses des utilisateurs."],"Automate scoring and lead segmentation for better insights.":["Automatisez le scoring et la segmentation des leads pour de meilleures perspectives."],"Heading 1":["Titre 1"],"Heading 2":["Titre 2"],"Heading 3":["Titre 3"],"Heading 4":["Titre 4"],"Heading 5":["Titre 5"],"Heading 6":["Titre 6"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Statut"],"Form":["Formulaire"],"Fields":["Champs"],"Image":["Image"],"Activated":["Activ\u00e9"],"Activate":["Activer"],"Submit":["Soumettre"],"Global Settings":["Param\u00e8tres globaux"],"Form Title":["Titre du formulaire"],"Edit":["Modifier"],"Please enter a valid URL.":["Veuillez entrer une URL valide."],"Desktop":["Bureau"],"Medium":["Moyen"],"Mobile":["Mobile"],"Repeat":["R\u00e9p\u00e9ter"],"Scroll":["Faire d\u00e9filer"],"Signature":["Signature"],"Tablet":["Tablette"],"Upload":["T\u00e9l\u00e9charger"],"Basic":["De base"],"Form Settings":["Param\u00e8tres du formulaire"],"General":["G\u00e9n\u00e9ral"],"Style":["Style"],"Advanced":["Avanc\u00e9"],"No tags available":["Aucune \u00e9tiquette disponible"],"Device":["Appareil"],"Select Shortcodes":["S\u00e9lectionner les codes courts"],"Page Break Label":["\u00c9tiquette de saut de page"],"Next":["Suivant"],"Back":["Retour"],"Reset":["R\u00e9initialiser"],"Generic tags":["Balises g\u00e9n\u00e9riques"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["S\u00e9lectionner les unit\u00e9s"],"%s units":["%s unit\u00e9s"],"Margin":["Marge"],"None":["Aucun"],"Custom":["Personnalis\u00e9"],"Please add a option props to MultiButtonsControl":["Veuillez ajouter une option props \u00e0 MultiButtonsControl"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"Processing\u2026":["Traitement\u2026"],"Select Video":["S\u00e9lectionner la vid\u00e9o"],"Change Video":["Changer la vid\u00e9o"],"Select Lottie Animation":["S\u00e9lectionner l'animation Lottie"],"Change Lottie Animation":["Changer l'animation Lottie"],"Upload SVG":["T\u00e9l\u00e9charger SVG"],"Change SVG":["Modifier SVG"],"Select Image":["S\u00e9lectionner l'image"],"Change Image":["Changer l'image"],"Upload SVG?":["T\u00e9l\u00e9charger le SVG ?"],"Upload SVG can be potentially risky. Are you sure?":["T\u00e9l\u00e9charger un SVG peut \u00eatre potentiellement risqu\u00e9. \u00cates-vous s\u00fbr ?"],"Upload Anyway":["T\u00e9l\u00e9charger quand m\u00eame"],"Full Width":["Pleine largeur"],"Install":["Installer"],"Plugin Installation failed, Please try again later.":["L'installation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Plugin activation failed, Please try again later.":["L'activation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Integrations":["Int\u00e9grations"],"%s Removed from Quick Action Bar.":["%s retir\u00e9 de la barre d'action rapide."],"Add to Quick Action Bar":["Ajouter \u00e0 la barre d'action rapide"],"%s Added to Quick Action Bar.":["%s ajout\u00e9 \u00e0 la barre d'action rapide."],"Already Present in Quick Action Bar":["D\u00e9j\u00e0 pr\u00e9sent dans la barre d'action rapide"],"No results found.":["Aucun r\u00e9sultat trouv\u00e9."],"data object is empty":["l'objet de donn\u00e9es est vide"],"Add blocks to Quick Action Bar":["Ajouter des blocs \u00e0 la barre d'action rapide"],"Re-arrange block inside Quick Action Bar":["R\u00e9organiser le bloc dans la barre d'action rapide"],"Upgrade":["Mise \u00e0 niveau"],"Connecting\u2026":["Connexion\u2026"],"Install & Activate":["Installer et activer"],"Compliance Settings":["Param\u00e8tres de conformit\u00e9"],"Enable GDPR Compliance":["Activer la conformit\u00e9 RGPD"],"Never store entry data after form submission":["Ne jamais conserver les donn\u00e9es d'entr\u00e9e apr\u00e8s la soumission du formulaire"],"When enabled this form will never store Entries.":["Lorsqu'il est activ\u00e9, ce formulaire ne stockera jamais les entr\u00e9es."],"Automatically delete entries":["Supprimer automatiquement les entr\u00e9es"],"When enabled this form will automatically delete entries after a certain period of time.":["Lorsque cette option est activ\u00e9e, ce formulaire supprimera automatiquement les entr\u00e9es apr\u00e8s une certaine p\u00e9riode de temps."],"Entries older than the days set will be deleted automatically.":["Les entr\u00e9es plus anciennes que le nombre de jours d\u00e9fini seront supprim\u00e9es automatiquement."],"Custom CSS":["CSS personnalis\u00e9"],"The following CSS styles added below will only apply to this form container.":["Les styles CSS suivants ajout\u00e9s ci-dessous ne s'appliqueront qu'\u00e0 ce conteneur de formulaire."],"Visual":["Visuel"],"HTML":["HTML"],"All Data":["Toutes les donn\u00e9es"],"Add Shortcode":["Ajouter un shortcode"],"Form input tags":["Balises de saisie de formulaire"],"Comma separated values are also accepted.":["Les valeurs s\u00e9par\u00e9es par des virgules sont \u00e9galement accept\u00e9es."],"Email Notification":["Notification par e-mail"],"Name":["Nom"],"Send Email To":["Envoyer un e-mail \u00e0"],"Subject":["Sujet"],"CC":["CC"],"BCC":["Cci"],"Reply To":["R\u00e9pondre \u00e0"],"Add Notification":["Ajouter une notification"],"Add Key":["Ajouter une cl\u00e9"],"Add Value":["Ajouter de la valeur"],"Add":["Ajouter"],"Confirmation Message":["Message de confirmation"],"After Form Submission":["Apr\u00e8s la soumission du formulaire"],"Hide Form":["Masquer le formulaire"],"Reset Form":["R\u00e9initialiser le formulaire"],"Custom URL":["URL personnalis\u00e9e"],"Add Query Parameters":["Ajouter des param\u00e8tres de requ\u00eate"],"Select if you want to add key-value pairs for form fields to include in query parameters":["S\u00e9lectionnez si vous souhaitez ajouter des paires cl\u00e9-valeur pour les champs de formulaire \u00e0 inclure dans les param\u00e8tres de requ\u00eate"],"Query Parameters":["Param\u00e8tres de requ\u00eate"],"Please select a page.":["Veuillez s\u00e9lectionner une page."],"Suggestion: URL should use HTTPS":["Suggestion : l'URL devrait utiliser HTTPS"],"Success Message":["Message de r\u00e9ussite"],"Redirect":["Rediriger"],"Redirect to":["Rediriger vers"],"Page":["Page"],"Form Confirmation":["Confirmation du formulaire"],"Confirmation Type":["Type de confirmation"],"Use Labels as Placeholders":["Utilisez des \u00e9tiquettes comme espaces r\u00e9serv\u00e9s"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Ce param\u00e8tre placera les \u00e9tiquettes \u00e0 l'int\u00e9rieur des champs en tant que placeholders (lorsque c'est possible). Ce param\u00e8tre prend effet uniquement sur la page en direct, pas dans l'aper\u00e7u de l'\u00e9diteur."],"Page Break":["Saut de page"],"Show Labels":["Afficher les \u00e9tiquettes"],"First Page Label":["\u00c9tiquette de la premi\u00e8re page"],"Progress Indicator":["Indicateur de progression"],"Progress Bar":["Barre de progression"],"Connector":["Connecteur"],"Steps":["\u00c9tapes"],"Next Button Text":["Texte du bouton Suivant"],"Back Button Text":["Texte du bouton retour"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["\u00cates-vous s\u00fbr de vouloir fermer ? Vos modifications non enregistr\u00e9es seront perdues car vous avez des erreurs de validation."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Il y a quelques modifications non enregistr\u00e9es. Veuillez enregistrer vos modifications pour refl\u00e9ter les mises \u00e0 jour."],"Form Behavior":["Comportement du formulaire"],"Clear":["Clair"],"Select Color":["S\u00e9lectionner la couleur"],"Primary Color":["Couleur primaire"],"Text Color":["Couleur du texte"],"Text Color on Primary":["Couleur du texte sur primaire"],"Field Spacing":["Espacement des champs"],"Small":["Petit"],"Large":["Grand"],"Left":["Gauche"],"Center":["Centre"],"Right":["D'accord"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["Tourniquet CloudFlare"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["S\u00e9lecteur de date"],"Time Picker":["S\u00e9lecteur d'heure"],"Hidden":["Cach\u00e9"],"Slider":["Curseur"],"Rating":["\u00c9valuation"],"Upgrade to Unlock These Fields":["Mettez \u00e0 niveau pour d\u00e9bloquer ces champs"],"Add Block":["Ajouter un bloc"],"Customize with SureForms":["Personnalisez avec SureForms"],"Page break":["Saut de page"],"Previous":["Pr\u00e9c\u00e9dent"],"Thank you":["Merci"],"Form submitted successfully!":["Formulaire soumis avec succ\u00e8s !"],"Instant Form":["Formulaire instantan\u00e9"],"Enable Instant Form":["Activer le formulaire instantan\u00e9"],"Enable Preview":["Activer l'aper\u00e7u"],"Show Title":["Titre de l'\u00e9mission"],"Site Logo":["Logo du site"],"Banner Background":["Arri\u00e8re-plan de la banni\u00e8re"],"Color":["Couleur"],"Upload Image":["T\u00e9l\u00e9charger l'image"],"Background Color":["Couleur de fond"],"Use banner as page background":["Utiliser la banni\u00e8re comme arri\u00e8re-plan de page"],"Form Width":["Largeur du formulaire"],"URL":["URL"],"URL Slug":["Slug d'URL"],"The last part of the URL.":["La derni\u00e8re partie de l'URL."],"Learn more.":["En savoir plus."],"SureForms Description":["Description de SureForms"],"Form Options":["Options de formulaire"],"Form Shortcode":["Code court de formulaire"],"Paste this shortcode on the page or post to render this form.":["Collez ce shortcode sur la page ou l'article pour afficher ce formulaire."],"Spam Protection":["Protection contre le spam"],"Auto":["Auto"],"Normal":["Normal"],"%":["%"],"Top":["Haut"],"Bottom":["Bas"],"Solid":["Solide"],"Width":["Largeur"],"Size":["Taille"],"EM":["EM"],"Padding":["Rembourrage"],"Color 1":["Couleur 1"],"Color 2":["Couleur 2"],"Type":["Type"],"Linear":["Lin\u00e9aire"],"Radial":["Radial"],"Location 1":["Emplacement 1"],"Location 2":["Emplacement 2"],"Angle":["Angle"],"Classic":["Classique"],"Gradient":["Gradient"],"Background":["Contexte"],"Cover":["Couvrir"],"Contain":["Contenir"],"Overlay":["Superposition"],"No Repeat":["Pas de r\u00e9p\u00e9tition"],"Overlay Opacity":["Opacit\u00e9 de superposition"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Les noms de classe doivent \u00eatre s\u00e9par\u00e9s par des espaces. Chaque nom de classe ne doit pas commencer par un chiffre, un tiret ou un soulignement. Ils peuvent uniquement inclure des lettres (y compris les caract\u00e8res Unicode), des chiffres, des tirets et des soulignements."],"Conversational Layout":["Disposition conversationnelle"],"Unlock Conversational Forms":["D\u00e9verrouiller les formulaires conversationnels"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Avec le plan SureForms Pro, vous pouvez transformer vos formulaires en mises en page conversationnelles engageantes pour une exp\u00e9rience utilisateur fluide."],"Premium":["Premium"],"Overlay Type":["Type de superposition"],"Image Overlay Color":["Couleur de superposition d'image"],"Image Position":["Position de l'image"],"Attachment":["Pi\u00e8ce jointe"],"Fixed":["Fix\u00e9"],"Blend Mode":["Mode de fusion"],"Multiply":["Multiplier"],"Screen":["\u00c9cran"],"Darken":["Assombrir"],"Lighten":["All\u00e9ger"],"Color Dodge":["Superposition de couleurs"],"Saturation":["Saturation"],"Repeat-x":["R\u00e9p\u00e9ter-x"],"Repeat-y":["R\u00e9p\u00e8te-y"],"PX":["PX"],"Button":["Bouton"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connectez-vous avec OttoKit"],"SUREFORMS PREMIUM FIELDS":["CHAMPS PREMIUM SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%1$s). Cela peut entra\u00eener le blocage ou le marquage de vos e-mails de notification comme spam. Alternativement, essayez d'utiliser une adresse De qui correspond au nom de domaine de votre site web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%s). Cela peut entra\u00eener le blocage de vos e-mails de notification ou leur classement en tant que spam."],"We strongly recommend that you install the free ":["Nous vous recommandons vivement d'installer le gratuit"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin ! L'assistant de configuration facilite la correction de vos e-mails."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativement, essayez d'utiliser une adresse d'exp\u00e9diteur qui correspond au domaine de votre site web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Veuillez entrer une adresse e-mail valide. Vos notifications ne seront pas envoy\u00e9es si le champ n'est pas correctement rempli."],"From Name":["De la part de Nom"],"From Email":["De l'email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'adresse e-mail actuelle de l'exp\u00e9diteur peut ne pas correspondre au nom de domaine de votre site web (%1$s). Cela peut entra\u00eener le blocage ou le marquage comme spam de vos e-mails de notification. Alternativement, essayez d'utiliser une adresse de l'exp\u00e9diteur qui correspond au nom de domaine de votre site web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'adresse e-mail actuelle 'De' peut ne pas correspondre au nom de domaine de votre site web (%s). Cela peut entra\u00eener le blocage de vos e-mails de notification ou leur marquage comme spam."],"Border Radius":["Rayon de bordure"],"Form Theme":["Th\u00e8me du formulaire"],"Instant Form Padding":["Remplissage instantan\u00e9 de formulaire"],"Instant Form Border Radius":["Rayon de bordure de formulaire instantan\u00e9"],"Select Gradient":["S\u00e9lectionner le d\u00e9grad\u00e9"],"Upgrade Now":["Mettez \u00e0 niveau maintenant"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Les entr\u00e9es plus anciennes que les jours s\u00e9lectionn\u00e9s seront supprim\u00e9es."],"Entries Time Period":["P\u00e9riode des entr\u00e9es"],"Custom CSS Panel":["Panneau CSS personnalis\u00e9"],"Notifications can use only one From Email so please enter a single address.":["Les notifications ne peuvent utiliser qu'une seule adresse e-mail d'exp\u00e9diteur, veuillez donc entrer une seule adresse."],"Email Notifications":["Notifications par e-mail"],"Actions":["Actions"],"Duplicate":["Dupliquer"],"Delete":["Supprimer"],"Select Page to redirect":["S\u00e9lectionnez la page \u00e0 rediriger"],"Search for a page":["Rechercher une page"],"Select a page":["S\u00e9lectionnez une page"],"reCAPTCHA v2":["reCAPTCHA v2"],"Save":["Sauvegarder"],"Login":["Connexion"],"Register":["Inscrire"],"Date":["Date"],"Advanced Settings":["Param\u00e8tres avanc\u00e9s"],"Form Restriction":["Restriction de formulaire"],"Maximum Number of Entries":["Nombre maximum d'entr\u00e9es"],"Maximum Entries":["Entr\u00e9es maximales"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["Le param\u00e8tre de p\u00e9riode fonctionne selon le fuseau horaire de votre site WordPress. Cliquez ici<\/a> pour ouvrir les param\u00e8tres g\u00e9n\u00e9raux de WordPress, o\u00f9 vous pouvez le v\u00e9rifier et le mettre \u00e0 jour."],"Click here":["Cliquez ici"],"Response Description After Maximum Entries":["Description de la r\u00e9ponse apr\u00e8s le nombre maximum d'entr\u00e9es"],"All changes will be saved automatically when you press back.":["Toutes les modifications seront enregistr\u00e9es automatiquement lorsque vous appuyez sur retour."],"Repeater":["R\u00e9p\u00e9teur"],"OttoKit Settings":["Param\u00e8tres OttoKit"],"Get Started":["Commencer"],"Connect Native Integrations with SureForms":["Connectez les int\u00e9grations natives avec SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Format attendu pour les e-mails - email@sureforms.com ou John Doe "],"delete":["supprimer"],"Please type \"%s\" in the input box":["Veuillez taper \"%s\" dans la bo\u00eete de saisie"],"To confirm, type \"%s\" in the box below:":["Pour confirmer, tapez \"%s\" dans la case ci-dessous :"],"Type \"%s\"":["Tapez \"%s\""],"Payment":["Paiement"],"%s - Order ID":["%s - ID de commande"],"%s - Amount":["%s - Montant"],"%s - Customer Email":["%s - Email du client"],"%s - Customer Name":["%s - Nom du client"],"%s - Status":["%s - Statut"],"Add custom CSS rules to style this specific form independently of global styles.":["Ajoutez des r\u00e8gles CSS personnalis\u00e9es pour styliser ce formulaire sp\u00e9cifique ind\u00e9pendamment des styles globaux."],"Spam Protection Type":["Type de protection contre le spam"],"Select Security Type":["S\u00e9lectionner le type de s\u00e9curit\u00e9"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Remarque : L'utilisation de diff\u00e9rentes versions de reCAPTCHA (case \u00e0 cocher V2 et V3) sur la m\u00eame page cr\u00e9era des conflits entre les versions. Veuillez \u00e9viter d'utiliser diff\u00e9rentes versions sur la m\u00eame page."],"Select Version":["S\u00e9lectionner la version"],"Please configure the API keys correctly from the settings":["Veuillez configurer correctement les cl\u00e9s API depuis les param\u00e8tres"],"Control email alerts sent to admins or users after a form submission.":["Contr\u00f4lez les alertes par e-mail envoy\u00e9es aux administrateurs ou aux utilisateurs apr\u00e8s la soumission d'un formulaire."],"Customize the confirmation message or redirect the users after submitting the form.":["Personnalisez le message de confirmation ou redirigez les utilisateurs apr\u00e8s avoir soumis le formulaire."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["D\u00e9finissez des limites sur le nombre de fois qu'un formulaire peut \u00eatre soumis et g\u00e9rez les options de conformit\u00e9, y compris le RGPD et la conservation des donn\u00e9es."],"Go to OttoKit Settings":["Acc\u00e9dez aux param\u00e8tres OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Connectez SureForms \u00e0 vos applications pr\u00e9f\u00e9r\u00e9es pour automatiser les t\u00e2ches et synchroniser les donn\u00e9es en toute transparence."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["D\u00e9bloquez des int\u00e9grations puissantes dans le plan Premium pour automatiser vos flux de travail et connecter SureForms directement \u00e0 vos outils pr\u00e9f\u00e9r\u00e9s."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Envoyez les soumissions de formulaires directement aux CRM, par e-mail et aux plateformes de marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatisez les t\u00e2ches r\u00e9p\u00e9titives avec une synchronisation des donn\u00e9es transparente."],"Access exclusive native integrations for faster workflows.":["Acc\u00e9dez \u00e0 des int\u00e9grations natives exclusives pour des flux de travail plus rapides."],"PDF Generation":["G\u00e9n\u00e9ration de PDF"],"Generate and customize PDF copies of form submissions.":["G\u00e9n\u00e9rez et personnalisez des copies PDF des soumissions de formulaires."],"Generate Submission PDFs":["G\u00e9n\u00e9rer des PDF de soumission"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Transformez chaque entr\u00e9e de formulaire en un fichier PDF soign\u00e9, le rendant parfait pour les rapports, les archives ou le partage."],"Automatically generate PDFs from your form submissions.":["G\u00e9n\u00e9rez automatiquement des PDF \u00e0 partir de vos soumissions de formulaires."],"Customize PDF templates with your branding.":["Personnalisez les mod\u00e8les PDF avec votre marque."],"Download or email PDFs instantly.":["T\u00e9l\u00e9chargez ou envoyez des PDF par e-mail instantan\u00e9ment."],"User Registration":["Inscription de l'utilisateur"],"Onboard new users or update existing accounts through beautiful looking forms.":["Int\u00e9grez de nouveaux utilisateurs ou mettez \u00e0 jour les comptes existants gr\u00e2ce \u00e0 de magnifiques formulaires."],"Register Users with SureForms":["Enregistrez les utilisateurs avec SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Simplifiez l'ensemble du processus d'int\u00e9gration des utilisateurs pour vos sites avec des connexions et inscriptions fluides aliment\u00e9es par des formulaires."],"Register new users directly via your form submissions.":["Enregistrez de nouveaux utilisateurs directement via vos soumissions de formulaire."],"Create or update existing accounts by mapping form data to user fields.":["Cr\u00e9er ou mettre \u00e0 jour des comptes existants en associant les donn\u00e9es du formulaire aux champs utilisateur."],"Assign roles and control access automatically.":["Attribuez des r\u00f4les et contr\u00f4lez l'acc\u00e8s automatiquement."],"Post Feed":["Fil d'actualit\u00e9s"],"Transform your form submission into WordPress posts.":["Transformez votre soumission de formulaire en articles WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Transformez automatiquement les soumissions de formulaires en articles, pages ou types de publication personnalis\u00e9s WordPress. Gagnez beaucoup de temps et laissez vos formulaires publier du contenu directement."],"Create posts, pages, or CPTs from your form entries.":["Cr\u00e9ez des articles, des pages ou des CPT \u00e0 partir de vos entr\u00e9es de formulaire."],"Map form fields to your post fields easily.":["Associez facilement les champs de formulaire \u00e0 vos champs de publication."],"Automate the content publishing flow with few simple steps.":["Automatisez le flux de publication de contenu en quelques \u00e9tapes simples."],"Automations":["Automatisations"],"Unlock Advanced Styling":["D\u00e9verrouiller le style avanc\u00e9"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Obtenez un contr\u00f4le total sur l'apparence de votre formulaire avec des couleurs, des polices et des mises en page personnalis\u00e9es."],"Button Alignment":["Alignement du bouton"],"Add Custom CSS Class(es)":["Ajouter une ou plusieurs classes CSS personnalis\u00e9es"],"Set the total number of submissions allowed for this form.":["D\u00e9finissez le nombre total de soumissions autoris\u00e9es pour ce formulaire."],"Save & Progress":["Enregistrer et progresser"],"Allow users to save their progress and continue form completion later.":["Permettre aux utilisateurs de sauvegarder leur progression et de continuer \u00e0 remplir le formulaire plus tard."],"Save & Progress in SureForms":["Enregistrer & Progresser dans SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Donnez \u00e0 vos utilisateurs la flexibilit\u00e9 de remplir les formulaires \u00e0 leur propre rythme en leur permettant de sauvegarder leur progression et de revenir \u00e0 tout moment."],"Let users pause long or multi-step forms and continue later.":["Permettez aux utilisateurs de mettre en pause les formulaires longs ou \u00e0 \u00e9tapes multiples et de continuer plus tard."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["R\u00e9duisez l'abandon de formulaire avec des liens de reprise pratiques et acc\u00e9dez \u00e0 leur progression de n'importe o\u00f9."],"Improve user experience for lengthy, complex, or multi-page forms.":["Am\u00e9liorer l'exp\u00e9rience utilisateur pour les formulaires longs, complexes ou multi-pages."],"This form is not yet available. Please check back after the scheduled start time.":["Ce formulaire n'est pas encore disponible. Veuillez revenir apr\u00e8s l'heure de d\u00e9but pr\u00e9vue."],"This form is no longer accepting submissions. The submission period has ended.":["Ce formulaire n'accepte plus les soumissions. La p\u00e9riode de soumission est termin\u00e9e."],"The start date and time must be before the end date and time.":["La date et l'heure de d\u00e9but doivent \u00eatre ant\u00e9rieures \u00e0 la date et l'heure de fin."],"Form Scheduling":["Planification de formulaire"],"Enable Form Scheduling":["Activer la planification des formulaires"],"Set a time period during which this form will be available for submissions.":["D\u00e9finissez une p\u00e9riode pendant laquelle ce formulaire sera disponible pour les soumissions."],"Start Date & Time":["Date et heure de d\u00e9but"],"End Date & Time":["Date et heure de fin"],"Response Description Before Start Date":["Description de la r\u00e9ponse avant la date de d\u00e9but"],"Response Description After End Date":["Description de la r\u00e9ponse apr\u00e8s la date de fin"],"Conditional Confirmations":["Confirmations conditionnelles"],"Set up the message or redirect users will see after submitting the form.":["Configurez le message ou la redirection que les utilisateurs verront apr\u00e8s avoir soumis le formulaire."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Montrez le bon message au bon utilisateur en fonction de sa r\u00e9ponse. Personnalisez les confirmations avec des conditions intelligentes et guidez automatiquement les utilisateurs vers la prochaine meilleure \u00e9tape."],"Display different confirmation messages based on form responses.":["Afficher diff\u00e9rents messages de confirmation en fonction des r\u00e9ponses du formulaire."],"Redirect users to specific pages or URLs conditionally.":["Rediriger les utilisateurs vers des pages ou des URL sp\u00e9cifiques de mani\u00e8re conditionnelle."],"Create personalized thank-you messages without extra forms.":["Cr\u00e9ez des messages de remerciement personnalis\u00e9s sans formulaires suppl\u00e9mentaires."],"Lost Password":["Mot de passe perdu"],"Reset Password":["R\u00e9initialiser le mot de passe"],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["S\u00e9lectionnez un service de protection contre le spam. Configurez les cl\u00e9s API dans les Param\u00e8tres Globaux avant de l'activer."],"Send as Raw HTML":["Envoyer en HTML brut"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Lorsqu'elle est activ\u00e9e, le corps de l'email en HTML sera conserv\u00e9 exactement tel qu'il est \u00e9crit et int\u00e9gr\u00e9 dans un mod\u00e8le d'email professionnel."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Les balises intelligentes qui font r\u00e9f\u00e9rence \u00e0 des champs soumis par l'utilisateur ne seront pas \u00e9chapp\u00e9es en mode HTML brut. \u00c9vitez d'ins\u00e9rer directement des valeurs de champs non fiables dans le corps de l'e-mail."],"Please provide a recipient email address and subject line.":["Veuillez fournir une adresse e-mail du destinataire et une ligne d'objet."],"Email notification duplicated!":["Notification par e-mail dupliqu\u00e9e !"],"Are you sure you want to delete this email notification?":["\u00cates-vous s\u00fbr de vouloir supprimer cette notification par e-mail ?"],"Email notification deleted!":["Notification par e-mail supprim\u00e9e !"],"URL is missing Top Level Domain (TLD).":["L'URL manque de domaine de premier niveau (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Ce formulaire est maintenant ferm\u00e9 car le nombre maximum d'entr\u00e9es a \u00e9t\u00e9 atteint."],"Publish Your Form":["Publiez votre formulaire"],"Enable This to Instantly Publish the Form":["Activez ceci pour publier instantan\u00e9ment le formulaire"],"Style Your Instant Form Page Here":["Stylisez votre page de formulaire instantan\u00e9 ici"],"Quizzes":["Quiz"],"%s - Description":["%s - Description"],"Send entries to 100+ popular apps.":["Envoyez des entr\u00e9es \u00e0 plus de 100 applications populaires."],"Build automated workflows that run instantly.":["Cr\u00e9ez des flux de travail automatis\u00e9s qui s'ex\u00e9cutent instantan\u00e9ment."],"Create custom app integrations using our Custom App feature.":["Cr\u00e9ez des int\u00e9grations d'applications personnalis\u00e9es en utilisant notre fonctionnalit\u00e9 d'application personnalis\u00e9e."],"Keep your tools in sync automatically.":["Gardez vos outils synchronis\u00e9s automatiquement."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Cela installera et activera OttoKit sur votre site WordPress pour activer les fonctionnalit\u00e9s d'automatisation."],"Automate Your Forms with OttoKit":["Automatisez vos formulaires avec OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Chaque soumission de formulaire devrait d\u00e9clencher quelque chose \u2014 une alerte Slack, un lead CRM, un e-mail de suivi, ou une nouvelle ligne dans Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Cr\u00e9ez des quiz interactifs pour engager votre audience et recueillir des informations."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Concevez des quiz engageants avec divers types de questions, des retours personnalis\u00e9s et une notation automatis\u00e9e pour captiver votre audience et obtenir des informations pr\u00e9cieuses."],"Create interactive quizzes with multiple question types.":["Cr\u00e9ez des quiz interactifs avec plusieurs types de questions."],"Provide personalized feedback based on user responses.":["Fournir des commentaires personnalis\u00e9s en fonction des r\u00e9ponses des utilisateurs."],"Automate scoring and lead segmentation for better insights.":["Automatisez le scoring et la segmentation des leads pour de meilleures perspectives."],"Heading 1":["Titre 1"],"Heading 2":["Titre 2"],"Heading 3":["Titre 3"],"Heading 4":["Titre 4"],"Heading 5":["Titre 5"],"Heading 6":["Titre 6"],"Form settings saved.":["Param\u00e8tres du formulaire enregistr\u00e9s."],"The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature.":["Le plafond d'entr\u00e9e repose sur les entr\u00e9es stock\u00e9es pour compter les soumissions. Tant que les Param\u00e8tres de conformit\u00e9 ont l'option \"Ne jamais stocker les donn\u00e9es d'entr\u00e9e apr\u00e8s la soumission du formulaire\" activ\u00e9e, cette limite ne sera pas appliqu\u00e9e. D\u00e9sactivez cette option ou supprimez la limite d'entr\u00e9e pour utiliser cette fonctionnalit\u00e9."],"Settings saved, but post attributes (password \/ title \/ content) failed to update. Retry to persist them.":["Param\u00e8tres enregistr\u00e9s, mais les attributs du message (mot de passe \/ titre \/ contenu) n'ont pas pu \u00eatre mis \u00e0 jour. R\u00e9essayez pour les conserver."],"Failed to save form settings.":["\u00c9chec de l'enregistrement des param\u00e8tres du formulaire."],"Saving\u2026":["Enregistrement\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Lorsqu'il est activ\u00e9, ce formulaire ne stockera pas l'IP de l'utilisateur, le nom du navigateur et le nom de l'appareil dans les entr\u00e9es."],"Failed to save. Please try again.":["\u00c9chec de l'enregistrement. Veuillez r\u00e9essayer."],"reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.":["Les cl\u00e9s API reCAPTCHA pour la version s\u00e9lectionn\u00e9e ne sont pas configur\u00e9es. D\u00e9finissez-les dans les Param\u00e8tres Globaux."],"Please select a reCAPTCHA version.":["Veuillez s\u00e9lectionner une version de reCAPTCHA."],"hCaptcha API keys are not configured. Set them in Global Settings.":["Les cl\u00e9s API hCaptcha ne sont pas configur\u00e9es. D\u00e9finissez-les dans les Param\u00e8tres Globaux."],"Cloudflare Turnstile API keys are not configured. Set them in Global Settings.":["Les cl\u00e9s API de Cloudflare Turnstile ne sont pas configur\u00e9es. D\u00e9finissez-les dans les Param\u00e8tres Globaux."],"Form data":["Donn\u00e9es du formulaire"],"Some fields need attention":["Certains champs n\u00e9cessitent une attention"],"Unsaved changes":["Modifications non enregistr\u00e9es"],"A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.":["Une adresse e-mail de destinataire et une ligne d'objet sont requises avant que cette notification puisse \u00eatre enregistr\u00e9e. Corrigez les champs surlign\u00e9s ou annulez vos modifications pour revenir en arri\u00e8re."],"You have unsaved changes for this notification. Discard them to go back, or stay to save them.":["Vous avez des modifications non enregistr\u00e9es pour cette notification. Abandonnez-les pour revenir en arri\u00e8re, ou restez pour les enregistrer."],"Discard & go back":["Annuler et revenir"],"Stay & fix":["Rester et r\u00e9parer"],"Keep editing":["Continuez \u00e0 \u00e9diter"],"Please provide a recipient email address.":["Veuillez fournir une adresse e-mail du destinataire."],"Please provide a subject line.":["Veuillez fournir une ligne d'objet."],"Please provide a custom URL.":["Veuillez fournir une URL personnalis\u00e9e."],"You have unsaved changes. Discard them to continue, or stay to save your changes.":["Vous avez des modifications non enregistr\u00e9es. Abandonnez-les pour continuer, ou restez pour enregistrer vos modifications."],"Discard & continue":["Ignorer et continuer"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-fr_FR-46b85b18ab0a35677f7beff46af30190.json b/languages/sureforms-fr_FR-46b85b18ab0a35677f7beff46af30190.json new file mode 100644 index 000000000..9021eb372 --- /dev/null +++ b/languages/sureforms-fr_FR-46b85b18ab0a35677f7beff46af30190.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/htmlFormDetector.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Converted form":["Forme convertie"],"SureForms could not authenticate this request. Please reload the editor and try again.":["SureForms n'a pas pu authentifier cette demande. Veuillez recharger l'\u00e9diteur et r\u00e9essayer."],"%s \u2014 Converted form":["%s \u2014 Forme convertie"],"Form converted to SureForms using AI. Review the new form for any tweaks.":["Formulaire converti en SureForms \u00e0 l'aide de l'IA. V\u00e9rifiez le nouveau formulaire pour d'\u00e9ventuels ajustements."],"Form converted to SureForms.":["Formulaire converti en SureForms."],"You do not have permission to convert this form.":["Vous n'avez pas la permission de convertir ce formulaire."],"This form is too large to convert. Try simplifying the markup or building the form manually.":["Ce formulaire est trop volumineux pour \u00eatre converti. Essayez de simplifier le balisage ou de cr\u00e9er le formulaire manuellement."],"SureForms could not derive any fields from this form.":["SureForms n'a pas pu extraire de champs de ce formulaire."],"The SureForms AI service could not process this form. Please try again or build the form manually.":["Le service SureForms AI n'a pas pu traiter ce formulaire. Veuillez r\u00e9essayer ou cr\u00e9er le formulaire manuellement."],"SureForms received an unexpected response. Please try again.":["SureForms a re\u00e7u une r\u00e9ponse inattendue. Veuillez r\u00e9essayer."],"Could not convert this form to SureForms. Please try again.":["Impossible de convertir ce formulaire en SureForms. Veuillez r\u00e9essayer."],"Converting\u2026":["Conversion\u2026"],"Convert to SureForms":["Convertir en SureForms"]}}} \ No newline at end of file diff --git a/languages/sureforms-fr_FR-4b62e3f004dea2c587b5a3069263d994.json b/languages/sureforms-fr_FR-4b62e3f004dea2c587b5a3069263d994.json index 5dbf86da8..c5fa9520f 100644 --- a/languages/sureforms-fr_FR-4b62e3f004dea2c587b5a3069263d994.json +++ b/languages/sureforms-fr_FR-4b62e3f004dea2c587b5a3069263d994.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Param\u00e8tres"],"Search":["Recherche"],"Fields":["Champs"],"Image":["Image"],"Submit":["Soumettre"],"Required":["Requis"],"Form Title":["Titre du formulaire"],"Show":["Afficher"],"Hide":["Cacher"],"Edit Form":["Modifier le formulaire"],"Icon":["Ic\u00f4ne"],"Desktop":["Bureau"],"Medium":["Moyen"],"Mobile":["Mobile"],"Repeat":["R\u00e9p\u00e9ter"],"Scroll":["Faire d\u00e9filer"],"Tablet":["Tablette"],"Basic":["De base"],"(no title)":["(pas de titre)"],"Select a Form":["S\u00e9lectionnez un formulaire"],"No forms found\u2026":["Aucun formulaire trouv\u00e9\u2026"],"Choose":["Choisissez"],"Create New":["Cr\u00e9er Nouveau"],"Change Form":["Changer de formulaire"],"This form has been deleted or is unavailable.":["Ce formulaire a \u00e9t\u00e9 supprim\u00e9 ou est indisponible."],"Form Settings":["Param\u00e8tres du formulaire"],"Show Form Title on this Page":["Afficher le titre du formulaire sur cette page"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Remarque : Pour modifier les SureForms, veuillez vous r\u00e9f\u00e9rer \u00e0 l'\u00e9diteur SureForms -"],"Field preview":["Aper\u00e7u du champ"],"General":["G\u00e9n\u00e9ral"],"Style":["Style"],"Advanced":["Avanc\u00e9"],"No tags available":["Aucune \u00e9tiquette disponible"],"Device":["Appareil"],"Select Shortcodes":["S\u00e9lectionner les codes courts"],"Page Break Label":["\u00c9tiquette de saut de page"],"Next":["Suivant"],"Back":["Retour"],"Reset":["R\u00e9initialiser"],"Generic tags":["Balises g\u00e9n\u00e9riques"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["S\u00e9lectionner les unit\u00e9s"],"%s units":["%s unit\u00e9s"],"Margin":["Marge"],"Attributes":["Attributs"],"Input Pattern":["Mod\u00e8le d'entr\u00e9e"],"None":["Aucun"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personnalis\u00e9"],"Custom Mask":["Masque personnalis\u00e9"],"Please check the documentation to manage custom input pattern ":["Veuillez consulter la documentation pour g\u00e9rer le mod\u00e8le d'entr\u00e9e personnalis\u00e9"],"here":["ici"],"Default Value":["Valeur par d\u00e9faut"],"Error Message":["Message d'erreur"],"Help Text":["Texte d'aide"],"Number Format":["Format de nombre"],"US Style (Eg: 9,999.99)":["Style am\u00e9ricain (Ex : 9 999,99)"],"EU Style (Eg: 9.999,99)":["Style UE (Ex : 9.999,99)"],"Minimum Value":["Valeur minimale"],"Maximum Value":["Valeur maximale"],"Please check the Minimum and Maximum value":["Veuillez v\u00e9rifier la valeur minimale et maximale"],"Enable Email Confirmation":["Activer la confirmation par e-mail"],"Checked by Default":["Coch\u00e9 par d\u00e9faut"],"Error message":["Message d'erreur"],"Checked by default":["Coch\u00e9 par d\u00e9faut"],"Please add a option props to MultiButtonsControl":["Veuillez ajouter une option props \u00e0 MultiButtonsControl"],"Icon Library":["Biblioth\u00e8que d'ic\u00f4nes"],"Close":["Fermer"],"All Icons":["Toutes les ic\u00f4nes"],"Other":["Autre"],"No Icons Found":["Aucune ic\u00f4ne trouv\u00e9e"],"Insert Icon":["Ins\u00e9rer une ic\u00f4ne"],"Change Icon":["Changer l'ic\u00f4ne"],"Choose Icon":["Choisir une ic\u00f4ne"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"Processing\u2026":["Traitement\u2026"],"Select Video":["S\u00e9lectionner la vid\u00e9o"],"Change Video":["Changer la vid\u00e9o"],"Select Lottie Animation":["S\u00e9lectionner l'animation Lottie"],"Change Lottie Animation":["Changer l'animation Lottie"],"Upload SVG":["T\u00e9l\u00e9charger SVG"],"Change SVG":["Modifier SVG"],"Select Image":["S\u00e9lectionner l'image"],"Change Image":["Changer l'image"],"Upload SVG?":["T\u00e9l\u00e9charger le SVG ?"],"Upload SVG can be potentially risky. Are you sure?":["T\u00e9l\u00e9charger un SVG peut \u00eatre potentiellement risqu\u00e9. \u00cates-vous s\u00fbr ?"],"Upload Anyway":["T\u00e9l\u00e9charger quand m\u00eame"],"Bulk Add":["Ajout en masse"],"Bulk Add Options":["Ajouter des options en masse"],"Enter each option on a new line.":["Entrez chaque option sur une nouvelle ligne."],"Insert Options":["Options d'insertion"],"Full Width":["Pleine largeur"],"Option Type":["Type d'option"],"Edit Options":["Modifier les options"],"Add New Option":["Ajouter une nouvelle option"],"ADD":["AJOUTER"],"Enable Auto Country Detection":["Activer la d\u00e9tection automatique du pays"],"%s Width":["Largeur %s"],"Upgrade":["Mise \u00e0 niveau"],"Clear":["Clair"],"Select Color":["S\u00e9lectionner la couleur"],"Primary Color":["Couleur primaire"],"Text Color":["Couleur du texte"],"Field Spacing":["Espacement des champs"],"Small":["Petit"],"Large":["Grand"],"Left":["Gauche"],"Center":["Centre"],"Right":["D'accord"],"Color":["Couleur"],"Background Color":["Couleur de fond"],"Auto":["Auto"],"Default":["Par d\u00e9faut"],"Normal":["Normal"],"%":["%"],"Top":["Haut"],"Bottom":["Bas"],"Width":["Largeur"],"Size":["Taille"],"EM":["EM"],"Padding":["Rembourrage"],"Color 1":["Couleur 1"],"Color 2":["Couleur 2"],"Type":["Type"],"Linear":["Lin\u00e9aire"],"Radial":["Radial"],"Location 1":["Emplacement 1"],"Location 2":["Emplacement 2"],"Angle":["Angle"],"Classic":["Classique"],"Gradient":["Gradient"],"Horizontal":["Horizontal"],"Vertical":["Vertical"],"Background":["Contexte"],"Cover":["Couvrir"],"Contain":["Contenir"],"Layout":["Mise en page"],"Overlay":["Superposition"],"No Repeat":["Pas de r\u00e9p\u00e9tition"],"Overlay Opacity":["Opacit\u00e9 de superposition"],"Conditional Logic":["Logique conditionnelle"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Passez au plan de d\u00e9marrage SureForms pour cr\u00e9er des formulaires dynamiques qui s'adaptent en fonction des saisies de l'utilisateur, offrant une exp\u00e9rience de formulaire personnalis\u00e9e et efficace."],"Enable Conditional Logic":["Activer la logique conditionnelle"],"this field if":["ce champ si"],"Configure Conditions":["Configurer les conditions"],"Premium":["Premium"],"Overlay Type":["Type de superposition"],"Image Overlay Color":["Couleur de superposition d'image"],"Image Position":["Position de l'image"],"Attachment":["Pi\u00e8ce jointe"],"Fixed":["Fix\u00e9"],"Blend Mode":["Mode de fusion"],"Multiply":["Multiplier"],"Screen":["\u00c9cran"],"Darken":["Assombrir"],"Lighten":["All\u00e9ger"],"Color Dodge":["Superposition de couleurs"],"Saturation":["Saturation"],"Repeat-x":["R\u00e9p\u00e9ter-x"],"Repeat-y":["R\u00e9p\u00e8te-y"],"PX":["PX"],"Button":["Bouton"],"Prefix Label":["\u00c9tiquette de pr\u00e9fixe"],"Suffix Label":["\u00c9tiquette de suffixe"],"Border Radius":["Rayon de bordure"],"Form Theme":["Th\u00e8me du formulaire"],"Select Gradient":["S\u00e9lectionner le d\u00e9grad\u00e9"],"Unlock Conditional Logic Editor":["D\u00e9verrouiller l'\u00e9diteur de logique conditionnelle"],"Rich Text Editor":["\u00c9diteur de texte enrichi"],"Read Only":["Lecture seule"],"Select Country":["S\u00e9lectionner le pays"],"Default Country":["Pays par d\u00e9faut"],"Subscription":["Abonnement"],"One Time":["Une fois"],"Unique Entry":["Entr\u00e9e unique"],"Maximum Characters":["Caract\u00e8res maximum"],"Textarea Height":["Hauteur de la zone de texte"],"Minimum Selections":["S\u00e9lections minimales"],"Maximum Selections":["S\u00e9lections maximales"],"Add Numeric Values to Options":["Ajouter des valeurs num\u00e9riques aux options"],"Single Choice Only":["Choix unique seulement"],"Enable Dropdown Search":["Activer la recherche d\u00e9roulante"],"Allow Multiple":["Autoriser plusieurs"],"%1$s fields are required. Please configure these fields in the block settings.":["Les champs %1$s sont obligatoires. Veuillez configurer ces champs dans les param\u00e8tres du bloc."],"%1$s field is required. Please configure this field in the block settings.":["Le champ %1$s est requis. Veuillez configurer ce champ dans les param\u00e8tres du bloc."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Vous devez configurer un compte de paiement pour collecter les paiements \u00e0 partir de ce formulaire. Veuillez configurer votre fournisseur de paiement pour continuer."],"Configure Payment Account":["Configurer le compte de paiement"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Ceci est un espace r\u00e9serv\u00e9 pour le bloc de paiement. Les champs de paiement r\u00e9els pour votre ou vos fournisseurs de paiement configur\u00e9s n'appara\u00eetront que lorsque vous pr\u00e9visualiserez ou publierez le formulaire."],"2 Payments":["2 Paiements"],"3 Payments":["3 Paiements"],"4 Payments":["4 Paiements"],"5 Payments":["5 Paiements"],"Never":["Jamais"],"Stop Subscription After":["Arr\u00eater l'abonnement apr\u00e8s"],"Choose when to automatically stop the subscription":["Choisissez quand arr\u00eater automatiquement l'abonnement"],"Number of Payments":["Nombre de paiements"],"Enter a number between 1 to 100":["Entrez un nombre entre 1 et 100"],"Form Field":["Champ de formulaire"],"Payment Type":["Type de paiement"],"Subscription Plan Name":["Nom du plan d'abonnement"],"Billing Interval":["Intervalle de facturation"],"Daily":["Quotidien"],"Weekly":["Hebdomadaire"],"Monthly":["Mensuel"],"Quarterly":["Trimestriel"],"Yearly":["Annuel"],"Amount Type":["Type de montant"],"Fixed Amount":["Montant fixe"],"Dynamic Amount":["Montant Dynamique"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Choisissez de facturer un montant fixe ou de facturer le montant en fonction des saisies de l'utilisateur dans d'autres champs de formulaire."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["D\u00e9finissez le montant exact que vous souhaitez facturer. Les utilisateurs ne pourront pas le modifier"],"Choose Amount Field":["Choisissez le champ Montant"],"Select a field\u2026":["S\u00e9lectionnez un champ\u2026"],"Minimum Amount":["Montant minimum"],"Set the minimum amount users can enter (0 for no minimum)":["D\u00e9finissez le montant minimum que les utilisateurs peuvent entrer (0 pour aucun minimum)"],"Customer Name Field (Required)":["Champ Nom du client (Obligatoire)"],"Customer Name Field (Optional)":["Champ Nom du Client (Facultatif)"],"Select the input field that contains the customer name (Required for subscriptions)":["S\u00e9lectionnez le champ de saisie qui contient le nom du client (Requis pour les abonnements)"],"Select the input field that contains the customer name":["S\u00e9lectionnez le champ de saisie qui contient le nom du client"],"Customer Email Field (Required)":["Champ d'email du client (Obligatoire)"],"Select the email field that contains the customer email":["S\u00e9lectionnez le champ de courriel qui contient l'email du client"],"Payment":["Paiement"],"%s - Order ID":["%s - ID de commande"],"%s - Amount":["%s - Montant"],"%s - Customer Email":["%s - Email du client"],"%s - Customer Name":["%s - Nom du client"],"%s - Status":["%s - Statut"],"Button Alignment":["Alignement du bouton"],"Placeholder":["Espace r\u00e9serv\u00e9"],"Preselect this option":["Pr\u00e9s\u00e9lectionnez cette option"],"Restrict Country Codes":["Restreindre les codes pays"],"Restriction Type":["Type de restriction"],"Allow":["Autoriser"],"Block":["Bloquer"],"Select Allowed Countries":["S\u00e9lectionner les pays autoris\u00e9s"],"Choose countries\u2026":["Choisissez des pays\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Choisissez les indicatifs de pays que les utilisateurs peuvent s\u00e9lectionner dans le champ du num\u00e9ro de t\u00e9l\u00e9phone. Laissez vide pour autoriser tous les indicatifs de pays."],"Select Blocked Countries":["S\u00e9lectionner les pays bloqu\u00e9s"],"These countries will be hidden from the dropdown.":["Ces pays seront masqu\u00e9s dans le menu d\u00e9roulant."],"Bulk Edit":["Modification en masse"],"Select Layout":["S\u00e9lectionner la disposition"],"Number of Columns":["Nombre de colonnes"],"Validation Message for Duplicate":["Message de validation pour doublon"],"Click here to insert a form":["Cliquez ici pour ins\u00e9rer un formulaire"],"Inherit Form's Original Style":["H\u00e9riter du style original du formulaire"],"Text on Primary":["Texte sur Principal"],"%s - Description":["%s - Description"],"Upgrade to Unlock":["Mettez \u00e0 niveau pour d\u00e9bloquer"],"Custom (Premium)":["Personnalis\u00e9 (Premium)"],"Select a theme style for this form embed.":["S\u00e9lectionnez un style de th\u00e8me pour cette int\u00e9gration de formulaire."],"Colors":["Couleurs"],"Advanced Styling":["Style avanc\u00e9"],"Unlock Custom Styling":["D\u00e9verrouiller le style personnalis\u00e9"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Passez en mode personnalis\u00e9 pour prendre le contr\u00f4le total de la conception et de l'espacement de votre formulaire."],"Full color control (buttons, fields, text)":["Contr\u00f4le complet des couleurs (boutons, champs, texte)"],"Row and column gap control":["Contr\u00f4le de l'espacement des lignes et des colonnes"],"Field spacing and layout precision":["Pr\u00e9cision de l'espacement et de la disposition des champs"],"Complete button styling":["Style complet du bouton"],"Payment Description":["Description du paiement"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Affich\u00e9 sur les re\u00e7us de paiement et dans votre tableau de bord de paiement (Stripe et PayPal). Laissez vide pour utiliser la valeur par d\u00e9faut."],"Slug":["Limace"],"Auto-generated on save":["G\u00e9n\u00e9r\u00e9 automatiquement lors de l'enregistrement"],"This slug is already used by another field. It will revert to the previous value.":["Ce slug est d\u00e9j\u00e0 utilis\u00e9 par un autre champ. Il reviendra \u00e0 la valeur pr\u00e9c\u00e9dente."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Changer le slug peut perturber les soumissions de formulaires, la logique conditionnelle, les int\u00e9grations ou toute autre fonctionnalit\u00e9 se r\u00e9f\u00e9rant actuellement \u00e0 ce slug. Vous devrez mettre \u00e0 jour manuellement toutes ces r\u00e9f\u00e9rences."],"Field Slug":["Slug de champ"],"Location Services":["Services de localisation"],"Unlock Address Autocomplete":["D\u00e9verrouiller la saisie semi-automatique de l'adresse"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Mettez \u00e0 niveau pour activer la saisie semi-automatique des adresses Google avec aper\u00e7u interactif de la carte, rendant la saisie des adresses plus rapide et plus pr\u00e9cise pour vos utilisateurs."],"Enable Google Autocomplete":["Activer la saisie semi-automatique de Google"],"Show Interactive Map":["Afficher la carte interactive"],"Payments Per Page":["Paiements par page"],"Show Subscriptions Section":["Afficher la section des abonnements"],"Show a dedicated subscriptions section above payment history.":["Afficher une section d\u00e9di\u00e9e aux abonnements au-dessus de l'historique des paiements."],"Payment Dashboard":["Tableau de bord des paiements"],"View your payments and manage subscriptions in a single dashboard.":["Consultez vos paiements et g\u00e9rez vos abonnements dans un tableau de bord unique."],"Dynamic Default Value":["Valeur par d\u00e9faut dynamique"],"Minimum Characters":["Caract\u00e8res minimum"],"Minimum characters cannot exceed Maximum characters.":["Les caract\u00e8res minimum ne peuvent pas d\u00e9passer les caract\u00e8res maximum."],"Both":["Les deux"],"One-Time Label":["\u00c9tiquette unique"],"Label shown to users for the one-time payment option.":["Libell\u00e9 affich\u00e9 aux utilisateurs pour l'option de paiement unique."],"Subscription Label":["Libell\u00e9 d'abonnement"],"Label shown to users for the subscription option.":["Libell\u00e9 affich\u00e9 aux utilisateurs pour l'option d'abonnement."],"Default Selection":["S\u00e9lection par d\u00e9faut"],"Which option is pre-selected when the form loads.":["Quelle option est pr\u00e9s\u00e9lectionn\u00e9e lorsque le formulaire se charge."],"One-Time Amount Type":["Type de montant unique"],"Set how the one-time payment amount is determined.":["D\u00e9finissez comment le montant du paiement unique est d\u00e9termin\u00e9."],"One-Time Fixed Amount":["Montant fixe unique"],"Amount charged for a one-time payment.":["Montant factur\u00e9 pour un paiement unique."],"One-Time Amount Field":["Champ de montant unique"],"Pick a form field whose value determines the one-time payment amount.":["S\u00e9lectionnez un champ de formulaire dont la valeur d\u00e9termine le montant du paiement unique."],"One-Time Minimum Amount":["Montant minimum unique"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Montant minimum que les utilisateurs peuvent entrer pour un paiement unique (0 pour aucun minimum)."],"Subscription Amount Type":["Type de montant d'abonnement"],"Set how the subscription amount is determined.":["D\u00e9finissez comment le montant de l'abonnement est d\u00e9termin\u00e9."],"Subscription Fixed Amount":["Montant fixe de l'abonnement"],"Recurring amount charged per billing interval.":["Montant r\u00e9current factur\u00e9 par intervalle de facturation."],"Subscription Amount Field":["Champ Montant de l'abonnement"],"Pick a form field whose value determines the subscription amount.":["Choisissez un champ de formulaire dont la valeur d\u00e9termine le montant de l'abonnement."],"Subscription Minimum Amount":["Montant minimum de l'abonnement"],"Minimum amount users can enter for subscription (0 for no minimum).":["Montant minimum que les utilisateurs peuvent entrer pour l'abonnement (0 pour aucun minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Choisissez un champ de votre formulaire comme un nombre, une liste d\u00e9roulante, un choix multiple ou un champ cach\u00e9 dont la valeur doit d\u00e9terminer le montant du paiement."]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Param\u00e8tres"],"Search":["Recherche"],"Fields":["Champs"],"Image":["Image"],"Submit":["Soumettre"],"Required":["Requis"],"Form Title":["Titre du formulaire"],"Show":["Afficher"],"Hide":["Cacher"],"Edit Form":["Modifier le formulaire"],"Icon":["Ic\u00f4ne"],"Desktop":["Bureau"],"Medium":["Moyen"],"Mobile":["Mobile"],"Repeat":["R\u00e9p\u00e9ter"],"Scroll":["Faire d\u00e9filer"],"Tablet":["Tablette"],"Basic":["De base"],"(no title)":["(pas de titre)"],"Select a Form":["S\u00e9lectionnez un formulaire"],"No forms found\u2026":["Aucun formulaire trouv\u00e9\u2026"],"Choose":["Choisissez"],"Create New":["Cr\u00e9er Nouveau"],"Change Form":["Changer de formulaire"],"This form has been deleted or is unavailable.":["Ce formulaire a \u00e9t\u00e9 supprim\u00e9 ou est indisponible."],"Form Settings":["Param\u00e8tres du formulaire"],"Show Form Title on this Page":["Afficher le titre du formulaire sur cette page"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Remarque : Pour modifier les SureForms, veuillez vous r\u00e9f\u00e9rer \u00e0 l'\u00e9diteur SureForms -"],"Field preview":["Aper\u00e7u du champ"],"General":["G\u00e9n\u00e9ral"],"Style":["Style"],"Advanced":["Avanc\u00e9"],"No tags available":["Aucune \u00e9tiquette disponible"],"Device":["Appareil"],"Select Shortcodes":["S\u00e9lectionner les codes courts"],"Page Break Label":["\u00c9tiquette de saut de page"],"Next":["Suivant"],"Back":["Retour"],"Reset":["R\u00e9initialiser"],"Generic tags":["Balises g\u00e9n\u00e9riques"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["S\u00e9lectionner les unit\u00e9s"],"%s units":["%s unit\u00e9s"],"Margin":["Marge"],"Attributes":["Attributs"],"Input Pattern":["Mod\u00e8le d'entr\u00e9e"],"None":["Aucun"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personnalis\u00e9"],"Custom Mask":["Masque personnalis\u00e9"],"Please check the documentation to manage custom input pattern ":["Veuillez consulter la documentation pour g\u00e9rer le mod\u00e8le d'entr\u00e9e personnalis\u00e9"],"here":["ici"],"Default Value":["Valeur par d\u00e9faut"],"Error Message":["Message d'erreur"],"Help Text":["Texte d'aide"],"Number Format":["Format de nombre"],"US Style (Eg: 9,999.99)":["Style am\u00e9ricain (Ex : 9 999,99)"],"EU Style (Eg: 9.999,99)":["Style UE (Ex : 9.999,99)"],"Minimum Value":["Valeur minimale"],"Maximum Value":["Valeur maximale"],"Please check the Minimum and Maximum value":["Veuillez v\u00e9rifier la valeur minimale et maximale"],"Enable Email Confirmation":["Activer la confirmation par e-mail"],"Checked by Default":["Coch\u00e9 par d\u00e9faut"],"Error message":["Message d'erreur"],"Checked by default":["Coch\u00e9 par d\u00e9faut"],"Please add a option props to MultiButtonsControl":["Veuillez ajouter une option props \u00e0 MultiButtonsControl"],"Icon Library":["Biblioth\u00e8que d'ic\u00f4nes"],"Close":["Fermer"],"All Icons":["Toutes les ic\u00f4nes"],"Other":["Autre"],"No Icons Found":["Aucune ic\u00f4ne trouv\u00e9e"],"Insert Icon":["Ins\u00e9rer une ic\u00f4ne"],"Change Icon":["Changer l'ic\u00f4ne"],"Choose Icon":["Choisir une ic\u00f4ne"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"Processing\u2026":["Traitement\u2026"],"Select Video":["S\u00e9lectionner la vid\u00e9o"],"Change Video":["Changer la vid\u00e9o"],"Select Lottie Animation":["S\u00e9lectionner l'animation Lottie"],"Change Lottie Animation":["Changer l'animation Lottie"],"Upload SVG":["T\u00e9l\u00e9charger SVG"],"Change SVG":["Modifier SVG"],"Select Image":["S\u00e9lectionner l'image"],"Change Image":["Changer l'image"],"Upload SVG?":["T\u00e9l\u00e9charger le SVG ?"],"Upload SVG can be potentially risky. Are you sure?":["T\u00e9l\u00e9charger un SVG peut \u00eatre potentiellement risqu\u00e9. \u00cates-vous s\u00fbr ?"],"Upload Anyway":["T\u00e9l\u00e9charger quand m\u00eame"],"Bulk Add":["Ajout en masse"],"Bulk Add Options":["Ajouter des options en masse"],"Enter each option on a new line.":["Entrez chaque option sur une nouvelle ligne."],"Insert Options":["Options d'insertion"],"Full Width":["Pleine largeur"],"Option Type":["Type d'option"],"Edit Options":["Modifier les options"],"Add New Option":["Ajouter une nouvelle option"],"ADD":["AJOUTER"],"Enable Auto Country Detection":["Activer la d\u00e9tection automatique du pays"],"%s Width":["Largeur %s"],"Upgrade":["Mise \u00e0 niveau"],"Clear":["Clair"],"Select Color":["S\u00e9lectionner la couleur"],"Primary Color":["Couleur primaire"],"Text Color":["Couleur du texte"],"Field Spacing":["Espacement des champs"],"Small":["Petit"],"Large":["Grand"],"Left":["Gauche"],"Center":["Centre"],"Right":["D'accord"],"Color":["Couleur"],"Background Color":["Couleur de fond"],"Auto":["Auto"],"Default":["Par d\u00e9faut"],"Normal":["Normal"],"%":["%"],"Top":["Haut"],"Bottom":["Bas"],"Width":["Largeur"],"Size":["Taille"],"EM":["EM"],"Padding":["Rembourrage"],"Color 1":["Couleur 1"],"Color 2":["Couleur 2"],"Type":["Type"],"Linear":["Lin\u00e9aire"],"Radial":["Radial"],"Location 1":["Emplacement 1"],"Location 2":["Emplacement 2"],"Angle":["Angle"],"Classic":["Classique"],"Gradient":["Gradient"],"Horizontal":["Horizontal"],"Vertical":["Vertical"],"Background":["Contexte"],"Cover":["Couvrir"],"Contain":["Contenir"],"Layout":["Mise en page"],"Overlay":["Superposition"],"No Repeat":["Pas de r\u00e9p\u00e9tition"],"Overlay Opacity":["Opacit\u00e9 de superposition"],"Conditional Logic":["Logique conditionnelle"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Passez au plan de d\u00e9marrage SureForms pour cr\u00e9er des formulaires dynamiques qui s'adaptent en fonction des saisies de l'utilisateur, offrant une exp\u00e9rience de formulaire personnalis\u00e9e et efficace."],"Enable Conditional Logic":["Activer la logique conditionnelle"],"this field if":["ce champ si"],"Configure Conditions":["Configurer les conditions"],"Premium":["Premium"],"Overlay Type":["Type de superposition"],"Image Overlay Color":["Couleur de superposition d'image"],"Image Position":["Position de l'image"],"Attachment":["Pi\u00e8ce jointe"],"Fixed":["Fix\u00e9"],"Blend Mode":["Mode de fusion"],"Multiply":["Multiplier"],"Screen":["\u00c9cran"],"Darken":["Assombrir"],"Lighten":["All\u00e9ger"],"Color Dodge":["Superposition de couleurs"],"Saturation":["Saturation"],"Repeat-x":["R\u00e9p\u00e9ter-x"],"Repeat-y":["R\u00e9p\u00e8te-y"],"PX":["PX"],"Button":["Bouton"],"Prefix Label":["\u00c9tiquette de pr\u00e9fixe"],"Suffix Label":["\u00c9tiquette de suffixe"],"Border Radius":["Rayon de bordure"],"Form Theme":["Th\u00e8me du formulaire"],"Select Gradient":["S\u00e9lectionner le d\u00e9grad\u00e9"],"Unlock Conditional Logic Editor":["D\u00e9verrouiller l'\u00e9diteur de logique conditionnelle"],"Rich Text Editor":["\u00c9diteur de texte enrichi"],"Read Only":["Lecture seule"],"Select Country":["S\u00e9lectionner le pays"],"Default Country":["Pays par d\u00e9faut"],"Subscription":["Abonnement"],"One Time":["Une fois"],"Unique Entry":["Entr\u00e9e unique"],"Maximum Characters":["Caract\u00e8res maximum"],"Textarea Height":["Hauteur de la zone de texte"],"Minimum Selections":["S\u00e9lections minimales"],"Maximum Selections":["S\u00e9lections maximales"],"Add Numeric Values to Options":["Ajouter des valeurs num\u00e9riques aux options"],"Single Choice Only":["Choix unique seulement"],"Enable Dropdown Search":["Activer la recherche d\u00e9roulante"],"Allow Multiple":["Autoriser plusieurs"],"%1$s fields are required. Please configure these fields in the block settings.":["Les champs %1$s sont obligatoires. Veuillez configurer ces champs dans les param\u00e8tres du bloc."],"%1$s field is required. Please configure this field in the block settings.":["Le champ %1$s est requis. Veuillez configurer ce champ dans les param\u00e8tres du bloc."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Vous devez configurer un compte de paiement pour collecter les paiements \u00e0 partir de ce formulaire. Veuillez configurer votre fournisseur de paiement pour continuer."],"Configure Payment Account":["Configurer le compte de paiement"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Ceci est un espace r\u00e9serv\u00e9 pour le bloc de paiement. Les champs de paiement r\u00e9els pour votre ou vos fournisseurs de paiement configur\u00e9s n'appara\u00eetront que lorsque vous pr\u00e9visualiserez ou publierez le formulaire."],"2 Payments":["2 Paiements"],"3 Payments":["3 Paiements"],"4 Payments":["4 Paiements"],"5 Payments":["5 Paiements"],"Never":["Jamais"],"Stop Subscription After":["Arr\u00eater l'abonnement apr\u00e8s"],"Choose when to automatically stop the subscription":["Choisissez quand arr\u00eater automatiquement l'abonnement"],"Number of Payments":["Nombre de paiements"],"Enter a number between 1 to 100":["Entrez un nombre entre 1 et 100"],"Form Field":["Champ de formulaire"],"Payment Type":["Type de paiement"],"Subscription Plan Name":["Nom du plan d'abonnement"],"Billing Interval":["Intervalle de facturation"],"Daily":["Quotidien"],"Weekly":["Hebdomadaire"],"Monthly":["Mensuel"],"Quarterly":["Trimestriel"],"Yearly":["Annuel"],"Amount Type":["Type de montant"],"Fixed Amount":["Montant fixe"],"Dynamic Amount":["Montant Dynamique"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Choisissez de facturer un montant fixe ou de facturer le montant en fonction des saisies de l'utilisateur dans d'autres champs de formulaire."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["D\u00e9finissez le montant exact que vous souhaitez facturer. Les utilisateurs ne pourront pas le modifier"],"Choose Amount Field":["Choisissez le champ Montant"],"Select a field\u2026":["S\u00e9lectionnez un champ\u2026"],"Minimum Amount":["Montant minimum"],"Set the minimum amount users can enter (0 for no minimum)":["D\u00e9finissez le montant minimum que les utilisateurs peuvent entrer (0 pour aucun minimum)"],"Customer Name Field (Required)":["Champ Nom du client (Obligatoire)"],"Customer Name Field (Optional)":["Champ Nom du Client (Facultatif)"],"Select the input field that contains the customer name (Required for subscriptions)":["S\u00e9lectionnez le champ de saisie qui contient le nom du client (Requis pour les abonnements)"],"Select the input field that contains the customer name":["S\u00e9lectionnez le champ de saisie qui contient le nom du client"],"Customer Email Field (Required)":["Champ d'email du client (Obligatoire)"],"Select the email field that contains the customer email":["S\u00e9lectionnez le champ de courriel qui contient l'email du client"],"Payment":["Paiement"],"%s - Order ID":["%s - ID de commande"],"%s - Amount":["%s - Montant"],"%s - Customer Email":["%s - Email du client"],"%s - Customer Name":["%s - Nom du client"],"%s - Status":["%s - Statut"],"Button Alignment":["Alignement du bouton"],"Placeholder":["Espace r\u00e9serv\u00e9"],"Preselect this option":["Pr\u00e9s\u00e9lectionnez cette option"],"Restrict Country Codes":["Restreindre les codes pays"],"Restriction Type":["Type de restriction"],"Allow":["Autoriser"],"Block":["Bloquer"],"Select Allowed Countries":["S\u00e9lectionner les pays autoris\u00e9s"],"Choose countries\u2026":["Choisissez des pays\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Choisissez les indicatifs de pays que les utilisateurs peuvent s\u00e9lectionner dans le champ du num\u00e9ro de t\u00e9l\u00e9phone. Laissez vide pour autoriser tous les indicatifs de pays."],"Select Blocked Countries":["S\u00e9lectionner les pays bloqu\u00e9s"],"These countries will be hidden from the dropdown.":["Ces pays seront masqu\u00e9s dans le menu d\u00e9roulant."],"Bulk Edit":["Modification en masse"],"Select Layout":["S\u00e9lectionner la disposition"],"Number of Columns":["Nombre de colonnes"],"Validation Message for Duplicate":["Message de validation pour doublon"],"Click here to insert a form":["Cliquez ici pour ins\u00e9rer un formulaire"],"Inherit Form's Original Style":["H\u00e9riter du style original du formulaire"],"Text on Primary":["Texte sur Principal"],"%s - Description":["%s - Description"],"Upgrade to Unlock":["Mettez \u00e0 niveau pour d\u00e9bloquer"],"Custom (Premium)":["Personnalis\u00e9 (Premium)"],"Select a theme style for this form embed.":["S\u00e9lectionnez un style de th\u00e8me pour cette int\u00e9gration de formulaire."],"Colors":["Couleurs"],"Advanced Styling":["Style avanc\u00e9"],"Unlock Custom Styling":["D\u00e9verrouiller le style personnalis\u00e9"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Passez en mode personnalis\u00e9 pour prendre le contr\u00f4le total de la conception et de l'espacement de votre formulaire."],"Full color control (buttons, fields, text)":["Contr\u00f4le complet des couleurs (boutons, champs, texte)"],"Row and column gap control":["Contr\u00f4le de l'espacement des lignes et des colonnes"],"Field spacing and layout precision":["Pr\u00e9cision de l'espacement et de la disposition des champs"],"Complete button styling":["Style complet du bouton"],"Payment Description":["Description du paiement"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Affich\u00e9 sur les re\u00e7us de paiement et dans votre tableau de bord de paiement (Stripe et PayPal). Laissez vide pour utiliser la valeur par d\u00e9faut."],"Slug":["Limace"],"Auto-generated on save":["G\u00e9n\u00e9r\u00e9 automatiquement lors de l'enregistrement"],"This slug is already used by another field. It will revert to the previous value.":["Ce slug est d\u00e9j\u00e0 utilis\u00e9 par un autre champ. Il reviendra \u00e0 la valeur pr\u00e9c\u00e9dente."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Changer le slug peut perturber les soumissions de formulaires, la logique conditionnelle, les int\u00e9grations ou toute autre fonctionnalit\u00e9 se r\u00e9f\u00e9rant actuellement \u00e0 ce slug. Vous devrez mettre \u00e0 jour manuellement toutes ces r\u00e9f\u00e9rences."],"Field Slug":["Slug de champ"],"Location Services":["Services de localisation"],"Unlock Address Autocomplete":["D\u00e9verrouiller la saisie semi-automatique de l'adresse"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Mettez \u00e0 niveau pour activer la saisie semi-automatique des adresses Google avec aper\u00e7u interactif de la carte, rendant la saisie des adresses plus rapide et plus pr\u00e9cise pour vos utilisateurs."],"Enable Google Autocomplete":["Activer la saisie semi-automatique de Google"],"Show Interactive Map":["Afficher la carte interactive"],"Payments Per Page":["Paiements par page"],"Show Subscriptions Section":["Afficher la section des abonnements"],"Show a dedicated subscriptions section above payment history.":["Afficher une section d\u00e9di\u00e9e aux abonnements au-dessus de l'historique des paiements."],"Payment Dashboard":["Tableau de bord des paiements"],"View your payments and manage subscriptions in a single dashboard.":["Consultez vos paiements et g\u00e9rez vos abonnements dans un tableau de bord unique."],"Dynamic Default Value":["Valeur par d\u00e9faut dynamique"],"Minimum Characters":["Caract\u00e8res minimum"],"Minimum characters cannot exceed Maximum characters.":["Les caract\u00e8res minimum ne peuvent pas d\u00e9passer les caract\u00e8res maximum."],"Both":["Les deux"],"One-Time Label":["\u00c9tiquette unique"],"Label shown to users for the one-time payment option.":["Libell\u00e9 affich\u00e9 aux utilisateurs pour l'option de paiement unique."],"Subscription Label":["Libell\u00e9 d'abonnement"],"Label shown to users for the subscription option.":["Libell\u00e9 affich\u00e9 aux utilisateurs pour l'option d'abonnement."],"Default Selection":["S\u00e9lection par d\u00e9faut"],"Which option is pre-selected when the form loads.":["Quelle option est pr\u00e9s\u00e9lectionn\u00e9e lorsque le formulaire se charge."],"One-Time Amount Type":["Type de montant unique"],"Set how the one-time payment amount is determined.":["D\u00e9finissez comment le montant du paiement unique est d\u00e9termin\u00e9."],"One-Time Fixed Amount":["Montant fixe unique"],"Amount charged for a one-time payment.":["Montant factur\u00e9 pour un paiement unique."],"One-Time Amount Field":["Champ de montant unique"],"Pick a form field whose value determines the one-time payment amount.":["S\u00e9lectionnez un champ de formulaire dont la valeur d\u00e9termine le montant du paiement unique."],"One-Time Minimum Amount":["Montant minimum unique"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Montant minimum que les utilisateurs peuvent entrer pour un paiement unique (0 pour aucun minimum)."],"Subscription Amount Type":["Type de montant d'abonnement"],"Set how the subscription amount is determined.":["D\u00e9finissez comment le montant de l'abonnement est d\u00e9termin\u00e9."],"Subscription Fixed Amount":["Montant fixe de l'abonnement"],"Recurring amount charged per billing interval.":["Montant r\u00e9current factur\u00e9 par intervalle de facturation."],"Subscription Amount Field":["Champ Montant de l'abonnement"],"Pick a form field whose value determines the subscription amount.":["Choisissez un champ de formulaire dont la valeur d\u00e9termine le montant de l'abonnement."],"Subscription Minimum Amount":["Montant minimum de l'abonnement"],"Minimum amount users can enter for subscription (0 for no minimum).":["Montant minimum que les utilisateurs peuvent entrer pour l'abonnement (0 pour aucun minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Choisissez un champ de votre formulaire comme un nombre, une liste d\u00e9roulante, un choix multiple ou un champ cach\u00e9 dont la valeur doit d\u00e9terminer le montant du paiement."],"Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.":["Utilisez une balise intelligente comme {get_input:country}. La premi\u00e8re option dont le titre correspond \u00e0 la valeur r\u00e9solue sera pr\u00e9s\u00e9lectionn\u00e9e."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.":["Utilisez une balise intelligente comme {get_input:colors} et passez des valeurs s\u00e9par\u00e9es par des barres verticales dans l'URL (par exemple ?colors=Red|Blue). Chaque option dont le titre correspond \u00e0 une valeur sera coch\u00e9e. Vous pouvez \u00e9galement encha\u00eener plusieurs balises intelligentes s\u00e9par\u00e9es par des barres verticales."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.":["Utilisez une balise intelligente comme {get_input:colors} et passez des valeurs s\u00e9par\u00e9es par des barres verticales dans l'URL (par exemple ?colors=Red|Blue). Chaque option dont l'\u00e9tiquette correspond \u00e0 une valeur sera pr\u00e9s\u00e9lectionn\u00e9e. Vous pouvez \u00e9galement encha\u00eener plusieurs balises intelligentes s\u00e9par\u00e9es par des barres verticales."],"Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.":["Utilisez une balise intelligente comme {get_input:country}. La premi\u00e8re option dont l'\u00e9tiquette correspond \u00e0 la valeur r\u00e9solue sera pr\u00e9s\u00e9lectionn\u00e9e."]}}} \ No newline at end of file diff --git a/languages/sureforms-fr_FR-51635fe6489fc8288d603fe596c755ca.json b/languages/sureforms-fr_FR-51635fe6489fc8288d603fe596c755ca.json index cd083b3cf..53a295c79 100644 --- a/languages/sureforms-fr_FR-51635fe6489fc8288d603fe596c755ca.json +++ b/languages/sureforms-fr_FR-51635fe6489fc8288d603fe596c755ca.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tableau de bord"],"Settings":["Param\u00e8tres"],"Entries":["Entr\u00e9es"],"Activated":["Activ\u00e9"],"Activate":["Activer"],"Monday":["Lundi"],"Forms":["Formulaires"],"GitHub":["GitHub"],"General":["G\u00e9n\u00e9ral"],"Other":["Autre"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"Install":["Installer"],"Plugin Installation failed, Please try again later.":["L'installation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Plugin activation failed, Please try again later.":["L'activation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Integrations":["Int\u00e9grations"],"What's New?":["Quoi de neuf ?"],"Core":["C\u0153ur"],"Unlicensed":["Sans licence"],"Connecting\u2026":["Connexion\u2026"],"Install & Activate":["Installer et activer"],"Send Email To":["Envoyer un e-mail \u00e0"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validations"],"Spam Protection":["Protection contre le spam"],"If this option is turned on, the user's IP address will be saved with the form data":["Si cette option est activ\u00e9e, l'adresse IP de l'utilisateur sera enregistr\u00e9e avec les donn\u00e9es du formulaire"],"Enable Honeypot Security":["Activer la s\u00e9curit\u00e9 Honeypot"],"Enable Honeypot Security for better spam protection":["Activez la s\u00e9curit\u00e9 Honeypot pour une meilleure protection contre le spam"],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s repr\u00e9sente le nombre minimum de s\u00e9lections n\u00e9cessaires. Par exemple : \u00ab Un minimum de 2 s\u00e9lections est requis. \u00bb"],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s repr\u00e9sente le nombre maximum de s\u00e9lections autoris\u00e9es. Par exemple : \u00ab Maximum 4 s\u00e9lections autoris\u00e9es. \u00bb"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s repr\u00e9sente le nombre minimum de choix n\u00e9cessaires. Par exemple : \u00ab Au moins 1 s\u00e9lection est requise. \u00bb"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s repr\u00e9sente le nombre maximum de choix autoris\u00e9s. Par exemple : \u00ab Maximum de 3 s\u00e9lections autoris\u00e9es. \u00bb"]," Error Message":["Message d'erreur"],"Email Summaries":["R\u00e9sum\u00e9s d'e-mails"],"Tuesday":["Mardi"],"Wednesday":["Mercredi"],"Thursday":["Jeudi"],"Friday":["Vendredi"],"Saturday":["Samedi"],"Sunday":["Dimanche"],"Schedule Reports":["Programmer les rapports"],"Auto":["Auto"],"Light":["Lumi\u00e8re"],"Dark":["Sombre"],"Turnstile":["Tourniquet"],"Get Keys":["Obtenir les cl\u00e9s"],"Documentation":["Documentation"],"Site Key":["Cl\u00e9 du site"],"Secret Key":["Cl\u00e9 secr\u00e8te"],"Cloudflare Turnstile":["Tourniquet Cloudflare"],"Appearance Mode":["Mode d'apparence"],"This field cannot be left blank.":["Ce champ ne peut pas \u00eatre laiss\u00e9 vide."],"Test Email":["Email de test"],"IP Logging":["Journalisation IP"],"Honeypot":["Pot de miel"],"Confirmation Email Mismatch Message":["Message de non-correspondance de l'email de confirmation"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s repr\u00e9sente la valeur d'entr\u00e9e minimale. Par exemple : \"La valeur minimale est 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s repr\u00e9sente la valeur d'entr\u00e9e maximale. Par exemple : \"La valeur maximale est 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connectez-vous avec OttoKit"],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Pr\u00eat \u00e0 aller au-del\u00e0 du plan gratuit ?"],"Upgrade now":["Mettez \u00e0 niveau maintenant"],"and unlock the full power of SureForms!":["et d\u00e9bloquez toute la puissance de SureForms !"],"Upgrade SureForms":["Mettre \u00e0 niveau SureForms"],"Upgrade Now":["Mettez \u00e0 niveau maintenant"],"Form Validation":["Validation de formulaire"],"Required Error Messages":["Messages d'erreur requis"],"Other Error Messages":["Autres messages d'erreur"],"Input Field Unique":["Champ de saisie unique"],"Email Field Unique":["Champ de courriel unique"],"Invalid URL":["URL invalide"],"Phone Field Unique":["Champ de t\u00e9l\u00e9phone unique"],"Invalid Field Number Block":["Bloc de num\u00e9ro de champ invalide"],"Invalid Email":["Email invalide"],"Number Minimum Value":["Valeur minimale du nombre"],"Number Maximum Value":["Valeur maximale du nombre"],"Dropdown Minimum Selections":["S\u00e9lections minimales du menu d\u00e9roulant"],"Dropdown Maximum Selections":["S\u00e9lections Maximales du Menu D\u00e9roulant"],"Multiple Choice Minimum Selections":["S\u00e9lections minimales \u00e0 choix multiple"],"Multiple Choice Maximum Selections":["S\u00e9lections maximales \u00e0 choix multiple"],"Input Field":["Champ de saisie"],"Email Field":["Champ de courriel"],"URL Field":["Champ URL"],"Phone Field":["Champ T\u00e9l\u00e9phone"],"Textarea Field":["Champ de zone de texte"],"Checkbox Field":["Champ de case \u00e0 cocher"],"Dropdown Field":["Champ d\u00e9roulant"],"Multiple Choice Field":["Champ \u00e0 choix multiple"],"Address Field":["Champ d'adresse"],"Number Field":["Champ num\u00e9rique"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Pour activer la fonctionnalit\u00e9 reCAPTCHA sur vos SureForms, veuillez activer l'option reCAPTCHA dans les param\u00e8tres de vos blocs et s\u00e9lectionner la version. Ajoutez ici la cl\u00e9 secr\u00e8te et la cl\u00e9 de site de Google reCAPTCHA. reCAPTCHA sera ajout\u00e9 \u00e0 votre page sur le front-end."],"Enter your %s here":["Entrez votre %s ici"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Pour activer hCAPTCHA, veuillez ajouter votre cl\u00e9 de site et votre cl\u00e9 secr\u00e8te. Configurez ces param\u00e8tres dans le formulaire individuel."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Pour activer Cloudflare Turnstile, veuillez ajouter votre cl\u00e9 de site et votre cl\u00e9 secr\u00e8te. Configurez ces param\u00e8tres dans le formulaire individuel."],"Save":["Sauvegarder"],"Anonymous Analytics":["Analytique Anonyme"],"Learn More":["En savoir plus"],"Admin Notification":["Notification d'administration"],"Enable Admin Notification":["Activer la notification administrateur"],"Admin notifications keep you informed about new form entries since your last visit.":["Les notifications administratives vous informent des nouvelles entr\u00e9es de formulaire depuis votre derni\u00e8re visite."],"Continue":["Continuer"],"Get Started":["Commencer"],"Integration":["Int\u00e9gration"],"Connect Native Integrations with SureForms":["Connectez les int\u00e9grations natives avec SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["D\u00e9bloquez des int\u00e9grations puissantes dans le plan Premium pour automatiser vos flux de travail et connecter SureForms directement \u00e0 vos outils pr\u00e9f\u00e9r\u00e9s."],"Send form submissions straight to CRMs, email, and marketing platforms":["Envoyez les soumissions de formulaires directement aux CRM, par e-mail et aux plateformes de marketing"],"Automate repetitive tasks with seamless data syncing":["Automatisez les t\u00e2ches r\u00e9p\u00e9titives avec une synchronisation des donn\u00e9es transparente"],"Access exclusive native integrations for faster workflows":["Acc\u00e9dez \u00e0 des int\u00e9grations natives exclusives pour des flux de travail plus rapides"],"Payments":["Paiements"],"Stripe account disconnected successfully.":["Compte Stripe d\u00e9connect\u00e9 avec succ\u00e8s."],"Failed to create webhook.":["\u00c9chec de la cr\u00e9ation du webhook."],"Failed to connect to Stripe.":["\u00c9chec de la connexion \u00e0 Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Base de connaissances"],"What\u2019s New":["Quoi de neuf"],"delete":["supprimer"],"Please type \"%s\" in the input box":["Veuillez taper \"%s\" dans la bo\u00eete de saisie"],"To confirm, type \"%s\" in the box below:":["Pour confirmer, tapez \"%s\" dans la case ci-dessous :"],"Type \"%s\"":["Tapez \"%s\""],"Go to OttoKit Settings":["Acc\u00e9dez aux param\u00e8tres OttoKit"],"USD - US Dollar":["USD - Dollar am\u00e9ricain"],"Payment Mode":["Mode de paiement"],"Test Mode":["Mode Test"],"Live Mode":["Mode en direct"],"General Settings":["Param\u00e8tres g\u00e9n\u00e9raux"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Configurez les r\u00e9sum\u00e9s d'e-mails, les alertes administratives et les pr\u00e9f\u00e9rences de donn\u00e9es pour g\u00e9rer vos formulaires en toute simplicit\u00e9."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personnalisez les messages d'erreur par d\u00e9faut affich\u00e9s lorsque les utilisateurs soumettent des entr\u00e9es de formulaire invalides ou incompl\u00e8tes."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Activez la protection contre le spam pour vos formulaires en utilisant des services CAPTCHA ou une s\u00e9curit\u00e9 de type honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Connectez et g\u00e9rez vos passerelles de paiement pour accepter en toute s\u00e9curit\u00e9 les transactions via vos formulaires."],"1% transaction and payment gateway fees apply.":["Des frais de transaction et de passerelle de paiement de 1 % s'appliquent."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Des frais de transaction et de passerelle de paiement de 2,9 % s'appliquent. Activez la licence pour r\u00e9duire les frais de transaction."],"2.9% transaction and payment gateway fees apply.":["Des frais de transaction et de passerelle de paiement de 2,9 % s'appliquent."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Veuillez visiter %1$s, supprimer un webhook inutilis\u00e9, puis cliquer ci-dessous pour r\u00e9essayer."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms n'a pas pu cr\u00e9er un webhook car votre compte Stripe a \u00e9puis\u00e9 ses emplacements gratuits. Les webhooks sont n\u00e9cessaires pour recevoir des mises \u00e0 jour sur les paiements."],"Stripe Dashboard":["Tableau de bord Stripe"],"Creating\u2026":["Cr\u00e9ation\u2026"],"Create Webhook":["Cr\u00e9er un Webhook"],"Successfully connected to Stripe!":["Connexion r\u00e9ussie \u00e0 Stripe !"],"Invalid response from server. Please try again.":["R\u00e9ponse invalide du serveur. Veuillez r\u00e9essayer."],"Failed to disconnect Stripe account.":["\u00c9chec de la d\u00e9connexion du compte Stripe."],"Webhook created successfully!":["Webhook cr\u00e9\u00e9 avec succ\u00e8s !"],"Select Currency":["S\u00e9lectionner la devise"],"Select the default currency for payment forms.":["S\u00e9lectionnez la devise par d\u00e9faut pour les formulaires de paiement."],"Connection Status":["Statut de la connexion"],"Disconnect Stripe Account":["D\u00e9connecter le compte Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["\u00cates-vous s\u00fbr de vouloir d\u00e9connecter votre compte Stripe ? Cela arr\u00eatera tous les paiements actifs, abonnements et transactions de formulaire li\u00e9s \u00e0 ce compte."],"Disconnect":["D\u00e9connecter"],"Disconnecting\u2026":["D\u00e9connexion\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook connect\u00e9 avec succ\u00e8s, tous les \u00e9v\u00e9nements Stripe sont suivis."],"Connect your Stripe account to start accepting payments through your forms.":["Connectez votre compte Stripe pour commencer \u00e0 accepter les paiements via vos formulaires."],"Connect to Stripe":["Connectez-vous \u00e0 Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Connectez-vous en toute s\u00e9curit\u00e9 \u00e0 Stripe en quelques clics pour commencer \u00e0 accepter les paiements !"],"Payment Methods":["M\u00e9thodes de paiement"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Le mode test vous permet de traiter les paiements sans frais r\u00e9els. Passez en mode Live pour des transactions r\u00e9elles."],"General Payment Settings":["Param\u00e8tres g\u00e9n\u00e9raux de paiement"],"These settings apply to all payment gateways.":["Ces param\u00e8tres s'appliquent \u00e0 toutes les passerelles de paiement."],"Stripe Settings":["Param\u00e8tres Stripe"],"Left ($100)":["Gauche (100 $)"],"Right (100$)":["D'accord (100$)"],"Left Space ($ 100)":["Espace gauche (100 $)"],"Right Space (100 $)":["Espace droit (100 $)"],"Currency Sign Position":["Position du signe mon\u00e9taire"],"Select the position of the currency symbol relative to the amount.":["S\u00e9lectionnez la position du symbole mon\u00e9taire par rapport au montant."],"Learn":["Apprendre"],"Enable email summaries":["Activer les r\u00e9sum\u00e9s par e-mail"],"Enable IP logging":["Activer la journalisation IP"],"Turn on Admin Notification from here.":["Activez la notification d'administration \u00e0 partir d'ici."],"Send entries to 100+ popular apps.":["Envoyez des entr\u00e9es \u00e0 plus de 100 applications populaires."],"Build automated workflows that run instantly.":["Cr\u00e9ez des flux de travail automatis\u00e9s qui s'ex\u00e9cutent instantan\u00e9ment."],"Create custom app integrations using our Custom App feature.":["Cr\u00e9ez des int\u00e9grations d'applications personnalis\u00e9es en utilisant notre fonctionnalit\u00e9 d'application personnalis\u00e9e."],"Keep your tools in sync automatically.":["Gardez vos outils synchronis\u00e9s automatiquement."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Cela installera et activera OttoKit sur votre site WordPress pour activer les fonctionnalit\u00e9s d'automatisation."],"Automate Your Forms with OttoKit":["Automatisez vos formulaires avec OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Chaque soumission de formulaire devrait d\u00e9clencher quelque chose \u2014 une alerte Slack, un lead CRM, un e-mail de suivi, ou une nouvelle ligne dans Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configurer les autorisations du client IA et les param\u00e8tres du serveur MCP."],"View documentation":["Voir la documentation"],"Copy to clipboard":["Copier dans le presse-papiers"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) ou %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Claude Code"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (projet) ou ~\/.claude.json (global)"],"Cursor":["Curseur"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (projet) ou settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml ou config.json"],"Your client's MCP configuration file":["Le fichier de configuration MCP de votre client"],"Connect Your AI Client":["Connectez votre client IA"],"AI Client":["Client IA"],"Create an Application Password \u2014 ":["Cr\u00e9er un mot de passe d'application \u2014"],"Open Application Passwords":["Ouvrir les mots de passe de l'application"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Ou utilisez cette commande CLI pour ajouter le serveur rapidement (vous devrez toujours d\u00e9finir les variables d'environnement) :"],"Copy the JSON config below into: ":["Copiez la configuration JSON ci-dessous dans :"],"Replace \"your-application-password\" with the password from Step 1.":["Remplacez \"your-application-password\" par le mot de passe de l'\u00e9tape 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 l'endpoint MCP de votre site. WP_API_USERNAME \u2014 votre nom d'utilisateur WordPress. WP_API_PASSWORD \u2014 le mot de passe de l'application que vous avez g\u00e9n\u00e9r\u00e9."],"View setup docs":["Voir les documents de configuration"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Le plugin MCP Adapter est install\u00e9 mais pas actif. Activez-le pour configurer les param\u00e8tres MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Le plugin MCP Adapter est n\u00e9cessaire pour connecter les clients IA \u00e0 vos formulaires. T\u00e9l\u00e9chargez-le et installez-le depuis GitHub, puis activez-le."],"Download the latest release from":["T\u00e9l\u00e9chargez la derni\u00e8re version depuis"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installez le plugin via Extensions > Ajouter une nouvelle extension > T\u00e9l\u00e9verser une extension."],"Activate the MCP Adapter plugin.":["Activez le plugin d'adaptateur MCP."],"Activating\u2026":["Activation\u2026"],"Activate MCP Adapter":["Activer l'adaptateur MCP"],"Download MCP Adapter":["T\u00e9l\u00e9charger l'adaptateur MCP"],"Experimental":["Exp\u00e9rimental"],"Enable Abilities":["Activer les capacit\u00e9s"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Enregistrez les capacit\u00e9s de SureForms avec l'API des capacit\u00e9s de WordPress. Lorsqu'elle est activ\u00e9e, les clients IA peuvent lister, lire, cr\u00e9er, modifier et supprimer vos formulaires et entr\u00e9es. Lorsqu'elle est d\u00e9sactiv\u00e9e, aucune capacit\u00e9 n'est enregistr\u00e9e et les clients IA ne peuvent effectuer aucune action sur vos formulaires."],"Abilities API \u2014 Edit":["API des capacit\u00e9s \u2014 Modifier"],"Enable Edit Abilities":["Activer les capacit\u00e9s d'\u00e9dition"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Lorsqu'elle est activ\u00e9e, les clients IA peuvent cr\u00e9er de nouveaux formulaires, mettre \u00e0 jour les titres, les champs et les param\u00e8tres des formulaires, dupliquer des formulaires et modifier les statuts des entr\u00e9es. Lorsqu'elle est d\u00e9sactiv\u00e9e, ces capacit\u00e9s sont d\u00e9senregistr\u00e9es et les clients IA peuvent uniquement lire vos donn\u00e9es."],"Abilities API \u2014 Delete":["API des capacit\u00e9s \u2014 Supprimer"],"Enable Delete Abilities":["Activer les capacit\u00e9s de suppression"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Lorsqu'ils sont activ\u00e9s, les clients IA peuvent supprimer d\u00e9finitivement des formulaires et des entr\u00e9es. Les donn\u00e9es supprim\u00e9es ne peuvent pas \u00eatre r\u00e9cup\u00e9r\u00e9es. Lorsqu'ils sont d\u00e9sactiv\u00e9s, les capacit\u00e9s de suppression sont d\u00e9senregistr\u00e9es et les clients IA ne peuvent supprimer aucune donn\u00e9e."],"MCP Server":["Serveur MCP"],"Enable MCP Server":["Activer le serveur MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Cr\u00e9e un point de terminaison SureForms MCP d\u00e9di\u00e9 auquel les clients IA comme Claude peuvent se connecter. Lorsqu'il est d\u00e9sactiv\u00e9, le point de terminaison est supprim\u00e9 et les clients IA externes ne peuvent pas d\u00e9couvrir ou appeler les capacit\u00e9s de SureForms."],"Learn more":["En savoir plus"],"MCP Adapter Required":["Adaptateur MCP requis"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configurez la cl\u00e9 API Google Maps pour la saisie semi-automatique des adresses et l'aper\u00e7u de la carte."],"Help shape the future of SureForms":["Aidez \u00e0 fa\u00e7onner l'avenir de SureForms"],"Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ":["Partagez comment vous utilisez le plugin afin que nous puissions d\u00e9velopper des fonctionnalit\u00e9s qui comptent, r\u00e9soudre les probl\u00e8mes plus rapidement et prendre des d\u00e9cisions plus \u00e9clair\u00e9es."],"Enable Google Address Autocomplete":["Activer la saisie semi-automatique d'adresse Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Passez au plan d'affaires SureForms pour ajouter la saisie semi-automatique d'adresses aliment\u00e9e par Google avec un aper\u00e7u de la carte interactive \u00e0 vos formulaires."],"Auto-suggest addresses as users type for faster, error-free submissions":["Sugg\u00e9rer automatiquement des adresses au fur et \u00e0 mesure que les utilisateurs tapent pour des soumissions plus rapides et sans erreur"],"Show an interactive map preview with draggable pin for precise locations":["Afficher un aper\u00e7u de carte interactif avec un rep\u00e8re d\u00e9pla\u00e7able pour des emplacements pr\u00e9cis"],"Automatically populate address fields like city, state, and postal code":["Remplir automatiquement les champs d'adresse tels que la ville, l'\u00e9tat et le code postal"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tableau de bord"],"Settings":["Param\u00e8tres"],"Entries":["Entr\u00e9es"],"Activated":["Activ\u00e9"],"Activate":["Activer"],"Monday":["Lundi"],"Forms":["Formulaires"],"New Form Submission - %s":["Nouvelle soumission de formulaire - %s"],"GitHub":["GitHub"],"(no title)":["(pas de titre)"],"General":["G\u00e9n\u00e9ral"],"No tags available":["Aucune \u00e9tiquette disponible"],"Generic tags":["Balises g\u00e9n\u00e9riques"],"Other":["Autre"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"Install":["Installer"],"Plugin Installation failed, Please try again later.":["L'installation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Plugin activation failed, Please try again later.":["L'activation du plugin a \u00e9chou\u00e9, veuillez r\u00e9essayer plus tard."],"Integrations":["Int\u00e9grations"],"What's New?":["Quoi de neuf ?"],"Core":["C\u0153ur"],"Unlicensed":["Sans licence"],"Connecting\u2026":["Connexion\u2026"],"Install & Activate":["Installer et activer"],"Compliance Settings":["Param\u00e8tres de conformit\u00e9"],"Enable GDPR Compliance":["Activer la conformit\u00e9 RGPD"],"Never store entry data after form submission":["Ne jamais conserver les donn\u00e9es d'entr\u00e9e apr\u00e8s la soumission du formulaire"],"When enabled this form will never store Entries.":["Lorsqu'il est activ\u00e9, ce formulaire ne stockera jamais les entr\u00e9es."],"Automatically delete entries":["Supprimer automatiquement les entr\u00e9es"],"When enabled this form will automatically delete entries after a certain period of time.":["Lorsque cette option est activ\u00e9e, ce formulaire supprimera automatiquement les entr\u00e9es apr\u00e8s une certaine p\u00e9riode de temps."],"Entries older than the days set will be deleted automatically.":["Les entr\u00e9es plus anciennes que le nombre de jours d\u00e9fini seront supprim\u00e9es automatiquement."],"Visual":["Visuel"],"HTML":["HTML"],"All Data":["Toutes les donn\u00e9es"],"Add Shortcode":["Ajouter un shortcode"],"Form input tags":["Balises de saisie de formulaire"],"Comma separated values are also accepted.":["Les valeurs s\u00e9par\u00e9es par des virgules sont \u00e9galement accept\u00e9es."],"Email Notification":["Notification par e-mail"],"Name":["Nom"],"Send Email To":["Envoyer un e-mail \u00e0"],"Subject":["Sujet"],"CC":["CC"],"BCC":["Cci"],"Reply To":["R\u00e9pondre \u00e0"],"Add Key":["Ajouter une cl\u00e9"],"Add Value":["Ajouter de la valeur"],"Add":["Ajouter"],"Confirmation Message":["Message de confirmation"],"After Form Submission":["Apr\u00e8s la soumission du formulaire"],"Hide Form":["Masquer le formulaire"],"Reset Form":["R\u00e9initialiser le formulaire"],"Custom URL":["URL personnalis\u00e9e"],"Add Query Parameters":["Ajouter des param\u00e8tres de requ\u00eate"],"Select if you want to add key-value pairs for form fields to include in query parameters":["S\u00e9lectionnez si vous souhaitez ajouter des paires cl\u00e9-valeur pour les champs de formulaire \u00e0 inclure dans les param\u00e8tres de requ\u00eate"],"Query Parameters":["Param\u00e8tres de requ\u00eate"],"Success Message":["Message de r\u00e9ussite"],"Redirect":["Rediriger"],"Redirect to":["Rediriger vers"],"Page":["Page"],"Form Confirmation":["Confirmation du formulaire"],"Confirmation Type":["Type de confirmation"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisible"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validations"],"Spam Protection":["Protection contre le spam"],"If this option is turned on, the user's IP address will be saved with the form data":["Si cette option est activ\u00e9e, l'adresse IP de l'utilisateur sera enregistr\u00e9e avec les donn\u00e9es du formulaire"],"Enable Honeypot Security":["Activer la s\u00e9curit\u00e9 Honeypot"],"Enable Honeypot Security for better spam protection":["Activez la s\u00e9curit\u00e9 Honeypot pour une meilleure protection contre le spam"],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s repr\u00e9sente le nombre minimum de s\u00e9lections n\u00e9cessaires. Par exemple : \u00ab Un minimum de 2 s\u00e9lections est requis. \u00bb"],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s repr\u00e9sente le nombre maximum de s\u00e9lections autoris\u00e9es. Par exemple : \u00ab Maximum 4 s\u00e9lections autoris\u00e9es. \u00bb"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s repr\u00e9sente le nombre minimum de choix n\u00e9cessaires. Par exemple : \u00ab Au moins 1 s\u00e9lection est requise. \u00bb"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s repr\u00e9sente le nombre maximum de choix autoris\u00e9s. Par exemple : \u00ab Maximum de 3 s\u00e9lections autoris\u00e9es. \u00bb"]," Error Message":["Message d'erreur"],"Email Summaries":["R\u00e9sum\u00e9s d'e-mails"],"Tuesday":["Mardi"],"Wednesday":["Mercredi"],"Thursday":["Jeudi"],"Friday":["Vendredi"],"Saturday":["Samedi"],"Sunday":["Dimanche"],"Schedule Reports":["Programmer les rapports"],"Auto":["Auto"],"Light":["Lumi\u00e8re"],"Dark":["Sombre"],"Turnstile":["Tourniquet"],"Get Keys":["Obtenir les cl\u00e9s"],"Documentation":["Documentation"],"Site Key":["Cl\u00e9 du site"],"Secret Key":["Cl\u00e9 secr\u00e8te"],"Cloudflare Turnstile":["Tourniquet Cloudflare"],"Appearance Mode":["Mode d'apparence"],"Test Email":["Email de test"],"IP Logging":["Journalisation IP"],"Honeypot":["Pot de miel"],"Confirmation Email Mismatch Message":["Message de non-correspondance de l'email de confirmation"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s repr\u00e9sente la valeur d'entr\u00e9e minimale. Par exemple : \"La valeur minimale est 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s repr\u00e9sente la valeur d'entr\u00e9e maximale. Par exemple : \"La valeur maximale est 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connectez-vous avec OttoKit"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%1$s). Cela peut entra\u00eener le blocage ou le marquage de vos e-mails de notification comme spam. Alternativement, essayez d'utiliser une adresse De qui correspond au nom de domaine de votre site web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%s). Cela peut entra\u00eener le blocage de vos e-mails de notification ou leur classement en tant que spam."],"We strongly recommend that you install the free ":["Nous vous recommandons vivement d'installer le gratuit"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin ! L'assistant de configuration facilite la correction de vos e-mails."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativement, essayez d'utiliser une adresse d'exp\u00e9diteur qui correspond au domaine de votre site web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Veuillez entrer une adresse e-mail valide. Vos notifications ne seront pas envoy\u00e9es si le champ n'est pas correctement rempli."],"From Name":["De la part de Nom"],"From Email":["De l'email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'adresse e-mail actuelle de l'exp\u00e9diteur peut ne pas correspondre au nom de domaine de votre site web (%1$s). Cela peut entra\u00eener le blocage ou le marquage comme spam de vos e-mails de notification. Alternativement, essayez d'utiliser une adresse de l'exp\u00e9diteur qui correspond au nom de domaine de votre site web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'adresse e-mail actuelle 'De' peut ne pas correspondre au nom de domaine de votre site web (%s). Cela peut entra\u00eener le blocage de vos e-mails de notification ou leur marquage comme spam."],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Pr\u00eat \u00e0 aller au-del\u00e0 du plan gratuit ?"],"Upgrade now":["Mettez \u00e0 niveau maintenant"],"and unlock the full power of SureForms!":["et d\u00e9bloquez toute la puissance de SureForms !"],"Upgrade SureForms":["Mettre \u00e0 niveau SureForms"],"Upgrade Now":["Mettez \u00e0 niveau maintenant"],"Entries older than the selected days will be deleted.":["Les entr\u00e9es plus anciennes que les jours s\u00e9lectionn\u00e9s seront supprim\u00e9es."],"Entries Time Period":["P\u00e9riode des entr\u00e9es"],"Notifications can use only one From Email so please enter a single address.":["Les notifications ne peuvent utiliser qu'une seule adresse e-mail d'exp\u00e9diteur, veuillez donc entrer une seule adresse."],"Select Page to redirect":["S\u00e9lectionnez la page \u00e0 rediriger"],"Search for a page":["Rechercher une page"],"Select a page":["S\u00e9lectionnez une page"],"Form Validation":["Validation de formulaire"],"Required Error Messages":["Messages d'erreur requis"],"Other Error Messages":["Autres messages d'erreur"],"Input Field Unique":["Champ de saisie unique"],"Email Field Unique":["Champ de courriel unique"],"Invalid URL":["URL invalide"],"Phone Field Unique":["Champ de t\u00e9l\u00e9phone unique"],"Invalid Field Number Block":["Bloc de num\u00e9ro de champ invalide"],"Invalid Email":["Email invalide"],"Number Minimum Value":["Valeur minimale du nombre"],"Number Maximum Value":["Valeur maximale du nombre"],"Dropdown Minimum Selections":["S\u00e9lections minimales du menu d\u00e9roulant"],"Dropdown Maximum Selections":["S\u00e9lections Maximales du Menu D\u00e9roulant"],"Multiple Choice Minimum Selections":["S\u00e9lections minimales \u00e0 choix multiple"],"Multiple Choice Maximum Selections":["S\u00e9lections maximales \u00e0 choix multiple"],"Input Field":["Champ de saisie"],"Email Field":["Champ de courriel"],"URL Field":["Champ URL"],"Phone Field":["Champ T\u00e9l\u00e9phone"],"Textarea Field":["Champ de zone de texte"],"Checkbox Field":["Champ de case \u00e0 cocher"],"Dropdown Field":["Champ d\u00e9roulant"],"Multiple Choice Field":["Champ \u00e0 choix multiple"],"Address Field":["Champ d'adresse"],"Number Field":["Champ num\u00e9rique"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Pour activer la fonctionnalit\u00e9 reCAPTCHA sur vos SureForms, veuillez activer l'option reCAPTCHA dans les param\u00e8tres de vos blocs et s\u00e9lectionner la version. Ajoutez ici la cl\u00e9 secr\u00e8te et la cl\u00e9 de site de Google reCAPTCHA. reCAPTCHA sera ajout\u00e9 \u00e0 votre page sur le front-end."],"Enter your %s here":["Entrez votre %s ici"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Pour activer hCAPTCHA, veuillez ajouter votre cl\u00e9 de site et votre cl\u00e9 secr\u00e8te. Configurez ces param\u00e8tres dans le formulaire individuel."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Pour activer Cloudflare Turnstile, veuillez ajouter votre cl\u00e9 de site et votre cl\u00e9 secr\u00e8te. Configurez ces param\u00e8tres dans le formulaire individuel."],"Save":["Sauvegarder"],"Anonymous Analytics":["Analytique Anonyme"],"Learn More":["En savoir plus"],"Admin Notification":["Notification d'administration"],"Enable Admin Notification":["Activer la notification administrateur"],"Admin notifications keep you informed about new form entries since your last visit.":["Les notifications administratives vous informent des nouvelles entr\u00e9es de formulaire depuis votre derni\u00e8re visite."],"Continue":["Continuer"],"Maximum Number of Entries":["Nombre maximum d'entr\u00e9es"],"Maximum Entries":["Entr\u00e9es maximales"],"Response Description After Maximum Entries":["Description de la r\u00e9ponse apr\u00e8s le nombre maximum d'entr\u00e9es"],"Get Started":["Commencer"],"Integration":["Int\u00e9gration"],"Connect Native Integrations with SureForms":["Connectez les int\u00e9grations natives avec SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["D\u00e9bloquez des int\u00e9grations puissantes dans le plan Premium pour automatiser vos flux de travail et connecter SureForms directement \u00e0 vos outils pr\u00e9f\u00e9r\u00e9s."],"Send form submissions straight to CRMs, email, and marketing platforms":["Envoyez les soumissions de formulaires directement aux CRM, par e-mail et aux plateformes de marketing"],"Automate repetitive tasks with seamless data syncing":["Automatisez les t\u00e2ches r\u00e9p\u00e9titives avec une synchronisation des donn\u00e9es transparente"],"Access exclusive native integrations for faster workflows":["Acc\u00e9dez \u00e0 des int\u00e9grations natives exclusives pour des flux de travail plus rapides"],"Expected format for emails - email@sureforms.com or John Doe ":["Format attendu pour les e-mails - email@sureforms.com ou John Doe "],"Payments":["Paiements"],"Stripe account disconnected successfully.":["Compte Stripe d\u00e9connect\u00e9 avec succ\u00e8s."],"Failed to create webhook.":["\u00c9chec de la cr\u00e9ation du webhook."],"Failed to connect to Stripe.":["\u00c9chec de la connexion \u00e0 Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Base de connaissances"],"What\u2019s New":["Quoi de neuf"],"delete":["supprimer"],"Please type \"%s\" in the input box":["Veuillez taper \"%s\" dans la bo\u00eete de saisie"],"To confirm, type \"%s\" in the box below:":["Pour confirmer, tapez \"%s\" dans la case ci-dessous :"],"Type \"%s\"":["Tapez \"%s\""],"Go to OttoKit Settings":["Acc\u00e9dez aux param\u00e8tres OttoKit"],"USD - US Dollar":["USD - Dollar am\u00e9ricain"],"Payment Mode":["Mode de paiement"],"Test Mode":["Mode Test"],"Live Mode":["Mode en direct"],"General Settings":["Param\u00e8tres g\u00e9n\u00e9raux"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Configurez les r\u00e9sum\u00e9s d'e-mails, les alertes administratives et les pr\u00e9f\u00e9rences de donn\u00e9es pour g\u00e9rer vos formulaires en toute simplicit\u00e9."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personnalisez les messages d'erreur par d\u00e9faut affich\u00e9s lorsque les utilisateurs soumettent des entr\u00e9es de formulaire invalides ou incompl\u00e8tes."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Activez la protection contre le spam pour vos formulaires en utilisant des services CAPTCHA ou une s\u00e9curit\u00e9 de type honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Connectez et g\u00e9rez vos passerelles de paiement pour accepter en toute s\u00e9curit\u00e9 les transactions via vos formulaires."],"1% transaction and payment gateway fees apply.":["Des frais de transaction et de passerelle de paiement de 1 % s'appliquent."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Des frais de transaction et de passerelle de paiement de 2,9 % s'appliquent. Activez la licence pour r\u00e9duire les frais de transaction."],"2.9% transaction and payment gateway fees apply.":["Des frais de transaction et de passerelle de paiement de 2,9 % s'appliquent."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Veuillez visiter %1$s, supprimer un webhook inutilis\u00e9, puis cliquer ci-dessous pour r\u00e9essayer."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms n'a pas pu cr\u00e9er un webhook car votre compte Stripe a \u00e9puis\u00e9 ses emplacements gratuits. Les webhooks sont n\u00e9cessaires pour recevoir des mises \u00e0 jour sur les paiements."],"Stripe Dashboard":["Tableau de bord Stripe"],"Creating\u2026":["Cr\u00e9ation\u2026"],"Create Webhook":["Cr\u00e9er un Webhook"],"Successfully connected to Stripe!":["Connexion r\u00e9ussie \u00e0 Stripe !"],"Invalid response from server. Please try again.":["R\u00e9ponse invalide du serveur. Veuillez r\u00e9essayer."],"Failed to disconnect Stripe account.":["\u00c9chec de la d\u00e9connexion du compte Stripe."],"Webhook created successfully!":["Webhook cr\u00e9\u00e9 avec succ\u00e8s !"],"Select Currency":["S\u00e9lectionner la devise"],"Select the default currency for payment forms.":["S\u00e9lectionnez la devise par d\u00e9faut pour les formulaires de paiement."],"Connection Status":["Statut de la connexion"],"Disconnect Stripe Account":["D\u00e9connecter le compte Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["\u00cates-vous s\u00fbr de vouloir d\u00e9connecter votre compte Stripe ? Cela arr\u00eatera tous les paiements actifs, abonnements et transactions de formulaire li\u00e9s \u00e0 ce compte."],"Disconnect":["D\u00e9connecter"],"Disconnecting\u2026":["D\u00e9connexion\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook connect\u00e9 avec succ\u00e8s, tous les \u00e9v\u00e9nements Stripe sont suivis."],"Connect your Stripe account to start accepting payments through your forms.":["Connectez votre compte Stripe pour commencer \u00e0 accepter les paiements via vos formulaires."],"Connect to Stripe":["Connectez-vous \u00e0 Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Connectez-vous en toute s\u00e9curit\u00e9 \u00e0 Stripe en quelques clics pour commencer \u00e0 accepter les paiements !"],"Set the total number of submissions allowed for this form.":["D\u00e9finissez le nombre total de soumissions autoris\u00e9es pour ce formulaire."],"Payment Methods":["M\u00e9thodes de paiement"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Le mode test vous permet de traiter les paiements sans frais r\u00e9els. Passez en mode Live pour des transactions r\u00e9elles."],"General Payment Settings":["Param\u00e8tres g\u00e9n\u00e9raux de paiement"],"These settings apply to all payment gateways.":["Ces param\u00e8tres s'appliquent \u00e0 toutes les passerelles de paiement."],"Stripe Settings":["Param\u00e8tres Stripe"],"Left ($100)":["Gauche (100 $)"],"Right (100$)":["D'accord (100$)"],"Left Space ($ 100)":["Espace gauche (100 $)"],"Right Space (100 $)":["Espace droit (100 $)"],"Currency Sign Position":["Position du signe mon\u00e9taire"],"Select the position of the currency symbol relative to the amount.":["S\u00e9lectionnez la position du symbole mon\u00e9taire par rapport au montant."],"Learn":["Apprendre"],"Enable email summaries":["Activer les r\u00e9sum\u00e9s par e-mail"],"Enable IP logging":["Activer la journalisation IP"],"Turn on Admin Notification from here.":["Activez la notification d'administration \u00e0 partir d'ici."],"Send entries to 100+ popular apps.":["Envoyez des entr\u00e9es \u00e0 plus de 100 applications populaires."],"Build automated workflows that run instantly.":["Cr\u00e9ez des flux de travail automatis\u00e9s qui s'ex\u00e9cutent instantan\u00e9ment."],"Create custom app integrations using our Custom App feature.":["Cr\u00e9ez des int\u00e9grations d'applications personnalis\u00e9es en utilisant notre fonctionnalit\u00e9 d'application personnalis\u00e9e."],"Keep your tools in sync automatically.":["Gardez vos outils synchronis\u00e9s automatiquement."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Cela installera et activera OttoKit sur votre site WordPress pour activer les fonctionnalit\u00e9s d'automatisation."],"Automate Your Forms with OttoKit":["Automatisez vos formulaires avec OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Chaque soumission de formulaire devrait d\u00e9clencher quelque chose \u2014 une alerte Slack, un lead CRM, un e-mail de suivi, ou une nouvelle ligne dans Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configurer les autorisations du client IA et les param\u00e8tres du serveur MCP."],"View documentation":["Voir la documentation"],"Copy to clipboard":["Copier dans le presse-papiers"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) ou %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Claude Code"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (projet) ou ~\/.claude.json (global)"],"Cursor":["Curseur"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (projet) ou settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml ou config.json"],"Your client's MCP configuration file":["Le fichier de configuration MCP de votre client"],"Connect Your AI Client":["Connectez votre client IA"],"AI Client":["Client IA"],"Create an Application Password \u2014 ":["Cr\u00e9er un mot de passe d'application \u2014"],"Open Application Passwords":["Ouvrir les mots de passe de l'application"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Ou utilisez cette commande CLI pour ajouter le serveur rapidement (vous devrez toujours d\u00e9finir les variables d'environnement) :"],"Copy the JSON config below into: ":["Copiez la configuration JSON ci-dessous dans :"],"Replace \"your-application-password\" with the password from Step 1.":["Remplacez \"your-application-password\" par le mot de passe de l'\u00e9tape 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 l'endpoint MCP de votre site. WP_API_USERNAME \u2014 votre nom d'utilisateur WordPress. WP_API_PASSWORD \u2014 le mot de passe de l'application que vous avez g\u00e9n\u00e9r\u00e9."],"View setup docs":["Voir les documents de configuration"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Le plugin MCP Adapter est install\u00e9 mais pas actif. Activez-le pour configurer les param\u00e8tres MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Le plugin MCP Adapter est n\u00e9cessaire pour connecter les clients IA \u00e0 vos formulaires. T\u00e9l\u00e9chargez-le et installez-le depuis GitHub, puis activez-le."],"Download the latest release from":["T\u00e9l\u00e9chargez la derni\u00e8re version depuis"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installez le plugin via Extensions > Ajouter une nouvelle extension > T\u00e9l\u00e9verser une extension."],"Activate the MCP Adapter plugin.":["Activez le plugin d'adaptateur MCP."],"Activating\u2026":["Activation\u2026"],"Activate MCP Adapter":["Activer l'adaptateur MCP"],"Download MCP Adapter":["T\u00e9l\u00e9charger l'adaptateur MCP"],"Experimental":["Exp\u00e9rimental"],"Enable Abilities":["Activer les capacit\u00e9s"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Enregistrez les capacit\u00e9s de SureForms avec l'API des capacit\u00e9s de WordPress. Lorsqu'elle est activ\u00e9e, les clients IA peuvent lister, lire, cr\u00e9er, modifier et supprimer vos formulaires et entr\u00e9es. Lorsqu'elle est d\u00e9sactiv\u00e9e, aucune capacit\u00e9 n'est enregistr\u00e9e et les clients IA ne peuvent effectuer aucune action sur vos formulaires."],"Abilities API \u2014 Edit":["API des capacit\u00e9s \u2014 Modifier"],"Enable Edit Abilities":["Activer les capacit\u00e9s d'\u00e9dition"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Lorsqu'elle est activ\u00e9e, les clients IA peuvent cr\u00e9er de nouveaux formulaires, mettre \u00e0 jour les titres, les champs et les param\u00e8tres des formulaires, dupliquer des formulaires et modifier les statuts des entr\u00e9es. Lorsqu'elle est d\u00e9sactiv\u00e9e, ces capacit\u00e9s sont d\u00e9senregistr\u00e9es et les clients IA peuvent uniquement lire vos donn\u00e9es."],"Abilities API \u2014 Delete":["API des capacit\u00e9s \u2014 Supprimer"],"Enable Delete Abilities":["Activer les capacit\u00e9s de suppression"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Lorsqu'ils sont activ\u00e9s, les clients IA peuvent supprimer d\u00e9finitivement des formulaires et des entr\u00e9es. Les donn\u00e9es supprim\u00e9es ne peuvent pas \u00eatre r\u00e9cup\u00e9r\u00e9es. Lorsqu'ils sont d\u00e9sactiv\u00e9s, les capacit\u00e9s de suppression sont d\u00e9senregistr\u00e9es et les clients IA ne peuvent supprimer aucune donn\u00e9e."],"MCP Server":["Serveur MCP"],"Enable MCP Server":["Activer le serveur MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Cr\u00e9e un point de terminaison SureForms MCP d\u00e9di\u00e9 auquel les clients IA comme Claude peuvent se connecter. Lorsqu'il est d\u00e9sactiv\u00e9, le point de terminaison est supprim\u00e9 et les clients IA externes ne peuvent pas d\u00e9couvrir ou appeler les capacit\u00e9s de SureForms."],"Learn more":["En savoir plus"],"MCP Adapter Required":["Adaptateur MCP requis"],"Heading 1":["Titre 1"],"Heading 2":["Titre 2"],"Heading 3":["Titre 3"],"Heading 4":["Titre 4"],"Heading 5":["Titre 5"],"Heading 6":["Titre 6"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configurez la cl\u00e9 API Google Maps pour la saisie semi-automatique des adresses et l'aper\u00e7u de la carte."],"Help shape the future of SureForms":["Aidez \u00e0 fa\u00e7onner l'avenir de SureForms"],"Enable Google Address Autocomplete":["Activer la saisie semi-automatique d'adresse Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Passez au plan d'affaires SureForms pour ajouter la saisie semi-automatique d'adresses aliment\u00e9e par Google avec un aper\u00e7u de la carte interactive \u00e0 vos formulaires."],"Auto-suggest addresses as users type for faster, error-free submissions":["Sugg\u00e9rer automatiquement des adresses au fur et \u00e0 mesure que les utilisateurs tapent pour des soumissions plus rapides et sans erreur"],"Show an interactive map preview with draggable pin for precise locations":["Afficher un aper\u00e7u de carte interactif avec un rep\u00e8re d\u00e9pla\u00e7able pour des emplacements pr\u00e9cis"],"Automatically populate address fields like city, state, and postal code":["Remplir automatiquement les champs d'adresse tels que la ville, l'\u00e9tat et le code postal"],"This form is now closed as we've received all the entries.":["Ce formulaire est maintenant ferm\u00e9 car nous avons re\u00e7u toutes les inscriptions."],"Thank you for contacting us! We will be in touch with you shortly.":["Merci de nous avoir contact\u00e9s ! Nous vous contacterons sous peu."],"Saving\u2026":["Enregistrement\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Lorsqu'il est activ\u00e9, ce formulaire ne stockera pas l'IP de l'utilisateur, le nom du navigateur et le nom de l'appareil dans les entr\u00e9es."],"Form data":["Donn\u00e9es du formulaire"],"Unsaved changes":["Modifications non enregistr\u00e9es"],"Keep editing":["Continuez \u00e0 \u00e9diter"],"Global Defaults":["Param\u00e8tres par d\u00e9faut globaux"],"Form Restrictions":["Restrictions de formulaire"],"Configure default settings that apply to newly created forms.":["Configurer les param\u00e8tres par d\u00e9faut qui s'appliquent aux formulaires nouvellement cr\u00e9\u00e9s."],"Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ":["Collectez des informations non sensibles de votre site web, telles que la version PHP et les fonctionnalit\u00e9s utilis\u00e9es, pour nous aider \u00e0 corriger les bugs plus rapidement, \u00e0 prendre des d\u00e9cisions plus \u00e9clair\u00e9es et \u00e0 d\u00e9velopper des fonctionnalit\u00e9s qui comptent r\u00e9ellement pour vous. "],"Failed to load pages. Please refresh and try again.":["\u00c9chec du chargement des pages. Veuillez actualiser et r\u00e9essayer."],"Failed to load settings. Please refresh and try again.":["\u00c9chec du chargement des param\u00e8tres. Veuillez actualiser et r\u00e9essayer."],"Form Validation fields cannot be left blank.":["Les champs de validation de formulaire ne peuvent pas \u00eatre laiss\u00e9s vides."],"Recipient email is required when email summaries are enabled.":["L'adresse e-mail du destinataire est requise lorsque les r\u00e9sum\u00e9s par e-mail sont activ\u00e9s."],"Please enter a valid recipient email.":["Veuillez entrer une adresse e-mail de destinataire valide."],"Settings saved.":["Param\u00e8tres enregistr\u00e9s."],"Failed to save settings.":["\u00c9chec de l'enregistrement des param\u00e8tres."],"Some settings failed to save. Please retry.":["Certains param\u00e8tres n'ont pas pu \u00eatre enregistr\u00e9s. Veuillez r\u00e9essayer."],"Some fields have unsaved changes. Discard them to continue, or stay to save your edits.":["Certains champs contiennent des modifications non enregistr\u00e9es. Abandonnez-les pour continuer, ou restez pour enregistrer vos modifications."],"Discard & switch":["Annuler et changer"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-fr_FR-8cf77722f0a349f4f2e7f56437f288f9.json b/languages/sureforms-fr_FR-8cf77722f0a349f4f2e7f56437f288f9.json index 893027a26..bc199bd84 100644 --- a/languages/sureforms-fr_FR-8cf77722f0a349f4f2e7f56437f288f9.json +++ b/languages/sureforms-fr_FR-8cf77722f0a349f4f2e7f56437f288f9.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tableau de bord"],"Settings":["Param\u00e8tres"],"Entries":["Entr\u00e9es"],"Move to Trash":["D\u00e9placer vers la corbeille"],"Export":["Exporter"],"Trash":["Poubelle"],"Published":["Publi\u00e9"],"Restore":["Restaurer"],"Delete Permanently":["Supprimer d\u00e9finitivement"],"Activated":["Activ\u00e9"],"Edit":["Modifier"],"Import Form":["Formulaire d'importation"],"Add New Form":["Ajouter un nouveau formulaire"],"View Form":["Voir le formulaire"],"Forms":["Formulaires"],"Shortcode":["Code court"],"(no title)":["(pas de titre)"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"What's New?":["Quoi de neuf ?"],"Core":["C\u0153ur"],"Unlicensed":["Sans licence"],"Page":["Page"],"Clear Filter":["Effacer le filtre"],"No Date":["Aucune date"],"Invalid Date":["Date invalide"],"Ready to go beyond free plan?":["Pr\u00eat \u00e0 aller au-del\u00e0 du plan gratuit ?"],"Upgrade now":["Mettez \u00e0 niveau maintenant"],"and unlock the full power of SureForms!":["et d\u00e9bloquez toute la puissance de SureForms !"],"Upgrade SureForms":["Mettre \u00e0 niveau SureForms"],"Clear Filters":["Effacer les filtres"],"Select Date Range":["S\u00e9lectionner la plage de dates"],"Actions":["Actions"],"Duplicate":["Dupliquer"],"All Forms":["Tous les formulaires"],"Date & Time":["Date et heure"],"Payments":["Paiements"],"Knowledge Base":["Base de connaissances"],"What\u2019s New":["Quoi de neuf"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["jj\/mm\/aaaa - jj\/mm\/aaaa"],"out of":["hors de"],"No entries found":["Aucune entr\u00e9e trouv\u00e9e"],"delete":["supprimer"],"Please type \"%s\" in the input box":["Veuillez taper \"%s\" dans la bo\u00eete de saisie"],"To confirm, type \"%s\" in the box below:":["Pour confirmer, tapez \"%s\" dans la case ci-dessous :"],"Type \"%s\"":["Tapez \"%s\""],"No results found":["Aucun r\u00e9sultat trouv\u00e9"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Nous n'avons trouv\u00e9 aucun enregistrement correspondant \u00e0 vos filtres. Essayez d'ajuster les filtres ou de les r\u00e9initialiser pour voir tous les r\u00e9sultats."],"Please select a file to import.":["Veuillez s\u00e9lectionner un fichier \u00e0 importer."],"Invalid JSON file format.":["Format de fichier JSON invalide."],"Failed to read file.":["\u00c9chec de la lecture du fichier."],"Import failed.":["\u00c9chec de l'importation."],"An error occurred during import.":["Une erreur s'est produite lors de l'importation."],"Import Forms":["Importer des formulaires"],"Please select a valid JSON file.":["Veuillez s\u00e9lectionner un fichier JSON valide."],"Drag and drop or browse files":["Faites glisser et d\u00e9posez ou parcourez les fichiers"],"Importing\u2026":["Importation\u2026"],"Drafts":["Brouillons"],"Search forms\u2026":["Rechercher des formulaires\u2026"],"No forms found":["Aucun formulaire trouv\u00e9"],"Title":["Titre"],"Copied!":["Copi\u00e9 !"],"Copy Shortcode":["Copier le shortcode"],"No Forms":["Pas de formulaires"],"Hi there, let's get you started":["Salut, commen\u00e7ons."],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Il semble que vous n'ayez pas encore cr\u00e9\u00e9 de formulaires. Commencez \u00e0 construire avec SureForms et lancez des formulaires puissants en quelques clics seulement."],"Design forms with our Gutenberg-native builder.":["Concevez des formulaires avec notre cr\u00e9ateur natif de Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Utilisez l'IA pour g\u00e9n\u00e9rer des formulaires instantan\u00e9ment \u00e0 partir d'une simple invite."],"Build engaging conversational, calculation, and multi-step forms.":["Cr\u00e9ez des formulaires engageants de conversation, de calcul et \u00e0 \u00e9tapes multiples."],"Create Form":["Cr\u00e9er un formulaire"],"An error occurred while fetching forms.":["Une erreur s'est produite lors de la r\u00e9cup\u00e9ration des formulaires."],"%d form moved to trash.":["%d formulaire d\u00e9plac\u00e9 dans la corbeille."],"%d form restored.":["%d formulaire restaur\u00e9."],"%d form permanently deleted.":["%d formulaire supprim\u00e9 d\u00e9finitivement."],"An error occurred while performing the action.":["Une erreur s'est produite lors de l'ex\u00e9cution de l'action."],"%d form imported successfully.":["%d formulaire import\u00e9 avec succ\u00e8s."],"%d form will be moved to trash and can be restored later.":["%d formulaire sera d\u00e9plac\u00e9 dans la corbeille et pourra \u00eatre restaur\u00e9 plus tard."],"Delete Form":["Supprimer le formulaire"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["\u00cates-vous s\u00fbr de vouloir supprimer d\u00e9finitivement le formulaire %d ? Cette action ne peut pas \u00eatre annul\u00e9e."],"Restore Form":["Restaurer le formulaire"],"%d form will be restored from trash.":["%d formulaire sera restaur\u00e9 de la corbeille."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["\u00cates-vous s\u00fbr de vouloir supprimer d\u00e9finitivement ce formulaire ? Cette action ne peut pas \u00eatre annul\u00e9e."],"This form will be moved to trash and can be restored later.":["Ce formulaire sera d\u00e9plac\u00e9 dans la corbeille et pourra \u00eatre restaur\u00e9 plus tard."],"An error occurred while duplicating the form.":["Une erreur s'est produite lors de la duplication du formulaire."],"This will create a copy of \"%s\" with all its settings.":["Cela cr\u00e9era une copie de \"%s\" avec tous ses param\u00e8tres."],"Learn":["Apprendre"],"Export failed: no data received.":["\u00c9chec de l'exportation : aucune donn\u00e9e re\u00e7ue."],"Select a SureForms export file (.json) to import.":["S\u00e9lectionnez un fichier d'exportation SureForms (.json) \u00e0 importer."],"Drop a form file (.json) here":["D\u00e9posez un fichier de formulaire (.json) ici"],"(Draft)":["(Brouillon)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Cr\u00e9ez des formulaires instantan\u00e9s et partagez-les avec un lien, sans besoin d'int\u00e9gration."],"Form \"%s\" duplicated successfully.":["Le formulaire \"%s\" a \u00e9t\u00e9 dupliqu\u00e9 avec succ\u00e8s."],"Error loading forms":["Erreur de chargement des formulaires"],"Move form to trash?":["D\u00e9placer le formulaire vers la corbeille ?"],"Delete form?":["Supprimer le formulaire ?"],"Duplicate form?":["Dupliquer le formulaire ?"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tableau de bord"],"Settings":["Param\u00e8tres"],"Entries":["Entr\u00e9es"],"Move to Trash":["D\u00e9placer vers la corbeille"],"Export":["Exporter"],"Trash":["Poubelle"],"Published":["Publi\u00e9"],"Restore":["Restaurer"],"Delete Permanently":["Supprimer d\u00e9finitivement"],"Activated":["Activ\u00e9"],"Edit":["Modifier"],"Import Form":["Formulaire d'importation"],"Add New Form":["Ajouter un nouveau formulaire"],"View Form":["Voir le formulaire"],"Forms":["Formulaires"],"Shortcode":["Code court"],"(no title)":["(pas de titre)"],"Confirm":["Confirmer"],"Cancel":["Annuler"],"What's New?":["Quoi de neuf ?"],"Core":["C\u0153ur"],"Unlicensed":["Sans licence"],"Page":["Page"],"Clear Filter":["Effacer le filtre"],"No Date":["Aucune date"],"Invalid Date":["Date invalide"],"Ready to go beyond free plan?":["Pr\u00eat \u00e0 aller au-del\u00e0 du plan gratuit ?"],"Upgrade now":["Mettez \u00e0 niveau maintenant"],"and unlock the full power of SureForms!":["et d\u00e9bloquez toute la puissance de SureForms !"],"Upgrade SureForms":["Mettre \u00e0 niveau SureForms"],"Clear Filters":["Effacer les filtres"],"Select Date Range":["S\u00e9lectionner la plage de dates"],"Actions":["Actions"],"Duplicate":["Dupliquer"],"All Forms":["Tous les formulaires"],"Date & Time":["Date et heure"],"Payments":["Paiements"],"Knowledge Base":["Base de connaissances"],"What\u2019s New":["Quoi de neuf"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["jj\/mm\/aaaa - jj\/mm\/aaaa"],"out of":["hors de"],"No entries found":["Aucune entr\u00e9e trouv\u00e9e"],"delete":["supprimer"],"Please type \"%s\" in the input box":["Veuillez taper \"%s\" dans la bo\u00eete de saisie"],"To confirm, type \"%s\" in the box below:":["Pour confirmer, tapez \"%s\" dans la case ci-dessous :"],"Type \"%s\"":["Tapez \"%s\""],"No results found":["Aucun r\u00e9sultat trouv\u00e9"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Nous n'avons trouv\u00e9 aucun enregistrement correspondant \u00e0 vos filtres. Essayez d'ajuster les filtres ou de les r\u00e9initialiser pour voir tous les r\u00e9sultats."],"Please select a file to import.":["Veuillez s\u00e9lectionner un fichier \u00e0 importer."],"Invalid JSON file format.":["Format de fichier JSON invalide."],"Failed to read file.":["\u00c9chec de la lecture du fichier."],"Import failed.":["\u00c9chec de l'importation."],"An error occurred during import.":["Une erreur s'est produite lors de l'importation."],"Import Forms":["Importer des formulaires"],"Please select a valid JSON file.":["Veuillez s\u00e9lectionner un fichier JSON valide."],"Drag and drop or browse files":["Faites glisser et d\u00e9posez ou parcourez les fichiers"],"Importing\u2026":["Importation\u2026"],"Drafts":["Brouillons"],"Search forms\u2026":["Rechercher des formulaires\u2026"],"No forms found":["Aucun formulaire trouv\u00e9"],"Title":["Titre"],"Copied!":["Copi\u00e9 !"],"Copy Shortcode":["Copier le shortcode"],"No Forms":["Pas de formulaires"],"Hi there, let's get you started":["Salut, commen\u00e7ons."],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Il semble que vous n'ayez pas encore cr\u00e9\u00e9 de formulaires. Commencez \u00e0 construire avec SureForms et lancez des formulaires puissants en quelques clics seulement."],"Design forms with our Gutenberg-native builder.":["Concevez des formulaires avec notre cr\u00e9ateur natif de Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Utilisez l'IA pour g\u00e9n\u00e9rer des formulaires instantan\u00e9ment \u00e0 partir d'une simple invite."],"Build engaging conversational, calculation, and multi-step forms.":["Cr\u00e9ez des formulaires engageants de conversation, de calcul et \u00e0 \u00e9tapes multiples."],"Create Form":["Cr\u00e9er un formulaire"],"An error occurred while fetching forms.":["Une erreur s'est produite lors de la r\u00e9cup\u00e9ration des formulaires."],"%d form moved to trash.":["%d formulaire d\u00e9plac\u00e9 dans la corbeille."],"%d form restored.":["%d formulaire restaur\u00e9."],"%d form permanently deleted.":["%d formulaire supprim\u00e9 d\u00e9finitivement."],"An error occurred while performing the action.":["Une erreur s'est produite lors de l'ex\u00e9cution de l'action."],"%d form imported successfully.":["%d formulaire import\u00e9 avec succ\u00e8s."],"%d form will be moved to trash and can be restored later.":["%d formulaire sera d\u00e9plac\u00e9 dans la corbeille et pourra \u00eatre restaur\u00e9 plus tard."],"Delete Form":["Supprimer le formulaire"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["\u00cates-vous s\u00fbr de vouloir supprimer d\u00e9finitivement le formulaire %d ? Cette action ne peut pas \u00eatre annul\u00e9e."],"Restore Form":["Restaurer le formulaire"],"%d form will be restored from trash.":["%d formulaire sera restaur\u00e9 de la corbeille."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["\u00cates-vous s\u00fbr de vouloir supprimer d\u00e9finitivement ce formulaire ? Cette action ne peut pas \u00eatre annul\u00e9e."],"This form will be moved to trash and can be restored later.":["Ce formulaire sera d\u00e9plac\u00e9 dans la corbeille et pourra \u00eatre restaur\u00e9 plus tard."],"An error occurred while duplicating the form.":["Une erreur s'est produite lors de la duplication du formulaire."],"This will create a copy of \"%s\" with all its settings.":["Cela cr\u00e9era une copie de \"%s\" avec tous ses param\u00e8tres."],"Learn":["Apprendre"],"Export failed: no data received.":["\u00c9chec de l'exportation : aucune donn\u00e9e re\u00e7ue."],"Select a SureForms export file (.json) to import.":["S\u00e9lectionnez un fichier d'exportation SureForms (.json) \u00e0 importer."],"Drop a form file (.json) here":["D\u00e9posez un fichier de formulaire (.json) ici"],"(Draft)":["(Brouillon)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Cr\u00e9ez des formulaires instantan\u00e9s et partagez-les avec un lien, sans besoin d'int\u00e9gration."],"Form \"%s\" duplicated successfully.":["Le formulaire \"%s\" a \u00e9t\u00e9 dupliqu\u00e9 avec succ\u00e8s."],"Error loading forms":["Erreur de chargement des formulaires"],"Move form to trash?":["D\u00e9placer le formulaire vers la corbeille ?"],"Delete form?":["Supprimer le formulaire ?"],"Duplicate form?":["Dupliquer le formulaire ?"],"Switch to Draft":["Passer en brouillon"],"%d form switched to draft.":["%d formulaire pass\u00e9 en brouillon."],"Switch form to draft?":["Passer le formulaire en brouillon ?"],"%d form will be switched to draft and will no longer be publicly accessible.":["%d formulaire sera bascul\u00e9 en brouillon et ne sera plus accessible publiquement."],"This form will be switched to draft and will no longer be publicly accessible.":["Ce formulaire sera bascul\u00e9 en brouillon et ne sera plus accessible au public."]}}} \ No newline at end of file diff --git a/languages/sureforms-fr_FR-e2cfcb2408d95abf73e3ead4a0965656.json b/languages/sureforms-fr_FR-e2cfcb2408d95abf73e3ead4a0965656.json new file mode 100644 index 000000000..9049f376e --- /dev/null +++ b/languages/sureforms-fr_FR-e2cfcb2408d95abf73e3ead4a0965656.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T13:12:49+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/partialEntriesEmptyState.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Tableau de bord"],"Settings":["Param\u00e8tres"],"Entries":["Entr\u00e9es"],"Activated":["Activ\u00e9"],"Forms":["Formulaires"],"What's New?":["Quoi de neuf ?"],"Core":["C\u0153ur"],"Unlicensed":["Sans licence"],"Ready to go beyond free plan?":["Pr\u00eat \u00e0 aller au-del\u00e0 du plan gratuit ?"],"Upgrade now":["Mettez \u00e0 niveau maintenant"],"and unlock the full power of SureForms!":["et d\u00e9bloquez toute la puissance de SureForms !"],"Upgrade SureForms":["Mettre \u00e0 niveau SureForms"],"Payments":["Paiements"],"Knowledge Base":["Base de connaissances"],"What\u2019s New":["Quoi de neuf"],"Learn":["Apprendre"],"Upgrade to SureForms":["Passer \u00e0 SureForms"],"Partial Entries Placeholder":["Espace r\u00e9serv\u00e9 pour les entr\u00e9es partielles"],"Capture in-progress form data the moment visitors stop typing \u2014 no submit required":["Capturez les donn\u00e9es de formulaire en cours d\u00e8s que les visiteurs cessent de taper \u2014 aucune soumission requise"],"Recover abandoned submissions and follow up with prospects you would otherwise lose":["R\u00e9cup\u00e9rez les soumissions abandonn\u00e9es et faites un suivi avec les prospects que vous perdriez autrement"],"Let visitors pick up where they left off with secure, shareable resume links":["Permettez aux visiteurs de reprendre l\u00e0 o\u00f9 ils se sont arr\u00eat\u00e9s avec des liens de reprise s\u00e9curis\u00e9s et partageables"],"Stop Losing Leads to Abandoned Forms":["Arr\u00eatez de perdre des prospects \u00e0 cause des formulaires abandonn\u00e9s"],"See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:":["Voyez ce que les visiteurs ont tap\u00e9 avant de partir. Passez \u00e0 SureForms Premium pour d\u00e9bloquer les Entr\u00e9es Partielles :"]}}} \ No newline at end of file diff --git a/languages/sureforms-fr_FR.mo b/languages/sureforms-fr_FR.mo index b575a65ca..feacf17ac 100644 Binary files a/languages/sureforms-fr_FR.mo and b/languages/sureforms-fr_FR.mo differ diff --git a/languages/sureforms-fr_FR.po b/languages/sureforms-fr_FR.po index c66754b88..8871b58f1 100644 --- a/languages/sureforms-fr_FR.po +++ b/languages/sureforms-fr_FR.po @@ -14,9 +14,9 @@ msgstr "" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -43,13 +43,14 @@ msgstr "Un moyen simple mais puissant de créer des formulaires modernes pour vo msgid "https://sureforms.com/" msgstr "https://sureforms.com/" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -58,15 +59,16 @@ msgstr "https://sureforms.com/" msgid "Dashboard" msgstr "Tableau de bord" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -74,21 +76,22 @@ msgstr "Tableau de bord" msgid "Settings" msgstr "Paramètres" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "Nouveau formulaire" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -97,7 +100,7 @@ msgid "Entries" msgstr "Entrées" #. Translators: Post Title. -#: admin/admin.php:843 +#: admin/admin.php:869 #, php-format msgid "Edit %1$s" msgstr "Modifier %1$s" @@ -111,19 +114,19 @@ msgstr "Modifier %1$s" #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "La vérification du nonce a échoué." #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 +#: admin/admin.php:1504 #, php-format msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "Veuillez %1$sactiver%2$s votre copie de %3$s pour obtenir de nouvelles fonctionnalités, accéder au support, recevoir des notifications de mise à jour, et plus encore." -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 @@ -191,7 +194,7 @@ msgstr "Poubelle" msgid "Published" msgstr "Publié" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "Voir" @@ -275,17 +278,18 @@ msgstr "Aucun plugin spécifié" msgid "Plugin Successfully Activated" msgstr "Plugin activé avec succès" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "Activation..." -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -294,17 +298,17 @@ msgstr "Activation..." msgid "Activated" msgstr "Activé" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "Activer" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "Installation en cours..." -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "Installé" @@ -312,14 +316,14 @@ msgstr "Installé" msgid "You do not have permission to access this page." msgstr "Vous n'avez pas la permission d'accéder à cette page." -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "Nonce invalide." @@ -328,7 +332,7 @@ msgid "Form ID is required." msgstr "L'identifiant du formulaire est requis." #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1001 msgid "Invalid form ID." msgstr "ID de formulaire invalide." @@ -580,28 +584,23 @@ msgstr "Une erreur s'est produite lors de la soumission de votre formulaire. Veu msgid "Test Email Sent Successfully." msgstr "E-mail de test envoyé avec succès." -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "Aucun formulaire trouvé." #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "Lundi" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" -msgstr "Erreur lors de l'enregistrement des paramètres !" - -#: inc/global-settings/global-settings.php:122 #: assets/build/formEditor.js:172 msgid "Global Settings" msgstr "Paramètres globaux" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "Paramètres enregistrés avec succès." @@ -615,7 +614,6 @@ msgid "Advanced Fields" msgstr "Champs avancés" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "Ce champ est requis." @@ -670,7 +668,7 @@ msgstr "Cacher" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "Modifier le formulaire" @@ -694,37 +692,38 @@ msgstr "Créer" msgid "Import Form" msgstr "Formulaire d'importation" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "Ajouter un nouveau formulaire" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "Aucun enregistrement trouvé" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "C'est ici que vos entrées de formulaire apparaîtront" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "Voir le formulaire" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "Afficher les formulaires" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -732,32 +731,37 @@ msgstr "Afficher les formulaires" msgid "Forms" msgstr "Formulaires" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "Formulaires de recherche" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "Formulaires parents :" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "Aucun formulaire trouvé dans la corbeille." -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "Formulaire publié." -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "Formulaire mis à jour." -#: inc/post-types.php:977 +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 msgid "Admin Notification Email" msgstr "Email de notification d'administration" #. translators: %s: Form title smart tag -#: inc/post-types.php:984 +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 #, php-format msgid "New Form Submission - %s" msgstr "Nouvelle soumission de formulaire - %s" @@ -8221,7 +8225,7 @@ msgstr "Social" msgid "Travel" msgstr "Voyage" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "Formulaire vierge" @@ -8251,6 +8255,7 @@ msgstr "Conçu avec ♡ %s" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "(pas de titre)" @@ -8277,7 +8282,7 @@ msgstr "Changer de formulaire" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "Ce formulaire a été supprimé ou est indisponible." @@ -8323,6 +8328,7 @@ msgstr "Avancé" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "Aucune étiquette disponible" @@ -8367,6 +8373,7 @@ msgstr "Réinitialiser" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "Balises génériques" @@ -8746,6 +8753,7 @@ msgstr "Intégrations" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8758,6 +8766,7 @@ msgstr "Quoi de neuf ?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8770,6 +8779,7 @@ msgstr "Cœur" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8778,52 +8788,52 @@ msgid "Unlicensed" msgstr "Sans licence" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 #, js-format msgid "%s Removed from Quick Action Bar." msgstr "%s retiré de la barre d'action rapide." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "Ajouter à la barre d'action rapide" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 #, js-format msgid "%s Added to Quick Action Bar." msgstr "%s ajouté à la barre d'action rapide." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "Déjà présent dans la barre d'action rapide" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "Aucun résultat trouvé." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "l'objet de données est vide" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "Ajouter des blocs à la barre d'action rapide" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "Réorganiser le bloc dans la barre d'action rapide" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -8849,30 +8859,37 @@ msgid "Install & Activate" msgstr "Installer et activer" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Compliance Settings" msgstr "Paramètres de conformité" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "Activer la conformité RGPD" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "Ne jamais conserver les données d'entrée après la soumission du formulaire" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "Lorsqu'il est activé, ce formulaire ne stockera jamais les entrées." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "Supprimer automatiquement les entrées" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "Lorsque cette option est activée, ce formulaire supprimera automatiquement les entrées après une certaine période de temps." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "Les entrées plus anciennes que le nombre de jours défini seront supprimées automatiquement." @@ -8885,34 +8902,42 @@ msgid "The following CSS styles added below will only apply to this form contain msgstr "Les styles CSS suivants ajoutés ci-dessous ne s'appliqueront qu'à ce conteneur de formulaire." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "Visuel" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "HTML" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "Toutes les données" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "Ajouter un shortcode" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "Balises de saisie de formulaire" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Comma separated values are also accepted." msgstr "Les valeurs séparées par des virgules sont également acceptées." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "Notification par e-mail" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Name" msgstr "Nom" @@ -8922,18 +8947,22 @@ msgid "Send Email To" msgstr "Envoyer un e-mail à" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Subject" msgstr "Sujet" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "CC" msgstr "CC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "BCC" msgstr "Cci" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reply To" msgstr "Répondre à" @@ -8942,54 +8971,57 @@ msgid "Add Notification" msgstr "Ajouter une notification" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." -msgstr "Notification par e-mail désactivée avec succès." - -#: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." -msgstr "Notification par e-mail activée avec succès." - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "Ajouter une clé" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "Ajouter de la valeur" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "Ajouter" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "Message de confirmation" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "Après la soumission du formulaire" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "Masquer le formulaire" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "Réinitialiser le formulaire" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "URL personnalisée" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "Ajouter des paramètres de requête" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "Sélectionnez si vous souhaitez ajouter des paires clé-valeur pour les champs de formulaire à inclure dans les paramètres de requête" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "Paramètres de requête" @@ -9002,14 +9034,17 @@ msgid "Suggestion: URL should use HTTPS" msgstr "Suggestion : l'URL devrait utiliser HTTPS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Success Message" msgstr "Message de réussite" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect" msgstr "Rediriger" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect to" msgstr "Rediriger vers" @@ -9017,14 +9052,17 @@ msgstr "Rediriger vers" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "Page" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form Confirmation" msgstr "Confirmation du formulaire" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "Type de confirmation" @@ -9166,7 +9204,7 @@ msgstr "Centre" msgid "Right" msgstr "D'accord" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1178 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" @@ -9176,7 +9214,7 @@ msgstr "Google reCAPTCHA" msgid "CloudFlare Turnstile" msgstr "Tourniquet CloudFlare" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1182 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" @@ -9235,7 +9273,8 @@ msgstr "Saut de page" msgid "Previous" msgstr "Précédent" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 #: assets/build/formEditor.js:172 msgid "Thank you" msgstr "Merci" @@ -9450,7 +9489,7 @@ msgstr "Clé du site" msgid "Secret Key" msgstr "Clé secrète" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1186 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "Tourniquet Cloudflare" @@ -9459,10 +9498,6 @@ msgstr "Tourniquet Cloudflare" msgid "Appearance Mode" msgstr "Mode d'apparence" -#: assets/build/settings.js:172 -msgid "This field cannot be left blank." -msgstr "Ce champ ne peut pas être laissé vide." - #: assets/build/templatePicker.js:172 msgid "Connect Now" msgstr "Connectez-vous maintenant" @@ -10403,7 +10438,7 @@ msgid "icon" msgstr "icône" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 +#: admin/admin.php:1522 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "SureForms %1$s nécessite au minimum %2$s %3$s pour fonctionner correctement. Veuillez mettre à jour vers la dernière version depuis %4$scet endroit%5$s." @@ -10425,7 +10460,7 @@ msgstr "Journalisation IP" msgid "Honeypot" msgstr "Pot de miel" -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "Évaluez SureForms" @@ -10481,18 +10516,18 @@ msgstr "Déverrouiller Ajouter une note" msgid "With the SureForms Starter plan, enhance your submitted form entries by adding personalized notes for better clarity and tracking." msgstr "Avec le plan SureForms Starter, améliorez vos entrées de formulaire soumises en ajoutant des notes personnalisées pour une meilleure clarté et un suivi amélioré." -#: inc/form-submit.php:823 +#: inc/form-submit.php:852 msgid "Email notification passed to the sending server" msgstr "Notification par e-mail transmise au serveur d'envoi" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 +#: inc/form-submit.php:925 #, php-format msgid "Email notification recipient: %s" msgstr "Destinataire de la notification par e-mail : %s" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 +#: inc/form-submit.php:942 #, php-format msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "Le serveur de messagerie n'a pas pu envoyer la notification par e-mail. Destinataire : %1$s. Raison : %2$s" @@ -10535,7 +10570,7 @@ msgstr "Déverrouiller les formulaires conversationnels" msgid "With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience." msgstr "Avec le plan SureForms Pro, vous pouvez transformer vos formulaires en mises en page conversationnelles engageantes pour une expérience utilisateur fluide." -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "Obtenez SureForms Pro" @@ -10631,7 +10666,7 @@ msgstr "PX" msgid "Button" msgstr "Bouton" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" @@ -10663,46 +10698,56 @@ msgid "SUREFORMS PREMIUM FIELDS" msgstr "CHAMPS PREMIUM SUREFORMS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%1$s). Cela peut entraîner le blocage ou le marquage de vos e-mails de notification comme spam. Alternativement, essayez d'utiliser une adresse De qui correspond au nom de domaine de votre site web (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "L'adresse e-mail 'De' actuelle ne correspond pas au nom de domaine de votre site web (%s). Cela peut entraîner le blocage de vos e-mails de notification ou leur classement en tant que spam." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "We strongly recommend that you install the free " msgstr "Nous vous recommandons vivement d'installer le gratuit" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "plugin ! L'assistant de configuration facilite la correction de vos e-mails." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "Alternativement, essayez d'utiliser une adresse d'expéditeur qui correspond au domaine de votre site web (admin@%s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "Veuillez entrer une adresse e-mail valide. Vos notifications ne seront pas envoyées si le champ n'est pas correctement rempli." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Name" msgstr "De la part de Nom" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Email" msgstr "De l'email" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "L'adresse e-mail actuelle de l'expéditeur peut ne pas correspondre au nom de domaine de votre site web (%1$s). Cela peut entraîner le blocage ou le marquage comme spam de vos e-mails de notification. Alternativement, essayez d'utiliser une adresse de l'expéditeur qui correspond au nom de domaine de votre site web (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "L'adresse e-mail actuelle 'De' peut ne pas correspondre au nom de domaine de votre site web (%s). Cela peut entraîner le blocage de vos e-mails de notification ou leur marquage comme spam." @@ -10736,24 +10781,24 @@ msgstr "Sélectionner le dégradé" msgid "reCAPTCHA" msgstr "reCAPTCHA" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1122 msgid "Captcha validation failed. No error code provided." msgstr "La validation du captcha a échoué. Aucun code d'erreur fourni." -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1123 msgid "Captcha validation failed." msgstr "La validation du captcha a échoué." -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1190 msgid "Unknown Captcha" msgstr "Captcha inconnu" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1191 msgid "Invalid captcha type." msgstr "Type de captcha invalide." #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 +#: inc/form-submit.php:1204 #, php-format msgid "%s verification failed. Please contact your site administrator." msgstr "La vérification de %s a échoué. Veuillez contacter votre administrateur de site." @@ -10776,11 +10821,11 @@ msgstr "La vérification de la clé de site HCaptcha a échoué. Veuillez contac msgid "%s sitekey is missing. Please contact your site administrator." msgstr "La clé de site %s est manquante. Veuillez contacter votre administrateur de site." -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "SureMail" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "Modèles de démarrage" @@ -10821,6 +10866,7 @@ msgstr "Date invalide" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10833,6 +10879,7 @@ msgstr "Prêt à aller au-delà du plan gratuit ?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10845,6 +10892,7 @@ msgstr "Mettez à niveau maintenant" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10857,6 +10905,7 @@ msgstr "et débloquez toute la puissance de SureForms !" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10947,10 +10996,12 @@ msgid "Free" msgstr "Gratuit" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "Les entrées plus anciennes que les jours sélectionnés seront supprimées." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "Période des entrées" @@ -10959,6 +11010,7 @@ msgid "Custom CSS Panel" msgstr "Panneau CSS personnalisé" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "Les notifications ne peuvent utiliser qu'une seule adresse e-mail d'expéditeur, veuillez donc entrer une seule adresse." @@ -10986,14 +11038,17 @@ msgid "Delete" msgstr "Supprimer" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "Sélectionnez la page à rediriger" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "Rechercher une page" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "Sélectionnez une page" @@ -11119,6 +11174,7 @@ msgstr "Pour activer hCAPTCHA, veuillez ajouter votre clé de site et votre clé msgid "To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form." msgstr "Pour activer Cloudflare Turnstile, veuillez ajouter votre clé de site et votre clé secrète. Configurez ces paramètres dans le formulaire individuel." +#: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Save" msgstr "Sauvegarder" @@ -11139,8 +11195,8 @@ msgstr "Décrivez le formulaire que vous souhaitez créer" msgid "We are building your form…" msgstr "Nous construisons votre formulaire…" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "SMTP" @@ -11270,28 +11326,28 @@ msgstr "Activer la notification administrateur" msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "Les notifications administratives vous informent des nouvelles entrées de formulaire depuis votre dernière visite." -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "Utilisateur non autorisé." #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 +#: admin/admin.php:1774 #, php-format msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "%1$sCommencez par %2$scréer votre premier formulaire%3$s.%4$s%5$sDécouvrez la puissance de notre créateur de formulaires intuitif alimenté par l'IA%6$s" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "SureForms vous attend !" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "Construire mon premier formulaire" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "Rejeter" @@ -11311,51 +11367,51 @@ msgstr "Connexion" msgid "Register" msgstr "Inscrire" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "Entrées récentes" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "( 7 derniers jours )" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "Utilisez la logique conditionnelle pour montrer uniquement ce qui compte" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "Divisez votre formulaire en étapes pour le rendre facile." -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "Permettez aux gens de télécharger des fichiers directement sur votre formulaire" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "Transformez les réponses en PDF téléchargeables automatiquement" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "Permettez aux utilisateurs de signer avec un simple champ de signature" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "Connectez votre formulaire à d'autres outils en utilisant des webhooks" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "Utilisez des formulaires conversationnels pour une expérience de type chat" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "Permettez aux utilisateurs de s'inscrire ou de se connecter via votre formulaire" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "Créez des formulaires qui génèrent des comptes utilisateurs WordPress" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "Ajoutez des calculs pour totaliser automatiquement les scores ou les prix" @@ -11585,21 +11641,21 @@ msgstr "Touches finales qui font la différence :" msgid "Build Your First Form" msgstr "Créez votre premier formulaire" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "Action ou nom de nonce invalide." -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "Jeton de sécurité invalide." -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "Type de demande invalide." -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "Vous n'avez pas la permission d'effectuer cette action." @@ -11677,10 +11733,12 @@ msgid "Form Restriction" msgstr "Restriction de formulaire" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "Nombre maximum d'entrées" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "Entrées maximales" @@ -11698,6 +11756,7 @@ msgid "Click here" msgstr "Cliquez ici" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "Description de la réponse après le nombre maximum d'entrées" @@ -11711,7 +11770,7 @@ msgstr "Salut," msgid "Email Summary of your last week - %1$s to %2$s" msgstr "Résumé des e-mails de votre dernière semaine - %1$s à %2$s" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "Modules Ultimes pour Elementor" @@ -11773,7 +11832,7 @@ msgstr "Explorez SureDash" msgid "Something went wrong. We have logged the error for further investigation" msgstr "Un problème est survenu. Nous avons enregistré l'erreur pour une enquête plus approfondie." -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "Le champ n'est pas valide." @@ -11837,16 +11896,18 @@ msgid "SureForms Video Thumbnail" msgstr "Miniature vidéo SureForms" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Expected format for emails - email@sureforms.com or John Doe " msgstr "Format attendu pour les e-mails - email@sureforms.com ou John Doe " -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -12010,50 +12071,50 @@ msgstr "Le mode test est activé :" msgid "Click here to enable live mode and accept payment" msgstr "Cliquez ici pour activer le mode en direct et accepter le paiement" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "Améliorez instantanément la délivrabilité de vos e-mails !" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "Accédez à un service de livraison d'e-mails puissant et facile à utiliser qui garantit que vos e-mails arrivent dans les boîtes de réception, et non dans les dossiers de spam. Automatisez vos flux de travail d'e-mails WordPress en toute confiance avec SureMail." -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "Automatisez vos flux de travail WordPress sans effort." -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "Connectez vos plugins WordPress et vos applications préférées, automatisez les tâches et synchronisez les données sans effort grâce au créateur de flux de travail visuel et épuré d'OttoKit — aucun codage ou configuration complexe requis." -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "Lancez de magnifiques sites web en quelques minutes !" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "Choisissez parmi des modèles conçus professionnellement, importez en un clic et personnalisez facilement pour correspondre à votre marque." -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "Boostez Elementor pour créer des sites web époustouflants plus rapidement !" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "Améliorez Elementor avec des widgets puissants et des modèles. Créez des sites web époustouflants et performants plus rapidement grâce à des éléments de design créatifs et une personnalisation fluide." -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "" "The term \"SureRank\" appears to be a proper noun or brand name, which typically should not be translated. Therefore, it remains the same in French. \n" "\n" "SureRank" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "Élevez votre SEO et grimpez dans les classements de recherche sans effort !" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "Boostez la visibilité de votre site web avec une automatisation SEO intelligente. Optimisez le contenu, suivez la performance des mots-clés et obtenez des insights exploitables, le tout dans WordPress." @@ -12178,49 +12239,49 @@ msgstr "%1$d paiement(s) supprimé(s) avec succès. %2$d échoué(s)." msgid "Failed to delete payments. Please try again." msgstr "Échec de la suppression des paiements. Veuillez réessayer." -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "Formulaire inconnu" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "N/A" #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "Subscription" msgstr "Abonnement" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "Renouvellement" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "Une fois" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "Inconnu" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -12236,7 +12297,7 @@ msgstr "Un e-mail client valide est requis pour les paiements." #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -12315,7 +12376,7 @@ msgstr "Erreur inattendue : %s" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "ID d'abonnement introuvable." @@ -12378,9 +12439,9 @@ msgstr "Vérification de l'abonnement" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 +#: inc/payments/stripe/stripe-webhook.php:1120 #, php-format msgid "Subscription ID: %s" msgstr "ID d'abonnement : %s" @@ -12395,13 +12456,13 @@ msgstr "ID d'abonnement : %s" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 #, php-format msgid "Payment Gateway: %s" msgstr "Passerelle de paiement : %s" @@ -12414,7 +12475,7 @@ msgstr "ID d'intention de paiement : %s" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 +#: inc/payments/stripe/stripe-webhook.php:1050 #, php-format msgid "Charge ID: %s" msgstr "ID de charge : %s" @@ -12424,14 +12485,14 @@ msgstr "ID de charge : %s" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 +#: inc/payments/stripe/admin-stripe-handler.php:516 #, php-format msgid "Subscription Status: %s" msgstr "Statut de l'abonnement : %s" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 +#: inc/payments/stripe/stripe-webhook.php:1124 #, php-format msgid "Customer ID: %s" msgstr "ID client : %s" @@ -12440,8 +12501,8 @@ msgstr "ID client : %s" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 #, php-format msgid "Amount: %1$s %2$s" msgstr "Montant : %1$s %2$s" @@ -12476,7 +12537,7 @@ msgstr "Vérification de paiement" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 +#: inc/payments/stripe/stripe-webhook.php:1112 #, php-format msgid "Transaction ID: %s" msgstr "ID de transaction : %s" @@ -12485,7 +12546,7 @@ msgstr "ID de transaction : %s" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 #, php-format msgid "Status: %s" msgstr "Statut : %s" @@ -12853,23 +12914,23 @@ msgid "Unknown error" msgstr "Erreur inconnue" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "ID de paiement manquant." -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "Vous n'êtes pas autorisé à effectuer cette action." #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "Paiement non trouvé dans la base de données." #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "Ce n'est pas un paiement d'abonnement." @@ -12879,7 +12940,7 @@ msgid "Subscription cancellation failed." msgstr "L'annulation de l'abonnement a échoué." #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "Échec de la mise à jour du statut de l'abonnement dans la base de données." @@ -12888,58 +12949,58 @@ msgstr "Échec de la mise à jour du statut de l'abonnement dans la base de donn msgid "Invalid payment data." msgstr "Données de paiement invalides." -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "Seuls les paiements réussis ou partiellement remboursés peuvent être remboursés." -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "Incohérence de l'ID de transaction." -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "Format de l'ID de transaction invalide pour le remboursement." -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "Échec du traitement du remboursement via l'API Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "Échec de la mise à jour du dossier de paiement après le remboursement." #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "Remboursement effectué avec succès." #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "Échec du traitement du remboursement. Veuillez réessayer." -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "La suspension de l'abonnement a échoué." -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "Plein" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "Partiel" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 #, php-format msgid "Refund ID: %s" msgstr "ID de remboursement : %s" @@ -12947,9 +13008,9 @@ msgstr "ID de remboursement : %s" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 #, php-format msgid "Refund Amount: %1$s %2$s" msgstr "Montant du remboursement : %1$s %2$s" @@ -12957,9 +13018,9 @@ msgstr "Montant du remboursement : %1$s %2$s" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 #, php-format msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "Montant total remboursé : %1$s %2$s de %3$s %4$s" @@ -12967,9 +13028,9 @@ msgstr "Montant total remboursé : %1$s %2$s de %3$s %4$s" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 #, php-format msgid "Refund Status: %s" msgstr "Statut du remboursement : %s" @@ -12978,10 +13039,10 @@ msgstr "Statut du remboursement : %s" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 #, php-format msgid "Payment Status: %s" msgstr "Statut du paiement : %s" @@ -12989,132 +13050,132 @@ msgstr "Statut du paiement : %s" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 #, php-format msgid "Refunded by: %s" msgstr "Remboursé par : %s" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 #, php-format msgid "Refund Notes: %s" msgstr "Notes de remboursement : %s" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 #, php-format msgid "%s Payment Refund" msgstr "Remboursement de paiement %s" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 #, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "Les webhooks maintiennent SureForms synchronisé avec Stripe en mettant automatiquement à jour les données de paiement et d'abonnement. Veuillez %1$s Webhook." -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "configurer" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "Paramètres de remboursement invalides fournis." -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "Ce paiement n'est pas lié à un abonnement." -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "Seuls les paiements d'abonnement actifs, réussis ou partiellement remboursés peuvent être remboursés." -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "La création du remboursement Stripe a échoué. Veuillez vérifier votre tableau de bord Stripe pour plus de détails." -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "Le remboursement a été traité par Stripe mais n'a pas réussi à mettre à jour les enregistrements locaux. Veuillez vérifier vos enregistrements de paiement manuellement." -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "Remboursement de l'abonnement effectué avec succès." #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 +#: inc/payments/stripe/admin-stripe-handler.php:977 #, php-format msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "Le montant du remboursement dépasse le montant disponible. Montant maximum remboursable : %1$s %2$s" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "Le montant du remboursement doit être supérieur à zéro." -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "Le montant du remboursement doit être d'au moins 0,50 $." -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "Impossible de déterminer la méthode de remboursement appropriée pour ce paiement d'abonnement." #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 +#: inc/payments/stripe/admin-stripe-handler.php:1256 #, php-format msgid "%s Subscription Payment Refund" msgstr "Remboursement du paiement de l'abonnement %s" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "Ce paiement a déjà été entièrement remboursé." -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "Le paiement n'a pas pu être trouvé dans Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "Le montant du remboursement dépasse le montant remboursable disponible." -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "Le paiement de cet abonnement n'a pas pu être trouvé." -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "L'abonnement n'a pas pu être trouvé dans Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "Cet abonnement n'a aucun paiement réussi à rembourser." -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "Le mode de paiement pour cet abonnement est invalide." -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "Permissions insuffisantes pour traiter les remboursements." -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "Trop de demandes. Veuillez réessayer dans un instant." -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "Erreur réseau. Veuillez vérifier votre connexion et réessayer." #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 +#: inc/payments/stripe/admin-stripe-handler.php:1308 #, php-format msgid "Subscription refund failed: %s" msgstr "Échec du remboursement de l'abonnement : %s" @@ -13264,7 +13325,7 @@ msgstr "Annulé à : %s" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 +#: inc/payments/stripe/stripe-webhook.php:892 #, php-format msgid "Cancellation Reason: %s" msgstr "Raison de l'annulation : %s" @@ -13283,24 +13344,24 @@ msgstr "Abonnement annulé" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "Webhook" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "Remboursement annulé" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:882 #, php-format msgid "Canceled Refund Amount: %1$s %2$s" msgstr "Montant du remboursement annulé : %1$s %2$s" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 +#: inc/payments/stripe/stripe-webhook.php:885 #, php-format msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "Remboursement restant : %1$s %2$s de %3$s %4$s" @@ -13309,52 +13370,52 @@ msgstr "Remboursement restant : %1$s %2$s de %3$s %4$s" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:896 #, php-format msgid "Canceled by: %s" msgstr "Annulé par : %s" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "Le paiement initial de l'abonnement a réussi" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 #, php-format msgid "Invoice ID: %s" msgstr "ID de facture : %s" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "Statut du paiement : Réussi" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "Statut de l'abonnement : Actif" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "Paiement des frais d'abonnement" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "Réussi" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 +#: inc/payments/stripe/stripe-webhook.php:1126 #, php-format msgid "Customer Email: %s" msgstr "Email du client : %s" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 +#: inc/payments/stripe/stripe-webhook.php:1128 #, php-format msgid "Customer Name: %s" msgstr "Nom du client : %s" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "Créé via le cycle de facturation par abonnement" @@ -13362,19 +13423,20 @@ msgstr "Créé via le cycle de facturation par abonnement" msgid "Edit this form" msgstr "Modifier ce formulaire" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." msgstr "Votre formulaire a été soumis avec succès. Nous examinerons vos informations et vous répondrons bientôt." #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "L'identifiant d'entrée est requis." #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "Entrée non trouvée." @@ -13574,6 +13636,7 @@ msgstr "Sélectionnez le champ de courriel qui contient l'email du client" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13586,6 +13649,7 @@ msgstr "Base de connaissances" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13667,6 +13731,7 @@ msgid "Go to Forms" msgstr "Aller aux formulaires" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13674,6 +13739,7 @@ msgid "delete" msgstr "supprimer" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13682,6 +13748,7 @@ msgid "Please type \"%s\" in the input box" msgstr "Veuillez taper \"%s\" dans la boîte de saisie" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13690,6 +13757,7 @@ msgid "To confirm, type \"%s\" in the box below:" msgstr "Pour confirmer, tapez \"%s\" dans la case ci-dessous :" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14116,7 +14184,7 @@ msgstr "Utilisez l'IA pour générer des formulaires instantanément à partir d msgid "Build engaging conversational, calculation, and multi-step forms." msgstr "Créez des formulaires engageants de conversation, de calcul et à étapes multiples." -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "Créer un formulaire" @@ -14900,22 +14968,22 @@ msgstr "Remarque : L'abonnement a été définitivement annulé. Le client ne se #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "En pause" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 +#: inc/payments/stripe/admin-stripe-handler.php:521 #, php-format msgid "Paused by: %s" msgstr "Mis en pause par : %s" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "Remarque : La facturation de l'abonnement a été suspendue. Aucun frais ne sera appliqué jusqu'à la reprise de l'abonnement." -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "Abonnement en pause" @@ -14924,6 +14992,7 @@ msgid "This entry will be moved to trash and can be restored later." msgstr "Cette entrée sera déplacée dans la corbeille et pourra être restaurée plus tard." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "Définissez le nombre total de soumissions autorisées pour ce formulaire." @@ -15051,7 +15120,7 @@ msgstr "La valeur du champ de montant variable est requise." msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "Montant du paiement inférieur au minimum. Minimum : %1$s, reçu %2$s." -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "(Copie)" @@ -15112,12 +15181,14 @@ msgstr "Cela créera une copie de \"%s\" avec tous ses paramètres." msgid "Pay with credit or debit card" msgstr "Payer par carte de crédit ou de débit" +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 msgid "This form is not yet available. Please check back after the scheduled start time." msgstr "Ce formulaire n'est pas encore disponible. Veuillez revenir après l'heure de début prévue." #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "Ce formulaire n'accepte plus les soumissions. La période de soumission est terminée." @@ -15136,7 +15207,7 @@ msgstr "Le traitement des remboursements n'est pas pris en charge pour la passer msgid "Number field configuration not found." msgstr "Configuration du champ numérique introuvable." -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "Paramètres de remboursement invalides." @@ -15251,24 +15322,24 @@ msgid "Stripe Settings" msgstr "Paramètres Stripe" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 +#: admin/admin.php:1439 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "SureForms %1$s nécessite au minimum %2$s %3$s pour fonctionner correctement. Veuillez mettre à jour vers la dernière version." -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "Mettez à jour maintenant" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "SureContact" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "Transformez les e-mails en revenus avec un CRM conçu pour votre site web !" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "Envoyez des newsletters, lancez des campagnes, configurez des automatisations, gérez les contacts et voyez exactement combien de revenus vos e-mails génèrent, le tout en un seul endroit." @@ -15304,13 +15375,14 @@ msgstr "Position du signe monétaire" msgid "Select the position of the currency symbol relative to the amount." msgstr "Sélectionnez la position du symbole monétaire par rapport au montant." -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -15318,40 +15390,40 @@ msgstr "Sélectionnez la position du symbole monétaire par rapport au montant." msgid "Learn" msgstr "Apprendre" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "Incroyable ! SureForms alimente vos formulaires et soumissions - continuons à grandir ensemble !" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "Si SureForms vous a été utile, pourriez-vous prendre un moment pour laisser un avis 5 étoiles sur WordPress.org ?" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "Peut-être plus tard" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "Je l'ai déjà fait" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "SureForms est prêt à dynamiser vos formulaires — explorez ce qui est possible !" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "Gérez vos formulaires, suivez les soumissions et découvrez des fonctionnalités telles que le constructeur de formulaires IA, les intégrations de paiement et bien plus encore depuis le tableau de bord SureForms." -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "Aller au tableau de bord" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "Je sais déjà" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "Paramètres invalides." @@ -15513,7 +15585,7 @@ msgstr "Au moins un champ de formulaire est requis." msgid "Failed to generate form fields from the provided data." msgstr "Échec de la génération des champs de formulaire à partir des données fournies." -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "Échec de la création du formulaire." @@ -15733,15 +15805,16 @@ msgstr "Champ de texte" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "Ce formulaire n'est pas encore disponible. Revenez après l'heure de début prévue." +#: inc/admin/html-form-detector.php:268 #: inc/form-submit.php:99 #: inc/form-submit.php:400 #: inc/form-submit.php:445 -#: inc/form-submit.php:968 +#: inc/form-submit.php:997 #: inc/payments/front-end.php:78 #: inc/payments/front-end.php:263 #: inc/rest-api.php:98 @@ -15755,9 +15828,10 @@ msgstr "Ce formulaire n'est pas encore disponible. Revenez après l'heure de dé #: inc/rest-api.php:667 #: inc/rest-api.php:716 #: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 msgid "Security verification failed. Please refresh the page and try again." msgstr "La vérification de sécurité a échoué. Veuillez actualiser la page et réessayer." @@ -15790,19 +15864,19 @@ msgstr "Veuillez vérifier le formulaire pour les erreurs." msgid "Your submission was flagged as spam. Please try again." msgstr "Votre soumission a été signalée comme spam. Veuillez réessayer." -#: inc/form-submit.php:651 +#: inc/form-submit.php:680 msgid "Unable to submit form. Please try again." msgstr "Impossible de soumettre le formulaire. Veuillez réessayer." -#: inc/form-submit.php:903 +#: inc/form-submit.php:932 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "Aucun plugin SMTP détecté. Veuillez configurer un plugin SMTP pour activer l'envoi d'e-mails." -#: inc/form-submit.php:904 +#: inc/form-submit.php:933 msgid "Email sending failed for an unknown reason." msgstr "L'envoi de l'email a échoué pour une raison inconnue." -#: inc/form-submit.php:943 +#: inc/form-submit.php:972 msgid "No emails were sent." msgstr "Aucun e-mail n'a été envoyé." @@ -15987,7 +16061,7 @@ msgstr "Impossible de créer le paiement. Veuillez contacter le support." msgid "Subscription canceled successfully!" msgstr "Abonnement annulé avec succès !" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "Abonnement mis en pause avec succès !" @@ -16019,8 +16093,8 @@ msgstr "Impossible de supprimer le webhook." msgid "Unable to connect to Stripe." msgstr "Impossible de se connecter à Stripe." -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "Ce formulaire est fermé. La période de soumission est terminée." @@ -16059,28 +16133,28 @@ msgstr "Action invalide. Utilisez \"lu\" ou \"non lu\"." msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "Action invalide. Utilisez \"trash\" ou \"restore\"." -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "Sélectionnez au moins un formulaire et spécifiez une action." -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "Formulaire introuvable ou type de formulaire non valide." -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "Ce formulaire est déjà dans la corbeille." -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "Ce formulaire n'est pas dans la corbeille." -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "Action invalide." #. translators: %s: action name -#: inc/rest-api.php:1100 +#: inc/rest-api.php:1124 #, php-format msgid "Failed to %s this form. Please try again." msgstr "Échec de %s ce formulaire. Veuillez réessayer." @@ -16223,10 +16297,6 @@ msgstr "Informations d'entrée" msgid "Resend Email Notification" msgstr "Renvoyer la notification par e-mail" -#: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." -msgstr "Lorsqu'elle est activée, ce formulaire ne stockera pas l'IP de l'utilisateur, le nom du navigateur ou le nom de l'appareil dans les entrées." - #: assets/build/formEditor.js:172 msgid "Select a spam protection service. Configure API keys in Global Settings before enabling." msgstr "Sélectionnez un service de protection contre le spam. Configurez les clés API dans les Paramètres Globaux avant de l'activer." @@ -16694,26 +16764,27 @@ msgstr "Secret du webhook non configuré." msgid "Invalid webhook signature." msgstr "Signature de webhook invalide." -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "Quiz" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "Participations au quiz" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "Nouveau" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1006 msgid "Invalid form." msgstr "Formulaire invalide." -#: inc/form-submit.php:982 +#: inc/form-submit.php:1011 msgid "Too many requests. Please try again shortly." msgstr "Trop de demandes. Veuillez réessayer sous peu." @@ -16925,10 +16996,6 @@ msgstr "Politique de confidentialité" msgid "Finish" msgstr "Terminer" -#: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." -msgstr "Choisissez une méthode de protection contre le spam pour ce formulaire afin de prévenir les soumissions indésirables." - #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Send entries to 100+ popular apps." @@ -17008,6 +17075,7 @@ msgstr "Créez des quiz engageants avec SureForms" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "Transformez vos formulaires en quiz puissants. Passez à SureForms pour débloquer les fonctionnalités de quiz :" +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/surveyEmptyState.js:172 msgid "Upgrade to SureForms" @@ -17225,39 +17293,45 @@ msgstr "Parfait pour l'éducation, la formation et les quiz amusants" msgid "Select this to create a quiz with scored questions and graded results." msgstr "Sélectionnez ceci pour créer un quiz avec des questions notées et des résultats évalués." -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "Rapports d'enquête" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "Titre 1" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "Titre 2" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "Titre 3" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "Titre 4" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "Titre 5" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "Titre 6" @@ -17274,7 +17348,7 @@ msgid "Cancellation not supported for this gateway." msgstr "Annulation non prise en charge pour cette passerelle." #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "Abonnement annulé avec succès." @@ -17491,10 +17565,6 @@ msgstr "Configurez la clé API Google Maps pour la saisie semi-automatique des a msgid "Help shape the future of SureForms" msgstr "Aidez à façonner l'avenir de SureForms" -#: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " -msgstr "Partagez comment vous utilisez le plugin afin que nous puissions développer des fonctionnalités qui comptent, résoudre les problèmes plus rapidement et prendre des décisions plus éclairées." - #: assets/build/settings.js:172 msgid "Enable Google Address Autocomplete" msgstr "Activer la saisie semi-automatique d'adresse Google" @@ -17579,16 +17649,16 @@ msgstr "Złoty polonais" msgid "Dynamic Default Value" msgstr "Valeur par défaut dynamique" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "Hé ! On dirait que vous créez un formulaire. Créez un formulaire prêt à l'emploi en moins de 30 secondes avec SureForms AI, sans configuration supplémentaire requise." -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "Publication invalide." -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "Vous ne pouvez pas modifier ce message." @@ -17627,7 +17697,7 @@ msgid "Error creating SureForms Form." msgstr "Erreur lors de la création du formulaire SureForms." #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 #, php-format msgid "Please enter at least %s characters." @@ -17785,22 +17855,374 @@ msgstr "La réponse de l'IA était vide. Veuillez affiner votre invite et réess msgid "Unable to build form fields from the AI response." msgstr "Impossible de créer les champs de formulaire à partir de la réponse de l'IA." -#: inc/post-types.php:205 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "Entrées partielles" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." +msgstr "Ce formulaire est maintenant fermé car nous avons reçu toutes les inscriptions." + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." +msgstr "Onglet de paramètres invalide." + +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "Merci de nous avoir contactés ! Nous vous contacterons sous peu." + +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "Utilisez l'action de restauration pour récupérer un formulaire mis à la corbeille avant de le passer en brouillon." + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "Ce formulaire est déjà un brouillon." + +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "Vous n'avez pas la permission de modifier ce formulaire." + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "ID de formulaire invalide." + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "Paramètres du formulaire enregistrés." + +#: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "Le plafond d'entrée repose sur les entrées stockées pour compter les soumissions. Tant que les Paramètres de conformité ont l'option \"Ne jamais stocker les données d'entrée après la soumission du formulaire\" activée, cette limite ne sera pas appliquée. Désactivez cette option ou supprimez la limite d'entrée pour utiliser cette fonctionnalité." + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "Espace réservé pour les entrées partielles" + +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "Texte de remplacement affiché à l'intérieur du champ de saisie/zone de texte vide ou comme première option vide dans un menu déroulant." + +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "Tableau de champs produit par l'analyseur côté éditeur." + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "HTML brut du source. Nécessaire lorsque la confiance du parseur est faible afin que nous puissions transmettre le balisage au middleware IA." + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "Descripteur de style au mieux (couleurs hexadécimales) extrait des styles en ligne sur le source." + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "Vous n'êtes pas autorisé à convertir les formulaires HTML." + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "Forme convertie" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "Le formulaire HTML est trop volumineux pour être converti. Veuillez simplifier le balisage ou construire le formulaire manuellement." + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "Aucun champ n'a pu être dérivé du formulaire fourni." + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "Le service SureForms AI n'a pas pu traiter ce formulaire. Réessayez ou construisez le formulaire manuellement." + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "Le service SureForms AI a renvoyé une réponse inutilisable. Réessayez ou construisez le formulaire manuellement." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "Utilisez une balise intelligente comme {get_input:country}. La première option dont le titre correspond à la valeur résolue sera présélectionnée." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "Utilisez une balise intelligente comme {get_input:colors} et passez des valeurs séparées par des barres verticales dans l'URL (par exemple ?colors=Red|Blue). Chaque option dont le titre correspond à une valeur sera cochée. Vous pouvez également enchaîner plusieurs balises intelligentes séparées par des barres verticales." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "Utilisez une balise intelligente comme {get_input:colors} et passez des valeurs séparées par des barres verticales dans l'URL (par exemple ?colors=Red|Blue). Chaque option dont l'étiquette correspond à une valeur sera présélectionnée. Vous pouvez également enchaîner plusieurs balises intelligentes séparées par des barres verticales." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "Utilisez une balise intelligente comme {get_input:country}. La première option dont l'étiquette correspond à la valeur résolue sera présélectionnée." + +#: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "Paramètres enregistrés, mais les attributs du message (mot de passe / titre / contenu) n'ont pas pu être mis à jour. Réessayez pour les conserver." + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "Échec de l'enregistrement des paramètres du formulaire." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "Enregistrement…" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." +msgstr "Lorsqu'il est activé, ce formulaire ne stockera pas l'IP de l'utilisateur, le nom du navigateur et le nom de l'appareil dans les entrées." + +#: assets/build/formEditor.js:172 +msgid "Failed to save. Please try again." +msgstr "Échec de l'enregistrement. Veuillez réessayer." + +#: assets/build/formEditor.js:172 +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "Les clés API reCAPTCHA pour la version sélectionnée ne sont pas configurées. Définissez-les dans les Paramètres Globaux." + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "Veuillez sélectionner une version de reCAPTCHA." + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "Les clés API hCaptcha ne sont pas configurées. Définissez-les dans les Paramètres Globaux." + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." +msgstr "Les clés API de Cloudflare Turnstile ne sont pas configurées. Définissez-les dans les Paramètres Globaux." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "Données du formulaire" + +#: assets/build/formEditor.js:172 +msgid "Some fields need attention" +msgstr "Certains champs nécessitent une attention" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Unsaved changes" +msgstr "Modifications non enregistrées" + +#: assets/build/formEditor.js:172 +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "Une adresse e-mail de destinataire et une ligne d'objet sont requises avant que cette notification puisse être enregistrée. Corrigez les champs surlignés ou annulez vos modifications pour revenir en arrière." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "Vous avez des modifications non enregistrées pour cette notification. Abandonnez-les pour revenir en arrière, ou restez pour les enregistrer." + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "Annuler et revenir" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "Rester et réparer" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" +msgstr "Continuez à éditer" + +#: assets/build/formEditor.js:172 +msgid "Please provide a recipient email address." +msgstr "Veuillez fournir une adresse e-mail du destinataire." + +#: assets/build/formEditor.js:172 +msgid "Please provide a subject line." +msgstr "Veuillez fournir une ligne d'objet." + +#: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "Veuillez fournir une URL personnalisée." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "Vous avez des modifications non enregistrées. Abandonnez-les pour continuer, ou restez pour enregistrer vos modifications." + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "Ignorer et continuer" + +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "Passer en brouillon" + +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "%d formulaire passé en brouillon." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "Passer le formulaire en brouillon ?" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "%d formulaire sera basculé en brouillon et ne sera plus accessible publiquement." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "Ce formulaire sera basculé en brouillon et ne sera plus accessible au public." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "SureForms n'a pas pu authentifier cette demande. Veuillez recharger l'éditeur et réessayer." + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "%s — Forme convertie" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "Formulaire converti en SureForms à l'aide de l'IA. Vérifiez le nouveau formulaire pour d'éventuels ajustements." + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "Formulaire converti en SureForms." + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "Vous n'avez pas la permission de convertir ce formulaire." + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "Ce formulaire est trop volumineux pour être converti. Essayez de simplifier le balisage ou de créer le formulaire manuellement." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "SureForms n'a pas pu extraire de champs de ce formulaire." + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "Le service SureForms AI n'a pas pu traiter ce formulaire. Veuillez réessayer ou créer le formulaire manuellement." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "SureForms a reçu une réponse inattendue. Veuillez réessayer." + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "Impossible de convertir ce formulaire en SureForms. Veuillez réessayer." + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "Conversion…" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "Convertir en SureForms" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "Capturez les données de formulaire en cours dès que les visiteurs cessent de taper — aucune soumission requise" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "Récupérez les soumissions abandonnées et faites un suivi avec les prospects que vous perdriez autrement" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "Permettez aux visiteurs de reprendre là où ils se sont arrêtés avec des liens de reprise sécurisés et partageables" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "Arrêtez de perdre des prospects à cause des formulaires abandonnés" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "Voyez ce que les visiteurs ont tapé avant de partir. Passez à SureForms Premium pour débloquer les Entrées Partielles :" + +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "Paramètres par défaut globaux" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "Restrictions de formulaire" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "Configurer les paramètres par défaut qui s'appliquent aux formulaires nouvellement créés." + +#: assets/build/settings.js:172 +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " +msgstr "Collectez des informations non sensibles de votre site web, telles que la version PHP et les fonctionnalités utilisées, pour nous aider à corriger les bugs plus rapidement, à prendre des décisions plus éclairées et à développer des fonctionnalités qui comptent réellement pour vous. " + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." +msgstr "Échec du chargement des pages. Veuillez actualiser et réessayer." + +#: assets/build/settings.js:172 +msgid "Failed to load settings. Please refresh and try again." +msgstr "Échec du chargement des paramètres. Veuillez actualiser et réessayer." + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "Les champs de validation de formulaire ne peuvent pas être laissés vides." + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "L'adresse e-mail du destinataire est requise lorsque les résumés par e-mail sont activés." + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "Veuillez entrer une adresse e-mail de destinataire valide." + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "Paramètres enregistrés." + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "Échec de l'enregistrement des paramètres." + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "Certains paramètres n'ont pas pu être enregistrés. Veuillez réessayer." + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." +msgstr "Certains champs contiennent des modifications non enregistrées. Abandonnez-les pour continuer, ou restez pour enregistrer vos modifications." + +#: assets/build/settings.js:172 +msgid "Discard & switch" +msgstr "Annuler et changer" + +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "Formulaires" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "Formulaire" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "Formulaires" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "Ajouter nouveau" @@ -18209,6 +18631,7 @@ msgstr "compte" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "Normal" diff --git a/languages/sureforms-it_IT-1cb9ecd067cd971ff5d9db0b4dae2891.json b/languages/sureforms-it_IT-1cb9ecd067cd971ff5d9db0b4dae2891.json index da99137f5..d835375b9 100644 --- a/languages/sureforms-it_IT-1cb9ecd067cd971ff5d9db0b4dae2891.json +++ b/languages/sureforms-it_IT-1cb9ecd067cd971ff5d9db0b4dae2891.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Stato"],"Form":["Modulo"],"Fields":["Campi"],"Image":["Immagine"],"Activated":["Attivato"],"Activate":["Attiva"],"Submit":["Invia"],"Global Settings":["Impostazioni globali"],"This field is required.":["Questo campo \u00e8 obbligatorio."],"Form Title":["Titolo del modulo"],"Edit":["Modifica"],"Please enter a valid URL.":["Per favore inserisci un URL valido."],"Desktop":["Desktop"],"Medium":["Medio"],"Mobile":["Cellulare"],"Repeat":["Ripeti"],"Scroll":["Scorri"],"Signature":["Firma"],"Tablet":["Tablet"],"Upload":["Carica"],"Basic":["Base"],"Form Settings":["Impostazioni del modulo"],"General":["Generale"],"Style":["Stile"],"Advanced":["Avanzato"],"No tags available":["Nessun tag disponibile"],"Device":["Dispositivo"],"Select Shortcodes":["Seleziona i codici brevi"],"Page Break Label":["Etichetta di interruzione di pagina"],"Next":["Avanti"],"Back":["Indietro"],"Reset":["Reimposta"],"Generic tags":["Tag generici"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Seleziona unit\u00e0"],"%s units":["%s unit\u00e0"],"Margin":["Margine"],"None":["Nessuno"],"Custom":["Personalizzato"],"Please add a option props to MultiButtonsControl":["Si prega di aggiungere un'opzione props a MultiButtonsControl"],"Confirm":["Conferma"],"Cancel":["Annulla"],"Processing\u2026":["Elaborazione\u2026"],"Select Video":["Seleziona video"],"Change Video":["Cambia video"],"Select Lottie Animation":["Seleziona animazione Lottie"],"Change Lottie Animation":["Cambia animazione Lottie"],"Upload SVG":["Carica SVG"],"Change SVG":["Cambia SVG"],"Select Image":["Seleziona immagine"],"Change Image":["Cambia immagine"],"Upload SVG?":["Caricare SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Caricare SVG pu\u00f2 essere potenzialmente rischioso. Sei sicuro?"],"Upload Anyway":["Carica comunque"],"Full Width":["Larghezza completa"],"Install":["Installa"],"Plugin Installation failed, Please try again later.":["Installazione del plugin fallita, per favore riprova pi\u00f9 tardi."],"Plugin activation failed, Please try again later.":["Attivazione del plugin fallita, riprova pi\u00f9 tardi."],"Integrations":["Integrazioni"],"%s Removed from Quick Action Bar.":["%s rimosso dalla barra delle azioni rapide."],"Add to Quick Action Bar":["Aggiungi alla barra delle azioni rapide"],"%s Added to Quick Action Bar.":["%s aggiunto alla barra delle azioni rapide."],"Already Present in Quick Action Bar":["Gi\u00e0 presente nella barra delle azioni rapide"],"No results found.":["Nessun risultato trovato."],"data object is empty":["l'oggetto dati \u00e8 vuoto"],"Add blocks to Quick Action Bar":["Aggiungi blocchi alla barra delle azioni rapide"],"Re-arrange block inside Quick Action Bar":["Riorganizza il blocco all'interno della Barra delle Azioni Rapide"],"Upgrade":["Aggiornamento"],"Connecting\u2026":["Connessione in corso\u2026"],"Install & Activate":["Installa e attiva"],"Compliance Settings":["Impostazioni di conformit\u00e0"],"Enable GDPR Compliance":["Abilita la conformit\u00e0 GDPR"],"Never store entry data after form submission":["Non memorizzare mai i dati di ingresso dopo l'invio del modulo"],"When enabled this form will never store Entries.":["Quando abilitato, questo modulo non memorizzer\u00e0 mai le voci."],"Automatically delete entries":["Elimina automaticamente le voci"],"When enabled this form will automatically delete entries after a certain period of time.":["Quando abilitato, questo modulo eliminer\u00e0 automaticamente le voci dopo un certo periodo di tempo."],"Entries older than the days set will be deleted automatically.":["Le voci pi\u00f9 vecchie dei giorni impostati verranno eliminate automaticamente."],"Custom CSS":["CSS personalizzato"],"The following CSS styles added below will only apply to this form container.":["I seguenti stili CSS aggiunti di seguito si applicheranno solo a questo contenitore del modulo."],"Visual":["Visivo"],"HTML":["HTML"],"All Data":["Tutti i dati"],"Add Shortcode":["Aggiungi shortcode"],"Form input tags":["Tag di input del modulo"],"Comma separated values are also accepted.":["Sono accettati anche i valori separati da virgola."],"Email Notification":["Notifica email"],"Name":["Nome"],"Send Email To":["Invia email a"],"Subject":["Oggetto"],"CC":["CC"],"BCC":["Ccn"],"Reply To":["Rispondi a"],"Add Notification":["Aggiungi notifica"],"Email Notification disabled successfully.":["Notifica email disabilitata con successo."],"Email Notification enabled successfully.":["Notifica email abilitata con successo."],"Add Key":["Aggiungi chiave"],"Add Value":["Aggiungi valore"],"Add":["Aggiungi"],"Confirmation Message":["Messaggio di conferma"],"After Form Submission":["Dopo l'invio del modulo"],"Hide Form":["Nascondi modulo"],"Reset Form":["Reimposta modulo"],"Custom URL":["URL personalizzato"],"Add Query Parameters":["Aggiungi parametri di query"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Seleziona se desideri aggiungere coppie chiave-valore per i campi del modulo da includere nei parametri di query"],"Query Parameters":["Parametri di query"],"Please select a page.":["Si prega di selezionare una pagina."],"Suggestion: URL should use HTTPS":["Suggerimento: l'URL dovrebbe utilizzare HTTPS"],"Success Message":["Messaggio di successo"],"Redirect":["Reindirizza"],"Redirect to":["Reindirizza a"],"Page":["Pagina"],"Form Confirmation":["Conferma del modulo"],"Confirmation Type":["Tipo di conferma"],"Use Labels as Placeholders":["Usa le etichette come segnaposto"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Questa impostazione posizioner\u00e0 le etichette all'interno dei campi come segnaposto (dove possibile). Questa impostazione ha effetto solo sulla pagina live, non nell'anteprima dell'editor."],"Page Break":["Interruzione di pagina"],"Show Labels":["Mostra etichette"],"First Page Label":["Etichetta della prima pagina"],"Progress Indicator":["Indicatore di progresso"],"Progress Bar":["Barra di progresso"],"Connector":["Connettore"],"Steps":["Passi"],"Next Button Text":["Testo del pulsante Avanti"],"Back Button Text":["Testo del pulsante Indietro"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Sei sicuro di voler chiudere? Le modifiche non salvate andranno perse poich\u00e9 ci sono alcuni errori di convalida."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Ci sono alcune modifiche non salvate. Si prega di salvare le modifiche per riflettere gli aggiornamenti."],"Form Behavior":["Comportamento del modulo"],"Clear":["Chiaro"],"Select Color":["Seleziona colore"],"Primary Color":["Colore primario"],"Text Color":["Colore del testo"],"Text Color on Primary":["Colore del testo sul primario"],"Field Spacing":["Spaziatura del campo"],"Small":["Piccolo"],"Large":["Grande"],"Left":["Sinistra"],"Center":["Centro"],"Right":["Destra"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisibile"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Selettore di data"],"Time Picker":["Selettore del tempo"],"Hidden":["Nascosto"],"Slider":["Cursore"],"Rating":["Valutazione"],"Upgrade to Unlock These Fields":["Aggiorna per sbloccare questi campi"],"Add Block":["Aggiungi blocco"],"Customize with SureForms":["Personalizza con SureForms"],"Page break":["Interruzione di pagina"],"Previous":["Precedente"],"Thank you":["Grazie"],"Form submitted successfully!":["Modulo inviato con successo!"],"Instant Form":["Modulo istantaneo"],"Enable Instant Form":["Abilita il modulo istantaneo"],"Enable Preview":["Abilita anteprima"],"Show Title":["Titolo dello spettacolo"],"Site Logo":["Logo del sito"],"Banner Background":["Sfondo del banner"],"Color":["Colore"],"Upload Image":["Carica immagine"],"Background Color":["Colore di sfondo"],"Use banner as page background":["Usa il banner come sfondo della pagina"],"Form Width":["Larghezza del modulo"],"URL":["URL"],"URL Slug":["Slug URL"],"The last part of the URL.":["L'ultima parte dell'URL."],"Learn more.":["Scopri di pi\u00f9."],"SureForms Description":["Descrizione di SureForms"],"Form Options":["Opzioni del modulo"],"Form Shortcode":["Codice breve del modulo"],"Paste this shortcode on the page or post to render this form.":["Incolla questo shortcode nella pagina o nel post per visualizzare questo modulo."],"Spam Protection":["Protezione antispam"],"Auto":["Auto"],"Normal":["Normale"],"%":["%"],"Top":["In alto"],"Bottom":["Fondo"],"Solid":["Solido"],"Width":["Larghezza"],"Size":["Dimensione"],"EM":["EM"],"Padding":["Riempimento"],"Color 1":["Colore 1"],"Color 2":["Colore 2"],"Type":["Tipo"],"Linear":["Lineare"],"Radial":["Radiale"],"Location 1":["Posizione 1"],"Location 2":["Posizione 2"],"Angle":["Angolo"],"Classic":["Classico"],"Gradient":["Gradiente"],"Background":["Sfondo"],"Cover":["Copertina"],"Contain":["Contenere"],"Overlay":["Sovrapposizione"],"No Repeat":["Nessuna ripetizione"],"Overlay Opacity":["Opacit\u00e0 dell'overlay"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["I nomi delle classi devono essere separati da spazi. Ogni nome di classe non deve iniziare con una cifra, un trattino o un underscore. Possono includere solo lettere (comprese le lettere Unicode), numeri, trattini e underscore."],"Conversational Layout":["Layout Conversazionale"],"Unlock Conversational Forms":["Sblocca moduli conversazionali"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Con il piano SureForms Pro, puoi trasformare i tuoi moduli in layout conversazionali coinvolgenti per un'esperienza utente senza interruzioni."],"Premium":["Premium"],"Overlay Type":["Tipo di sovrapposizione"],"Image Overlay Color":["Colore di sovrapposizione dell'immagine"],"Image Position":["Posizione dell'immagine"],"Attachment":["Allegato"],"Fixed":["Fisso"],"Blend Mode":["Modalit\u00e0 di fusione"],"Multiply":["Moltiplica"],"Screen":["Schermo"],"Darken":["Scurisci"],"Lighten":["Alleggerire"],"Color Dodge":["Schiarisci colore"],"Saturation":["Saturazione"],"Repeat-x":["Ripeti-x"],"Repeat-y":["Ripeti-y"],"PX":["PX"],"Button":["Pulsante"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connettiti con OttoKit"],"SUREFORMS PREMIUM FIELDS":["CAMPI PREMIUM DI SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'attuale indirizzo 'Da Email' non corrisponde al nome di dominio del tuo sito web (%1$s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'indirizzo email 'Da' attuale non corrisponde al nome di dominio del tuo sito web (%s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica."],"We strongly recommend that you install the free ":["Consigliamo vivamente di installare il gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! Il Wizard di configurazione rende facile correggere le tue email."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["In alternativa, prova a utilizzare un indirizzo mittente che corrisponda al dominio del tuo sito web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Per favore, inserisci un indirizzo email valido. Le tue notifiche non verranno inviate se il campo non \u00e8 compilato correttamente."],"From Name":["Da Nome"],"From Email":["Da Email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%1$s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica."],"Border Radius":["Raggio del bordo"],"Form Theme":["Tema del modulo"],"Instant Form Padding":["Riempimento istantaneo del modulo"],"Instant Form Border Radius":["Raggio del bordo del modulo istantaneo"],"Select Gradient":["Seleziona sfumatura"],"Upgrade Now":["Aggiorna ora"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Le voci pi\u00f9 vecchie dei giorni selezionati verranno eliminate."],"Entries Time Period":["Periodo di tempo delle voci"],"Custom CSS Panel":["Pannello CSS personalizzato"],"Notifications can use only one From Email so please enter a single address.":["Le notifiche possono utilizzare un solo indirizzo email del mittente, quindi inserisci un solo indirizzo."],"Email Notifications":["Notifiche Email"],"Actions":["Azioni"],"Duplicate":["Duplicato"],"Delete":["Elimina"],"Select Page to redirect":["Seleziona la pagina a cui reindirizzare"],"Search for a page":["Cerca una pagina"],"Select a page":["Seleziona una pagina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Login":["Accesso"],"Register":["Registrati"],"Date":["Data"],"Advanced Settings":["Impostazioni avanzate"],"Form Restriction":["Restrizione del modulo"],"Maximum Number of Entries":["Numero massimo di voci"],"Maximum Entries":["Voci massime"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["La configurazione del Periodo di Tempo funziona in base al fuso orario del tuo sito WordPress. Fai clic qui<\/a> per aprire le Impostazioni Generali di WordPress, dove puoi verificarlo e aggiornarlo."],"Click here":["Fai clic qui"],"Response Description After Maximum Entries":["Descrizione della risposta dopo il numero massimo di voci"],"All changes will be saved automatically when you press back.":["Tutte le modifiche verranno salvate automaticamente quando premi indietro."],"Repeater":["Ripetitore"],"OttoKit Settings":["Impostazioni di OttoKit"],"Get Started":["Inizia"],"Connect Native Integrations with SureForms":["Collega le integrazioni native con SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato previsto per le email - email@sureforms.com o John Doe "],"Payment":["Pagamento"],"%s - Order ID":["%s - ID Ordine"],"%s - Amount":["%s - Importo"],"%s - Customer Email":["%s - Email del cliente"],"%s - Customer Name":["%s - Nome del cliente"],"%s - Status":["%s - Stato"],"Add custom CSS rules to style this specific form independently of global styles.":["Aggiungi regole CSS personalizzate per stilizzare questo modulo specifico indipendentemente dagli stili globali."],"Spam Protection Type":["Tipo di protezione antispam"],"Select Security Type":["Seleziona il tipo di sicurezza"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Nota: L'uso di diverse versioni di reCAPTCHA (V2 checkbox e V3) sulla stessa pagina creer\u00e0 conflitti tra le versioni. Si prega di evitare di utilizzare versioni diverse sulla stessa pagina."],"Select Version":["Seleziona versione"],"Please configure the API keys correctly from the settings":["Si prega di configurare correttamente le chiavi API dalle impostazioni"],"Control email alerts sent to admins or users after a form submission.":["Controlla gli avvisi email inviati agli amministratori o agli utenti dopo l'invio di un modulo."],"Customize the confirmation message or redirect the users after submitting the form.":["Personalizza il messaggio di conferma o reindirizza gli utenti dopo l'invio del modulo."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Imposta limiti su quante volte un modulo pu\u00f2 essere inviato e gestisci le opzioni di conformit\u00e0, inclusi GDPR e conservazione dei dati."],"Go to OttoKit Settings":["Vai alle Impostazioni di OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Collega SureForms con le tue app preferite per automatizzare le attivit\u00e0 e sincronizzare i dati senza problemi."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Sblocca potenti integrazioni nel piano Premium per automatizzare i tuoi flussi di lavoro e collegare SureForms direttamente con i tuoi strumenti preferiti."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Invia le sottomissioni dei moduli direttamente ai CRM, email e piattaforme di marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatizza le attivit\u00e0 ripetitive con una sincronizzazione dei dati senza interruzioni."],"Access exclusive native integrations for faster workflows.":["Accedi a integrazioni native esclusive per flussi di lavoro pi\u00f9 veloci."],"PDF Generation":["Generazione PDF"],"Generate and customize PDF copies of form submissions.":["Genera e personalizza copie PDF delle invii dei moduli."],"Generate Submission PDFs":["Genera PDF di invio"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Trasforma ogni voce del modulo in un file PDF raffinato, rendendolo perfetto per rapporti, registri o condivisioni."],"Automatically generate PDFs from your form submissions.":["Genera automaticamente PDF dalle tue invii di moduli."],"Customize PDF templates with your branding.":["Personalizza i modelli PDF con il tuo marchio."],"Download or email PDFs instantly.":["Scarica o invia via email i PDF istantaneamente."],"User Registration":["Registrazione utente"],"Onboard new users or update existing accounts through beautiful looking forms.":["Integra nuovi utenti o aggiorna gli account esistenti tramite moduli dall'aspetto elegante."],"Register Users with SureForms":["Registrare utenti con SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Semplifica l'intero processo di onboarding degli utenti per i tuoi siti con accessi e registrazioni senza soluzione di continuit\u00e0 alimentati da moduli."],"Register new users directly via your form submissions.":["Registrare nuovi utenti direttamente tramite le tue invii di moduli."],"Create or update existing accounts by mapping form data to user fields.":["Crea o aggiorna gli account esistenti mappando i dati del modulo ai campi utente."],"Assign roles and control access automatically.":["Assegna ruoli e controlla l'accesso automaticamente."],"Post Feed":["Feed dei post"],"Transform your form submission into WordPress posts.":["Trasforma l'invio del tuo modulo in articoli di WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Trasforma automaticamente le invii dei moduli in articoli, pagine o tipi di post personalizzati di WordPress. Risparmia tempo e lascia che i tuoi moduli pubblichino contenuti direttamente."],"Create posts, pages, or CPTs from your form entries.":["Crea post, pagine o CPT dai tuoi inserimenti nel modulo."],"Map form fields to your post fields easily.":["Mappa facilmente i campi del modulo ai campi del tuo post."],"Automate the content publishing flow with few simple steps.":["Automatizza il flusso di pubblicazione dei contenuti con pochi semplici passaggi."],"Automations":["Automazioni"],"Unlock Advanced Styling":["Sblocca lo stile avanzato"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Ottieni il pieno controllo sull'aspetto del tuo modulo con colori, caratteri e layout personalizzati."],"Button Alignment":["Allineamento del pulsante"],"Add Custom CSS Class(es)":["Aggiungi classe(i) CSS personalizzata(e)"],"Set the total number of submissions allowed for this form.":["Imposta il numero totale di invii consentiti per questo modulo."],"Save & Progress":["Salva e Prosegui"],"Allow users to save their progress and continue form completion later.":["Consenti agli utenti di salvare i loro progressi e continuare a completare il modulo in seguito."],"Save & Progress in SureForms":["Salva e Prosegui in SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Dai ai tuoi utenti la flessibilit\u00e0 di completare i moduli al proprio ritmo consentendo loro di salvare i progressi e tornare in qualsiasi momento."],"Let users pause long or multi-step forms and continue later.":["Consenti agli utenti di mettere in pausa moduli lunghi o a pi\u00f9 fasi e continuare in seguito."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Riduci l'abbandono dei moduli con link di ripresa convenienti e accedi ai loro progressi da qualsiasi luogo."],"Improve user experience for lengthy, complex, or multi-page forms.":["Migliora l'esperienza utente per moduli lunghi, complessi o su pi\u00f9 pagine."],"This form is not yet available. Please check back after the scheduled start time.":["Questo modulo non \u00e8 ancora disponibile. Si prega di ricontrollare dopo l'orario di inizio programmato."],"This form is no longer accepting submissions. The submission period has ended.":["Questo modulo non accetta pi\u00f9 invii. Il periodo di invio \u00e8 terminato."],"The start date and time must be before the end date and time.":["La data e l'ora di inizio devono essere precedenti alla data e all'ora di fine."],"Form Scheduling":["Pianificazione del modulo"],"Enable Form Scheduling":["Abilita la pianificazione del modulo"],"Set a time period during which this form will be available for submissions.":["Imposta un periodo di tempo durante il quale questo modulo sar\u00e0 disponibile per le invii."],"Start Date & Time":["Data e ora di inizio"],"End Date & Time":["Data e ora di fine"],"Response Description Before Start Date":["Descrizione della risposta prima della data di inizio"],"Response Description After End Date":["Descrizione della risposta dopo la data di fine"],"Conditional Confirmations":["Conferme Condizionali"],"Set up the message or redirect users will see after submitting the form.":["Imposta il messaggio o reindirizza gli utenti che vedranno dopo aver inviato il modulo."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Mostra il messaggio giusto all'utente giusto in base a come risponde. Personalizza le conferme con condizioni intelligenti e guida automaticamente gli utenti al passo successivo migliore."],"Display different confirmation messages based on form responses.":["Visualizza diversi messaggi di conferma in base alle risposte del modulo."],"Redirect users to specific pages or URLs conditionally.":["Reindirizza gli utenti a pagine o URL specifici in modo condizionale."],"Create personalized thank-you messages without extra forms.":["Crea messaggi di ringraziamento personalizzati senza moduli aggiuntivi."],"Lost Password":["Password persa"],"Reset Password":["Reimposta la password"],"When enabled, this form will not store user IP, browser name, or device name in entries.":["Quando abilitato, questo modulo non memorizzer\u00e0 l'IP dell'utente, il nome del browser o il nome del dispositivo nelle voci."],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Seleziona un servizio di protezione antispam. Configura le chiavi API nelle Impostazioni Globali prima di abilitare."],"Send as Raw HTML":["Invia come HTML grezzo"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Quando abilitato, il corpo dell'email HTML verr\u00e0 preservato esattamente come scritto e avvolto in un modello di email professionale."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["I tag intelligenti che fanno riferimento ai campi inviati dagli utenti non verranno eseguiti in modalit\u00e0 HTML grezzo. Evita di inserire valori di campo non attendibili direttamente nel corpo dell'email."],"Please provide a recipient email address and subject line.":["Si prega di fornire un indirizzo email del destinatario e l'oggetto."],"Email notification duplicated!":["Notifica email duplicata!"],"Are you sure you want to delete this email notification?":["Sei sicuro di voler eliminare questa notifica email?"],"Email notification deleted!":["Notifica email eliminata!"],"URL is missing Top Level Domain (TLD).":["Manca il dominio di primo livello (TLD) nell'URL."],"This form is now closed as the maximum number of entries has been received.":["Questo modulo \u00e8 ora chiuso poich\u00e9 \u00e8 stato raggiunto il numero massimo di iscrizioni."],"Publish Your Form":["Pubblica il tuo modulo"],"Enable This to Instantly Publish the Form":["Abilita questo per pubblicare immediatamente il modulo"],"Style Your Instant Form Page Here":["Stile la tua pagina del modulo istantaneo qui"],"Quizzes":["Quiz"],"%s - Description":["%s - Descrizione"],"Choose a spam protection method for this form to prevent unwanted submissions.":["Scegli un metodo di protezione antispam per questo modulo per prevenire invii indesiderati."],"Send entries to 100+ popular apps.":["Invia voci a oltre 100 app popolari."],"Build automated workflows that run instantly.":["Crea flussi di lavoro automatizzati che vengono eseguiti istantaneamente."],"Create custom app integrations using our Custom App feature.":["Crea integrazioni di app personalizzate utilizzando la nostra funzione App personalizzata."],"Keep your tools in sync automatically.":["Mantieni i tuoi strumenti sincronizzati automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Questo installer\u00e0 e attiver\u00e0 OttoKit sul tuo sito WordPress per abilitare le funzionalit\u00e0 di automazione."],"Automate Your Forms with OttoKit":["Automatizza i tuoi moduli con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ogni invio di modulo dovrebbe attivare qualcosa: un avviso Slack, un lead CRM, un'email di follow-up o una nuova riga in Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Crea quiz interattivi per coinvolgere il tuo pubblico e raccogliere informazioni."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Progetta quiz coinvolgenti con vari tipi di domande, feedback personalizzati e punteggi automatici per catturare l'attenzione del tuo pubblico e ottenere preziose informazioni."],"Create interactive quizzes with multiple question types.":["Crea quiz interattivi con pi\u00f9 tipi di domande."],"Provide personalized feedback based on user responses.":["Fornisci feedback personalizzato basato sulle risposte degli utenti."],"Automate scoring and lead segmentation for better insights.":["Automatizza la valutazione e la segmentazione dei lead per ottenere migliori approfondimenti."],"Heading 1":["Intestazione 1"],"Heading 2":["Intestazione 2"],"Heading 3":["Intestazione 3"],"Heading 4":["Intestazione 4"],"Heading 5":["Intestazione 5"],"Heading 6":["Intestazione 6"],"Quill heading picker: default paragraph style\u0004Normal":["Normale"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Stato"],"Form":["Modulo"],"Fields":["Campi"],"Image":["Immagine"],"Activated":["Attivato"],"Activate":["Attiva"],"Submit":["Invia"],"Global Settings":["Impostazioni globali"],"Form Title":["Titolo del modulo"],"Edit":["Modifica"],"Please enter a valid URL.":["Per favore inserisci un URL valido."],"Desktop":["Desktop"],"Medium":["Medio"],"Mobile":["Cellulare"],"Repeat":["Ripeti"],"Scroll":["Scorri"],"Signature":["Firma"],"Tablet":["Tablet"],"Upload":["Carica"],"Basic":["Base"],"Form Settings":["Impostazioni del modulo"],"General":["Generale"],"Style":["Stile"],"Advanced":["Avanzato"],"No tags available":["Nessun tag disponibile"],"Device":["Dispositivo"],"Select Shortcodes":["Seleziona i codici brevi"],"Page Break Label":["Etichetta di interruzione di pagina"],"Next":["Avanti"],"Back":["Indietro"],"Reset":["Reimposta"],"Generic tags":["Tag generici"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Seleziona unit\u00e0"],"%s units":["%s unit\u00e0"],"Margin":["Margine"],"None":["Nessuno"],"Custom":["Personalizzato"],"Please add a option props to MultiButtonsControl":["Si prega di aggiungere un'opzione props a MultiButtonsControl"],"Confirm":["Conferma"],"Cancel":["Annulla"],"Processing\u2026":["Elaborazione\u2026"],"Select Video":["Seleziona video"],"Change Video":["Cambia video"],"Select Lottie Animation":["Seleziona animazione Lottie"],"Change Lottie Animation":["Cambia animazione Lottie"],"Upload SVG":["Carica SVG"],"Change SVG":["Cambia SVG"],"Select Image":["Seleziona immagine"],"Change Image":["Cambia immagine"],"Upload SVG?":["Caricare SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Caricare SVG pu\u00f2 essere potenzialmente rischioso. Sei sicuro?"],"Upload Anyway":["Carica comunque"],"Full Width":["Larghezza completa"],"Install":["Installa"],"Plugin Installation failed, Please try again later.":["Installazione del plugin fallita, per favore riprova pi\u00f9 tardi."],"Plugin activation failed, Please try again later.":["Attivazione del plugin fallita, riprova pi\u00f9 tardi."],"Integrations":["Integrazioni"],"%s Removed from Quick Action Bar.":["%s rimosso dalla barra delle azioni rapide."],"Add to Quick Action Bar":["Aggiungi alla barra delle azioni rapide"],"%s Added to Quick Action Bar.":["%s aggiunto alla barra delle azioni rapide."],"Already Present in Quick Action Bar":["Gi\u00e0 presente nella barra delle azioni rapide"],"No results found.":["Nessun risultato trovato."],"data object is empty":["l'oggetto dati \u00e8 vuoto"],"Add blocks to Quick Action Bar":["Aggiungi blocchi alla barra delle azioni rapide"],"Re-arrange block inside Quick Action Bar":["Riorganizza il blocco all'interno della Barra delle Azioni Rapide"],"Upgrade":["Aggiornamento"],"Connecting\u2026":["Connessione in corso\u2026"],"Install & Activate":["Installa e attiva"],"Compliance Settings":["Impostazioni di conformit\u00e0"],"Enable GDPR Compliance":["Abilita la conformit\u00e0 GDPR"],"Never store entry data after form submission":["Non memorizzare mai i dati di ingresso dopo l'invio del modulo"],"When enabled this form will never store Entries.":["Quando abilitato, questo modulo non memorizzer\u00e0 mai le voci."],"Automatically delete entries":["Elimina automaticamente le voci"],"When enabled this form will automatically delete entries after a certain period of time.":["Quando abilitato, questo modulo eliminer\u00e0 automaticamente le voci dopo un certo periodo di tempo."],"Entries older than the days set will be deleted automatically.":["Le voci pi\u00f9 vecchie dei giorni impostati verranno eliminate automaticamente."],"Custom CSS":["CSS personalizzato"],"The following CSS styles added below will only apply to this form container.":["I seguenti stili CSS aggiunti di seguito si applicheranno solo a questo contenitore del modulo."],"Visual":["Visivo"],"HTML":["HTML"],"All Data":["Tutti i dati"],"Add Shortcode":["Aggiungi shortcode"],"Form input tags":["Tag di input del modulo"],"Comma separated values are also accepted.":["Sono accettati anche i valori separati da virgola."],"Email Notification":["Notifica email"],"Name":["Nome"],"Send Email To":["Invia email a"],"Subject":["Oggetto"],"CC":["CC"],"BCC":["Ccn"],"Reply To":["Rispondi a"],"Add Notification":["Aggiungi notifica"],"Add Key":["Aggiungi chiave"],"Add Value":["Aggiungi valore"],"Add":["Aggiungi"],"Confirmation Message":["Messaggio di conferma"],"After Form Submission":["Dopo l'invio del modulo"],"Hide Form":["Nascondi modulo"],"Reset Form":["Reimposta modulo"],"Custom URL":["URL personalizzato"],"Add Query Parameters":["Aggiungi parametri di query"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Seleziona se desideri aggiungere coppie chiave-valore per i campi del modulo da includere nei parametri di query"],"Query Parameters":["Parametri di query"],"Please select a page.":["Si prega di selezionare una pagina."],"Suggestion: URL should use HTTPS":["Suggerimento: l'URL dovrebbe utilizzare HTTPS"],"Success Message":["Messaggio di successo"],"Redirect":["Reindirizza"],"Redirect to":["Reindirizza a"],"Page":["Pagina"],"Form Confirmation":["Conferma del modulo"],"Confirmation Type":["Tipo di conferma"],"Use Labels as Placeholders":["Usa le etichette come segnaposto"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Questa impostazione posizioner\u00e0 le etichette all'interno dei campi come segnaposto (dove possibile). Questa impostazione ha effetto solo sulla pagina live, non nell'anteprima dell'editor."],"Page Break":["Interruzione di pagina"],"Show Labels":["Mostra etichette"],"First Page Label":["Etichetta della prima pagina"],"Progress Indicator":["Indicatore di progresso"],"Progress Bar":["Barra di progresso"],"Connector":["Connettore"],"Steps":["Passi"],"Next Button Text":["Testo del pulsante Avanti"],"Back Button Text":["Testo del pulsante Indietro"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Sei sicuro di voler chiudere? Le modifiche non salvate andranno perse poich\u00e9 ci sono alcuni errori di convalida."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Ci sono alcune modifiche non salvate. Si prega di salvare le modifiche per riflettere gli aggiornamenti."],"Form Behavior":["Comportamento del modulo"],"Clear":["Chiaro"],"Select Color":["Seleziona colore"],"Primary Color":["Colore primario"],"Text Color":["Colore del testo"],"Text Color on Primary":["Colore del testo sul primario"],"Field Spacing":["Spaziatura del campo"],"Small":["Piccolo"],"Large":["Grande"],"Left":["Sinistra"],"Center":["Centro"],"Right":["Destra"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisibile"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Selettore di data"],"Time Picker":["Selettore del tempo"],"Hidden":["Nascosto"],"Slider":["Cursore"],"Rating":["Valutazione"],"Upgrade to Unlock These Fields":["Aggiorna per sbloccare questi campi"],"Add Block":["Aggiungi blocco"],"Customize with SureForms":["Personalizza con SureForms"],"Page break":["Interruzione di pagina"],"Previous":["Precedente"],"Thank you":["Grazie"],"Form submitted successfully!":["Modulo inviato con successo!"],"Instant Form":["Modulo istantaneo"],"Enable Instant Form":["Abilita il modulo istantaneo"],"Enable Preview":["Abilita anteprima"],"Show Title":["Titolo dello spettacolo"],"Site Logo":["Logo del sito"],"Banner Background":["Sfondo del banner"],"Color":["Colore"],"Upload Image":["Carica immagine"],"Background Color":["Colore di sfondo"],"Use banner as page background":["Usa il banner come sfondo della pagina"],"Form Width":["Larghezza del modulo"],"URL":["URL"],"URL Slug":["Slug URL"],"The last part of the URL.":["L'ultima parte dell'URL."],"Learn more.":["Scopri di pi\u00f9."],"SureForms Description":["Descrizione di SureForms"],"Form Options":["Opzioni del modulo"],"Form Shortcode":["Codice breve del modulo"],"Paste this shortcode on the page or post to render this form.":["Incolla questo shortcode nella pagina o nel post per visualizzare questo modulo."],"Spam Protection":["Protezione antispam"],"Auto":["Auto"],"Normal":["Normale"],"%":["%"],"Top":["In alto"],"Bottom":["Fondo"],"Solid":["Solido"],"Width":["Larghezza"],"Size":["Dimensione"],"EM":["EM"],"Padding":["Riempimento"],"Color 1":["Colore 1"],"Color 2":["Colore 2"],"Type":["Tipo"],"Linear":["Lineare"],"Radial":["Radiale"],"Location 1":["Posizione 1"],"Location 2":["Posizione 2"],"Angle":["Angolo"],"Classic":["Classico"],"Gradient":["Gradiente"],"Background":["Sfondo"],"Cover":["Copertina"],"Contain":["Contenere"],"Overlay":["Sovrapposizione"],"No Repeat":["Nessuna ripetizione"],"Overlay Opacity":["Opacit\u00e0 dell'overlay"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["I nomi delle classi devono essere separati da spazi. Ogni nome di classe non deve iniziare con una cifra, un trattino o un underscore. Possono includere solo lettere (comprese le lettere Unicode), numeri, trattini e underscore."],"Conversational Layout":["Layout Conversazionale"],"Unlock Conversational Forms":["Sblocca moduli conversazionali"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Con il piano SureForms Pro, puoi trasformare i tuoi moduli in layout conversazionali coinvolgenti per un'esperienza utente senza interruzioni."],"Premium":["Premium"],"Overlay Type":["Tipo di sovrapposizione"],"Image Overlay Color":["Colore di sovrapposizione dell'immagine"],"Image Position":["Posizione dell'immagine"],"Attachment":["Allegato"],"Fixed":["Fisso"],"Blend Mode":["Modalit\u00e0 di fusione"],"Multiply":["Moltiplica"],"Screen":["Schermo"],"Darken":["Scurisci"],"Lighten":["Alleggerire"],"Color Dodge":["Schiarisci colore"],"Saturation":["Saturazione"],"Repeat-x":["Ripeti-x"],"Repeat-y":["Ripeti-y"],"PX":["PX"],"Button":["Pulsante"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connettiti con OttoKit"],"SUREFORMS PREMIUM FIELDS":["CAMPI PREMIUM DI SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'attuale indirizzo 'Da Email' non corrisponde al nome di dominio del tuo sito web (%1$s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'indirizzo email 'Da' attuale non corrisponde al nome di dominio del tuo sito web (%s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica."],"We strongly recommend that you install the free ":["Consigliamo vivamente di installare il gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! Il Wizard di configurazione rende facile correggere le tue email."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["In alternativa, prova a utilizzare un indirizzo mittente che corrisponda al dominio del tuo sito web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Per favore, inserisci un indirizzo email valido. Le tue notifiche non verranno inviate se il campo non \u00e8 compilato correttamente."],"From Name":["Da Nome"],"From Email":["Da Email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%1$s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica."],"Border Radius":["Raggio del bordo"],"Form Theme":["Tema del modulo"],"Instant Form Padding":["Riempimento istantaneo del modulo"],"Instant Form Border Radius":["Raggio del bordo del modulo istantaneo"],"Select Gradient":["Seleziona sfumatura"],"Upgrade Now":["Aggiorna ora"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Le voci pi\u00f9 vecchie dei giorni selezionati verranno eliminate."],"Entries Time Period":["Periodo di tempo delle voci"],"Custom CSS Panel":["Pannello CSS personalizzato"],"Notifications can use only one From Email so please enter a single address.":["Le notifiche possono utilizzare un solo indirizzo email del mittente, quindi inserisci un solo indirizzo."],"Email Notifications":["Notifiche Email"],"Actions":["Azioni"],"Duplicate":["Duplicato"],"Delete":["Elimina"],"Select Page to redirect":["Seleziona la pagina a cui reindirizzare"],"Search for a page":["Cerca una pagina"],"Select a page":["Seleziona una pagina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Save":["Salva"],"Login":["Accesso"],"Register":["Registrati"],"Date":["Data"],"Advanced Settings":["Impostazioni avanzate"],"Form Restriction":["Restrizione del modulo"],"Maximum Number of Entries":["Numero massimo di voci"],"Maximum Entries":["Voci massime"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["La configurazione del Periodo di Tempo funziona in base al fuso orario del tuo sito WordPress. Fai clic qui<\/a> per aprire le Impostazioni Generali di WordPress, dove puoi verificarlo e aggiornarlo."],"Click here":["Fai clic qui"],"Response Description After Maximum Entries":["Descrizione della risposta dopo il numero massimo di voci"],"All changes will be saved automatically when you press back.":["Tutte le modifiche verranno salvate automaticamente quando premi indietro."],"Repeater":["Ripetitore"],"OttoKit Settings":["Impostazioni di OttoKit"],"Get Started":["Inizia"],"Connect Native Integrations with SureForms":["Collega le integrazioni native con SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato previsto per le email - email@sureforms.com o John Doe "],"delete":["elimina"],"Please type \"%s\" in the input box":["Per favore digita \"%s\" nella casella di input"],"To confirm, type \"%s\" in the box below:":["Per confermare, digita \"%s\" nella casella sottostante:"],"Type \"%s\"":["Digita \"%s\""],"Payment":["Pagamento"],"%s - Order ID":["%s - ID Ordine"],"%s - Amount":["%s - Importo"],"%s - Customer Email":["%s - Email del cliente"],"%s - Customer Name":["%s - Nome del cliente"],"%s - Status":["%s - Stato"],"Add custom CSS rules to style this specific form independently of global styles.":["Aggiungi regole CSS personalizzate per stilizzare questo modulo specifico indipendentemente dagli stili globali."],"Spam Protection Type":["Tipo di protezione antispam"],"Select Security Type":["Seleziona il tipo di sicurezza"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Nota: L'uso di diverse versioni di reCAPTCHA (V2 checkbox e V3) sulla stessa pagina creer\u00e0 conflitti tra le versioni. Si prega di evitare di utilizzare versioni diverse sulla stessa pagina."],"Select Version":["Seleziona versione"],"Please configure the API keys correctly from the settings":["Si prega di configurare correttamente le chiavi API dalle impostazioni"],"Control email alerts sent to admins or users after a form submission.":["Controlla gli avvisi email inviati agli amministratori o agli utenti dopo l'invio di un modulo."],"Customize the confirmation message or redirect the users after submitting the form.":["Personalizza il messaggio di conferma o reindirizza gli utenti dopo l'invio del modulo."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Imposta limiti su quante volte un modulo pu\u00f2 essere inviato e gestisci le opzioni di conformit\u00e0, inclusi GDPR e conservazione dei dati."],"Go to OttoKit Settings":["Vai alle Impostazioni di OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Collega SureForms con le tue app preferite per automatizzare le attivit\u00e0 e sincronizzare i dati senza problemi."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Sblocca potenti integrazioni nel piano Premium per automatizzare i tuoi flussi di lavoro e collegare SureForms direttamente con i tuoi strumenti preferiti."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Invia le sottomissioni dei moduli direttamente ai CRM, email e piattaforme di marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatizza le attivit\u00e0 ripetitive con una sincronizzazione dei dati senza interruzioni."],"Access exclusive native integrations for faster workflows.":["Accedi a integrazioni native esclusive per flussi di lavoro pi\u00f9 veloci."],"PDF Generation":["Generazione PDF"],"Generate and customize PDF copies of form submissions.":["Genera e personalizza copie PDF delle invii dei moduli."],"Generate Submission PDFs":["Genera PDF di invio"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Trasforma ogni voce del modulo in un file PDF raffinato, rendendolo perfetto per rapporti, registri o condivisioni."],"Automatically generate PDFs from your form submissions.":["Genera automaticamente PDF dalle tue invii di moduli."],"Customize PDF templates with your branding.":["Personalizza i modelli PDF con il tuo marchio."],"Download or email PDFs instantly.":["Scarica o invia via email i PDF istantaneamente."],"User Registration":["Registrazione utente"],"Onboard new users or update existing accounts through beautiful looking forms.":["Integra nuovi utenti o aggiorna gli account esistenti tramite moduli dall'aspetto elegante."],"Register Users with SureForms":["Registrare utenti con SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Semplifica l'intero processo di onboarding degli utenti per i tuoi siti con accessi e registrazioni senza soluzione di continuit\u00e0 alimentati da moduli."],"Register new users directly via your form submissions.":["Registrare nuovi utenti direttamente tramite le tue invii di moduli."],"Create or update existing accounts by mapping form data to user fields.":["Crea o aggiorna gli account esistenti mappando i dati del modulo ai campi utente."],"Assign roles and control access automatically.":["Assegna ruoli e controlla l'accesso automaticamente."],"Post Feed":["Feed dei post"],"Transform your form submission into WordPress posts.":["Trasforma l'invio del tuo modulo in articoli di WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Trasforma automaticamente le invii dei moduli in articoli, pagine o tipi di post personalizzati di WordPress. Risparmia tempo e lascia che i tuoi moduli pubblichino contenuti direttamente."],"Create posts, pages, or CPTs from your form entries.":["Crea post, pagine o CPT dai tuoi inserimenti nel modulo."],"Map form fields to your post fields easily.":["Mappa facilmente i campi del modulo ai campi del tuo post."],"Automate the content publishing flow with few simple steps.":["Automatizza il flusso di pubblicazione dei contenuti con pochi semplici passaggi."],"Automations":["Automazioni"],"Unlock Advanced Styling":["Sblocca lo stile avanzato"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Ottieni il pieno controllo sull'aspetto del tuo modulo con colori, caratteri e layout personalizzati."],"Button Alignment":["Allineamento del pulsante"],"Add Custom CSS Class(es)":["Aggiungi classe(i) CSS personalizzata(e)"],"Set the total number of submissions allowed for this form.":["Imposta il numero totale di invii consentiti per questo modulo."],"Save & Progress":["Salva e Prosegui"],"Allow users to save their progress and continue form completion later.":["Consenti agli utenti di salvare i loro progressi e continuare a completare il modulo in seguito."],"Save & Progress in SureForms":["Salva e Prosegui in SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Dai ai tuoi utenti la flessibilit\u00e0 di completare i moduli al proprio ritmo consentendo loro di salvare i progressi e tornare in qualsiasi momento."],"Let users pause long or multi-step forms and continue later.":["Consenti agli utenti di mettere in pausa moduli lunghi o a pi\u00f9 fasi e continuare in seguito."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Riduci l'abbandono dei moduli con link di ripresa convenienti e accedi ai loro progressi da qualsiasi luogo."],"Improve user experience for lengthy, complex, or multi-page forms.":["Migliora l'esperienza utente per moduli lunghi, complessi o su pi\u00f9 pagine."],"This form is not yet available. Please check back after the scheduled start time.":["Questo modulo non \u00e8 ancora disponibile. Si prega di ricontrollare dopo l'orario di inizio programmato."],"This form is no longer accepting submissions. The submission period has ended.":["Questo modulo non accetta pi\u00f9 invii. Il periodo di invio \u00e8 terminato."],"The start date and time must be before the end date and time.":["La data e l'ora di inizio devono essere precedenti alla data e all'ora di fine."],"Form Scheduling":["Pianificazione del modulo"],"Enable Form Scheduling":["Abilita la pianificazione del modulo"],"Set a time period during which this form will be available for submissions.":["Imposta un periodo di tempo durante il quale questo modulo sar\u00e0 disponibile per le invii."],"Start Date & Time":["Data e ora di inizio"],"End Date & Time":["Data e ora di fine"],"Response Description Before Start Date":["Descrizione della risposta prima della data di inizio"],"Response Description After End Date":["Descrizione della risposta dopo la data di fine"],"Conditional Confirmations":["Conferme Condizionali"],"Set up the message or redirect users will see after submitting the form.":["Imposta il messaggio o reindirizza gli utenti che vedranno dopo aver inviato il modulo."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Mostra il messaggio giusto all'utente giusto in base a come risponde. Personalizza le conferme con condizioni intelligenti e guida automaticamente gli utenti al passo successivo migliore."],"Display different confirmation messages based on form responses.":["Visualizza diversi messaggi di conferma in base alle risposte del modulo."],"Redirect users to specific pages or URLs conditionally.":["Reindirizza gli utenti a pagine o URL specifici in modo condizionale."],"Create personalized thank-you messages without extra forms.":["Crea messaggi di ringraziamento personalizzati senza moduli aggiuntivi."],"Lost Password":["Password persa"],"Reset Password":["Reimposta la password"],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Seleziona un servizio di protezione antispam. Configura le chiavi API nelle Impostazioni Globali prima di abilitare."],"Send as Raw HTML":["Invia come HTML grezzo"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Quando abilitato, il corpo dell'email HTML verr\u00e0 preservato esattamente come scritto e avvolto in un modello di email professionale."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["I tag intelligenti che fanno riferimento ai campi inviati dagli utenti non verranno eseguiti in modalit\u00e0 HTML grezzo. Evita di inserire valori di campo non attendibili direttamente nel corpo dell'email."],"Please provide a recipient email address and subject line.":["Si prega di fornire un indirizzo email del destinatario e l'oggetto."],"Email notification duplicated!":["Notifica email duplicata!"],"Are you sure you want to delete this email notification?":["Sei sicuro di voler eliminare questa notifica email?"],"Email notification deleted!":["Notifica email eliminata!"],"URL is missing Top Level Domain (TLD).":["Manca il dominio di primo livello (TLD) nell'URL."],"This form is now closed as the maximum number of entries has been received.":["Questo modulo \u00e8 ora chiuso poich\u00e9 \u00e8 stato raggiunto il numero massimo di iscrizioni."],"Publish Your Form":["Pubblica il tuo modulo"],"Enable This to Instantly Publish the Form":["Abilita questo per pubblicare immediatamente il modulo"],"Style Your Instant Form Page Here":["Stile la tua pagina del modulo istantaneo qui"],"Quizzes":["Quiz"],"%s - Description":["%s - Descrizione"],"Send entries to 100+ popular apps.":["Invia voci a oltre 100 app popolari."],"Build automated workflows that run instantly.":["Crea flussi di lavoro automatizzati che vengono eseguiti istantaneamente."],"Create custom app integrations using our Custom App feature.":["Crea integrazioni di app personalizzate utilizzando la nostra funzione App personalizzata."],"Keep your tools in sync automatically.":["Mantieni i tuoi strumenti sincronizzati automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Questo installer\u00e0 e attiver\u00e0 OttoKit sul tuo sito WordPress per abilitare le funzionalit\u00e0 di automazione."],"Automate Your Forms with OttoKit":["Automatizza i tuoi moduli con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ogni invio di modulo dovrebbe attivare qualcosa: un avviso Slack, un lead CRM, un'email di follow-up o una nuova riga in Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Crea quiz interattivi per coinvolgere il tuo pubblico e raccogliere informazioni."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Progetta quiz coinvolgenti con vari tipi di domande, feedback personalizzati e punteggi automatici per catturare l'attenzione del tuo pubblico e ottenere preziose informazioni."],"Create interactive quizzes with multiple question types.":["Crea quiz interattivi con pi\u00f9 tipi di domande."],"Provide personalized feedback based on user responses.":["Fornisci feedback personalizzato basato sulle risposte degli utenti."],"Automate scoring and lead segmentation for better insights.":["Automatizza la valutazione e la segmentazione dei lead per ottenere migliori approfondimenti."],"Heading 1":["Intestazione 1"],"Heading 2":["Intestazione 2"],"Heading 3":["Intestazione 3"],"Heading 4":["Intestazione 4"],"Heading 5":["Intestazione 5"],"Heading 6":["Intestazione 6"],"Form settings saved.":["Impostazioni del modulo salvate."],"The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature.":["Il limite di inserimento si basa sulle voci memorizzate per contare le sottomissioni. Quando nelle Impostazioni di Conformit\u00e0 \u00e8 abilitata l'opzione \"Non memorizzare mai i dati di inserimento dopo l'invio del modulo\", questo limite non verr\u00e0 applicato. Disabilita quell'opzione o rimuovi il limite di inserimento per utilizzare questa funzione."],"Settings saved, but post attributes (password \/ title \/ content) failed to update. Retry to persist them.":["Impostazioni salvate, ma gli attributi del post (password \/ titolo \/ contenuto) non sono stati aggiornati. Riprova per mantenerli."],"Failed to save form settings.":["Impossibile salvare le impostazioni del modulo."],"Saving\u2026":["Salvataggio in corso\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Quando abilitato, questo modulo non memorizzer\u00e0 l'IP dell'utente, il nome del browser e il nome del dispositivo nelle voci."],"Failed to save. Please try again.":["Salvataggio non riuscito. Per favore riprova."],"reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.":["Le chiavi API di reCAPTCHA per la versione selezionata non sono configurate. Impostale nelle Impostazioni Globali."],"Please select a reCAPTCHA version.":["Si prega di selezionare una versione di reCAPTCHA."],"hCaptcha API keys are not configured. Set them in Global Settings.":["Le chiavi API di hCaptcha non sono configurate. Impostale nelle Impostazioni Globali."],"Cloudflare Turnstile API keys are not configured. Set them in Global Settings.":["Le chiavi API di Cloudflare Turnstile non sono configurate. Impostale nelle Impostazioni Globali."],"Form data":["Dati del modulo"],"Some fields need attention":["Alcuni campi necessitano di attenzione"],"Unsaved changes":["Modifiche non salvate"],"A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.":["\u00c8 necessario un indirizzo email del destinatario e una riga dell'oggetto prima che questa notifica possa essere salvata. Correggi i campi evidenziati o annulla le modifiche per tornare indietro."],"You have unsaved changes for this notification. Discard them to go back, or stay to save them.":["Hai modifiche non salvate per questa notifica. Scartale per tornare indietro o rimani per salvarle."],"Discard & go back":["Annulla e torna indietro"],"Stay & fix":["Rimani e ripara"],"Keep editing":["Continua a modificare"],"Please provide a recipient email address.":["Si prega di fornire un indirizzo email del destinatario."],"Please provide a subject line.":["Si prega di fornire un oggetto."],"Please provide a custom URL.":["Si prega di fornire un URL personalizzato."],"You have unsaved changes. Discard them to continue, or stay to save your changes.":["Hai modifiche non salvate. Scartale per continuare o rimani per salvare le tue modifiche."],"Discard & continue":["Scarta e continua"],"Quill heading picker: default paragraph style\u0004Normal":["Normale"]}}} \ No newline at end of file diff --git a/languages/sureforms-it_IT-46b85b18ab0a35677f7beff46af30190.json b/languages/sureforms-it_IT-46b85b18ab0a35677f7beff46af30190.json new file mode 100644 index 000000000..aa71cec4a --- /dev/null +++ b/languages/sureforms-it_IT-46b85b18ab0a35677f7beff46af30190.json @@ -0,0 +1 @@ +{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/htmlFormDetector.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Converted form":["Modulo convertito"],"SureForms could not authenticate this request. Please reload the editor and try again.":["SureForms non \u00e8 riuscito ad autenticare questa richiesta. Ricarica l'editor e riprova."],"%s \u2014 Converted form":["%s \u2014 Forma convertita"],"Form converted to SureForms using AI. Review the new form for any tweaks.":["Modulo convertito in SureForms utilizzando l'IA. Rivedi il nuovo modulo per eventuali modifiche."],"Form converted to SureForms.":["Modulo convertito in SureForms."],"You do not have permission to convert this form.":["Non hai il permesso di convertire questo modulo."],"This form is too large to convert. Try simplifying the markup or building the form manually.":["Questo modulo \u00e8 troppo grande per essere convertito. Prova a semplificare il markup o a costruire il modulo manualmente."],"SureForms could not derive any fields from this form.":["SureForms non \u00e8 riuscito a derivare alcun campo da questo modulo."],"The SureForms AI service could not process this form. Please try again or build the form manually.":["Il servizio SureForms AI non \u00e8 riuscito a elaborare questo modulo. Si prega di riprovare o di creare il modulo manualmente."],"SureForms received an unexpected response. Please try again.":["SureForms ha ricevuto una risposta inaspettata. Per favore riprova."],"Could not convert this form to SureForms. Please try again.":["Impossibile convertire questo modulo in SureForms. Per favore riprova."],"Converting\u2026":["Conversione in corso\u2026"],"Convert to SureForms":["Converti in SureForms"]}}} \ No newline at end of file diff --git a/languages/sureforms-it_IT-4b62e3f004dea2c587b5a3069263d994.json b/languages/sureforms-it_IT-4b62e3f004dea2c587b5a3069263d994.json index e91d06769..2df595157 100644 --- a/languages/sureforms-it_IT-4b62e3f004dea2c587b5a3069263d994.json +++ b/languages/sureforms-it_IT-4b62e3f004dea2c587b5a3069263d994.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Impostazioni"],"Search":["Cerca"],"Fields":["Campi"],"Image":["Immagine"],"Submit":["Invia"],"Required":["Richiesto"],"Form Title":["Titolo del modulo"],"Show":["Mostra"],"Hide":["Nascondi"],"Edit Form":["Modifica modulo"],"Icon":["Icona"],"Desktop":["Desktop"],"Medium":["Medio"],"Mobile":["Cellulare"],"Repeat":["Ripeti"],"Scroll":["Scorri"],"Tablet":["Tablet"],"Basic":["Base"],"(no title)":["(nessun titolo)"],"Select a Form":["Seleziona un modulo"],"No forms found\u2026":["Nessun modulo trovato\u2026"],"Choose":["Scegli"],"Create New":["Crea Nuovo"],"Change Form":["Modifica modulo"],"This form has been deleted or is unavailable.":["Questo modulo \u00e8 stato eliminato o non \u00e8 disponibile."],"Form Settings":["Impostazioni del modulo"],"Show Form Title on this Page":["Mostra il titolo del modulo su questa pagina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Nota: Per modificare i SureForms, fare riferimento all'Editor di SureForms -"],"Field preview":["Anteprima del campo"],"General":["Generale"],"Style":["Stile"],"Advanced":["Avanzato"],"No tags available":["Nessun tag disponibile"],"Device":["Dispositivo"],"Select Shortcodes":["Seleziona i codici brevi"],"Page Break Label":["Etichetta di interruzione di pagina"],"Next":["Avanti"],"Back":["Indietro"],"Reset":["Reimposta"],"Generic tags":["Tag generici"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Seleziona unit\u00e0"],"%s units":["%s unit\u00e0"],"Margin":["Margine"],"Attributes":["Attributi"],"Input Pattern":["Schema di input"],"None":["Nessuno"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personalizzato"],"Custom Mask":["Maschera personalizzata"],"Please check the documentation to manage custom input pattern ":["Si prega di controllare la documentazione per gestire il modello di input personalizzato"],"here":["qui"],"Default Value":["Valore predefinito"],"Error Message":["Messaggio di errore"],"Help Text":["Testo di aiuto"],"Number Format":["Formato numero"],"US Style (Eg: 9,999.99)":["Stile USA (Es: 9.999,99)"],"EU Style (Eg: 9.999,99)":["Stile UE (Es: 9.999,99)"],"Minimum Value":["Valore minimo"],"Maximum Value":["Valore massimo"],"Please check the Minimum and Maximum value":["Si prega di controllare il valore minimo e massimo"],"Enable Email Confirmation":["Abilita la conferma email"],"Checked by Default":["Selezionato per impostazione predefinita"],"Error message":["Messaggio di errore"],"Checked by default":["Selezionato per impostazione predefinita"],"Please add a option props to MultiButtonsControl":["Si prega di aggiungere un'opzione props a MultiButtonsControl"],"Icon Library":["Libreria di icone"],"Close":["Chiudi"],"All Icons":["Tutte le icone"],"Other":["Altro"],"No Icons Found":["Nessuna icona trovata"],"Insert Icon":["Inserisci icona"],"Change Icon":["Cambia icona"],"Choose Icon":["Scegli icona"],"Confirm":["Conferma"],"Cancel":["Annulla"],"Processing\u2026":["Elaborazione\u2026"],"Select Video":["Seleziona video"],"Change Video":["Cambia video"],"Select Lottie Animation":["Seleziona animazione Lottie"],"Change Lottie Animation":["Cambia animazione Lottie"],"Upload SVG":["Carica SVG"],"Change SVG":["Cambia SVG"],"Select Image":["Seleziona immagine"],"Change Image":["Cambia immagine"],"Upload SVG?":["Caricare SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Caricare SVG pu\u00f2 essere potenzialmente rischioso. Sei sicuro?"],"Upload Anyway":["Carica comunque"],"Bulk Add":["Aggiunta in blocco"],"Bulk Add Options":["Aggiungi opzioni in blocco"],"Enter each option on a new line.":["Inserisci ogni opzione su una nuova riga."],"Insert Options":["Inserisci opzioni"],"Full Width":["Larghezza completa"],"Option Type":["Tipo di opzione"],"Edit Options":["Opzioni di modifica"],"Add New Option":["Aggiungi nuova opzione"],"ADD":["AGGIUNGI"],"Enable Auto Country Detection":["Abilita il rilevamento automatico del paese"],"%s Width":["Larghezza %s"],"Upgrade":["Aggiornamento"],"Clear":["Chiaro"],"Select Color":["Seleziona colore"],"Primary Color":["Colore primario"],"Text Color":["Colore del testo"],"Field Spacing":["Spaziatura del campo"],"Small":["Piccolo"],"Large":["Grande"],"Left":["Sinistra"],"Center":["Centro"],"Right":["Destra"],"Color":["Colore"],"Background Color":["Colore di sfondo"],"Auto":["Auto"],"Default":["Predefinito"],"Normal":["Normale"],"%":["%"],"Top":["In alto"],"Bottom":["Fondo"],"Width":["Larghezza"],"Size":["Dimensione"],"EM":["EM"],"Padding":["Riempimento"],"Color 1":["Colore 1"],"Color 2":["Colore 2"],"Type":["Tipo"],"Linear":["Lineare"],"Radial":["Radiale"],"Location 1":["Posizione 1"],"Location 2":["Posizione 2"],"Angle":["Angolo"],"Classic":["Classico"],"Gradient":["Gradiente"],"Horizontal":["Orizzontale"],"Vertical":["Verticale"],"Background":["Sfondo"],"Cover":["Copertina"],"Contain":["Contenere"],"Layout":["Layout"],"Overlay":["Sovrapposizione"],"No Repeat":["Nessuna ripetizione"],"Overlay Opacity":["Opacit\u00e0 dell'overlay"],"Conditional Logic":["Logica Condizionale"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Passa al piano Starter di SureForms per creare moduli dinamici che si adattano in base all'input dell'utente, offrendo un'esperienza modulare personalizzata ed efficiente."],"Enable Conditional Logic":["Abilita la logica condizionale"],"this field if":["questo campo se"],"Configure Conditions":["Configura condizioni"],"Premium":["Premium"],"Overlay Type":["Tipo di sovrapposizione"],"Image Overlay Color":["Colore di sovrapposizione dell'immagine"],"Image Position":["Posizione dell'immagine"],"Attachment":["Allegato"],"Fixed":["Fisso"],"Blend Mode":["Modalit\u00e0 di fusione"],"Multiply":["Moltiplica"],"Screen":["Schermo"],"Darken":["Scurisci"],"Lighten":["Alleggerire"],"Color Dodge":["Schiarisci colore"],"Saturation":["Saturazione"],"Repeat-x":["Ripeti-x"],"Repeat-y":["Ripeti-y"],"PX":["PX"],"Button":["Pulsante"],"Prefix Label":["Etichetta prefisso"],"Suffix Label":["Etichetta suffisso"],"Border Radius":["Raggio del bordo"],"Form Theme":["Tema del modulo"],"Select Gradient":["Seleziona sfumatura"],"Unlock Conditional Logic Editor":["Sblocca l'editor di logica condizionale"],"Rich Text Editor":["Editor di testo ricco"],"Read Only":["Solo lettura"],"Select Country":["Seleziona Paese"],"Default Country":["Paese predefinito"],"Subscription":["Abbonamento"],"One Time":["Una volta"],"Unique Entry":["Ingresso Unico"],"Maximum Characters":["Caratteri massimi"],"Textarea Height":["Altezza dell'area di testo"],"Minimum Selections":["Selezioni Minime"],"Maximum Selections":["Selezioni massime"],"Add Numeric Values to Options":["Aggiungi valori numerici alle opzioni"],"Single Choice Only":["Solo una scelta"],"Enable Dropdown Search":["Abilita la ricerca a discesa"],"Allow Multiple":["Consenti multipli"],"%1$s fields are required. Please configure these fields in the block settings.":["I campi %1$s sono obbligatori. Si prega di configurare questi campi nelle impostazioni del blocco."],"%1$s field is required. Please configure this field in the block settings.":["Il campo %1$s \u00e8 obbligatorio. Si prega di configurare questo campo nelle impostazioni del blocco."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["\u00c8 necessario configurare un account di pagamento per raccogliere i pagamenti da questo modulo. Si prega di configurare il proprio fornitore di pagamento per procedere."],"Configure Payment Account":["Configura l'account di pagamento"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Questo \u00e8 un segnaposto per il blocco di pagamento. I campi di pagamento effettivi per il\/i fornitore\/i di pagamento configurato\/i appariranno solo quando visualizzi in anteprima o pubblichi il modulo."],"2 Payments":["2 Pagamenti"],"3 Payments":["3 Pagamenti"],"4 Payments":["4 Pagamenti"],"5 Payments":["5 Pagamenti"],"Never":["Mai"],"Stop Subscription After":["Interrompi l'abbonamento dopo"],"Choose when to automatically stop the subscription":["Scegli quando interrompere automaticamente l'abbonamento"],"Number of Payments":["Numero di pagamenti"],"Enter a number between 1 to 100":["Inserisci un numero tra 1 e 100"],"Form Field":["Campo del modulo"],"Payment Type":["Tipo di pagamento"],"Subscription Plan Name":["Nome del piano di abbonamento"],"Billing Interval":["Intervallo di fatturazione"],"Daily":["Quotidiano"],"Weekly":["Settimanale"],"Monthly":["Mensile"],"Quarterly":["Trimestrale"],"Yearly":["Annuale"],"Amount Type":["Tipo di importo"],"Fixed Amount":["Importo fisso"],"Dynamic Amount":["Importo Dinamico"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Scegli se addebitare un importo fisso o addebitare l'importo in base all'input dell'utente in altri campi del modulo."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Imposta l'importo esatto che desideri addebitare. Gli utenti non potranno modificarlo"],"Choose Amount Field":["Scegli il campo Importo"],"Select a field\u2026":["Seleziona un campo\u2026"],"Minimum Amount":["Importo minimo"],"Set the minimum amount users can enter (0 for no minimum)":["Imposta l'importo minimo che gli utenti possono inserire (0 per nessun minimo)"],"Customer Name Field (Required)":["Campo Nome Cliente (Obbligatorio)"],"Customer Name Field (Optional)":["Campo Nome Cliente (Facoltativo)"],"Select the input field that contains the customer name (Required for subscriptions)":["Seleziona il campo di input che contiene il nome del cliente (Richiesto per gli abbonamenti)"],"Select the input field that contains the customer name":["Seleziona il campo di input che contiene il nome del cliente"],"Customer Email Field (Required)":["Campo Email Cliente (Obbligatorio)"],"Select the email field that contains the customer email":["Seleziona il campo email che contiene l'email del cliente"],"Payment":["Pagamento"],"%s - Order ID":["%s - ID Ordine"],"%s - Amount":["%s - Importo"],"%s - Customer Email":["%s - Email del cliente"],"%s - Customer Name":["%s - Nome del cliente"],"%s - Status":["%s - Stato"],"Button Alignment":["Allineamento del pulsante"],"Placeholder":["Segnaposto"],"Preselect this option":["Preseleziona questa opzione"],"Restrict Country Codes":["Limita i codici paese"],"Restriction Type":["Tipo di restrizione"],"Allow":["Permetti"],"Block":["Blocca"],"Select Allowed Countries":["Seleziona i Paesi consentiti"],"Choose countries\u2026":["Scegli i paesi\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Scegli quali codici paese gli utenti possono selezionare nel campo del numero di telefono. Lascia vuoto per consentire tutti i codici paese."],"Select Blocked Countries":["Seleziona Paesi Bloccati"],"These countries will be hidden from the dropdown.":["Questi paesi saranno nascosti dal menu a tendina."],"Bulk Edit":["Modifica in blocco"],"Select Layout":["Seleziona layout"],"Number of Columns":["Numero di colonne"],"Validation Message for Duplicate":["Messaggio di convalida per duplicato"],"Click here to insert a form":["Fai clic qui per inserire un modulo"],"Inherit Form's Original Style":["Eredita lo stile originale del modulo"],"Text on Primary":["Testo su Primario"],"%s - Description":["%s - Descrizione"],"Upgrade to Unlock":["Aggiorna per sbloccare"],"Custom (Premium)":["Personalizzato (Premium)"],"Select a theme style for this form embed.":["Seleziona uno stile tema per questo modulo incorporato."],"Colors":["Colori"],"Advanced Styling":["Stile avanzato"],"Unlock Custom Styling":["Sblocca lo stile personalizzato"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Passa alla Modalit\u00e0 Personalizzata per avere il pieno controllo del design e della spaziatura del tuo modulo."],"Full color control (buttons, fields, text)":["Controllo completo del colore (bottoni, campi, testo)"],"Row and column gap control":["Controllo dello spazio tra righe e colonne"],"Field spacing and layout precision":["Spaziatura dei campi e precisione del layout"],"Complete button styling":["Completare lo stile del pulsante"],"Payment Description":["Descrizione del pagamento"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Mostrato sulle ricevute di pagamento e nel tuo cruscotto dei pagamenti (Stripe e PayPal). Lascia vuoto per utilizzare il predefinito."],"Slug":["Lumaca"],"Auto-generated on save":["Generato automaticamente al salvataggio"],"This slug is already used by another field. It will revert to the previous value.":["Questo slug \u00e8 gi\u00e0 utilizzato da un altro campo. Torner\u00e0 al valore precedente."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["La modifica dello slug potrebbe interrompere l'invio dei moduli, la logica condizionale, le integrazioni o qualsiasi altra funzione che attualmente fa riferimento a questo slug. Dovrai aggiornare manualmente tutti questi riferimenti."],"Field Slug":["Slug del campo"],"Location Services":["Servizi di localizzazione"],"Unlock Address Autocomplete":["Sblocca il completamento automatico degli indirizzi"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Aggiorna per abilitare il completamento automatico degli indirizzi di Google con l'anteprima interattiva della mappa, rendendo l'inserimento degli indirizzi pi\u00f9 veloce e preciso per i tuoi utenti."],"Enable Google Autocomplete":["Abilita il completamento automatico di Google"],"Show Interactive Map":["Mostra mappa interattiva"],"Payments Per Page":["Pagamenti per pagina"],"Show Subscriptions Section":["Mostra la sezione Abbonamenti"],"Show a dedicated subscriptions section above payment history.":["Mostra una sezione dedicata agli abbonamenti sopra la cronologia dei pagamenti."],"Payment Dashboard":["Dashboard dei pagamenti"],"View your payments and manage subscriptions in a single dashboard.":["Visualizza i tuoi pagamenti e gestisci gli abbonamenti in un'unica dashboard."],"Dynamic Default Value":["Valore predefinito dinamico"],"Minimum Characters":["Caratteri Minimi"],"Minimum characters cannot exceed Maximum characters.":["I caratteri minimi non possono superare i caratteri massimi."],"Both":["Entrambi"],"One-Time Label":["Etichetta monouso"],"Label shown to users for the one-time payment option.":["Etichetta mostrata agli utenti per l'opzione di pagamento una tantum."],"Subscription Label":["Etichetta di abbonamento"],"Label shown to users for the subscription option.":["Etichetta mostrata agli utenti per l'opzione di abbonamento."],"Default Selection":["Selezione predefinita"],"Which option is pre-selected when the form loads.":["Quale opzione \u00e8 preselezionata quando il modulo viene caricato."],"One-Time Amount Type":["Tipo di importo una tantum"],"Set how the one-time payment amount is determined.":["Imposta come viene determinato l'importo del pagamento una tantum."],"One-Time Fixed Amount":["Importo fisso una tantum"],"Amount charged for a one-time payment.":["Importo addebitato per un pagamento una tantum."],"One-Time Amount Field":["Campo Importo Una Tantum"],"Pick a form field whose value determines the one-time payment amount.":["Scegli un campo del modulo il cui valore determina l'importo del pagamento una tantum."],"One-Time Minimum Amount":["Importo minimo una tantum"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Importo minimo che gli utenti possono inserire per un pagamento una tantum (0 per nessun minimo)."],"Subscription Amount Type":["Tipo di importo dell'abbonamento"],"Set how the subscription amount is determined.":["Imposta come viene determinato l'importo dell'abbonamento."],"Subscription Fixed Amount":["Importo fisso dell'abbonamento"],"Recurring amount charged per billing interval.":["Importo ricorrente addebitato per intervallo di fatturazione."],"Subscription Amount Field":["Campo Importo Abbonamento"],"Pick a form field whose value determines the subscription amount.":["Scegli un campo del modulo il cui valore determina l'importo dell'abbonamento."],"Subscription Minimum Amount":["Importo minimo di sottoscrizione"],"Minimum amount users can enter for subscription (0 for no minimum).":["Importo minimo che gli utenti possono inserire per l'abbonamento (0 per nessun minimo)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Scegli un campo dal tuo modulo come un numero, un menu a tendina, una scelta multipla o nascosto il cui valore dovrebbe determinare l'importo del pagamento."]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Impostazioni"],"Search":["Cerca"],"Fields":["Campi"],"Image":["Immagine"],"Submit":["Invia"],"Required":["Richiesto"],"Form Title":["Titolo del modulo"],"Show":["Mostra"],"Hide":["Nascondi"],"Edit Form":["Modifica modulo"],"Icon":["Icona"],"Desktop":["Desktop"],"Medium":["Medio"],"Mobile":["Cellulare"],"Repeat":["Ripeti"],"Scroll":["Scorri"],"Tablet":["Tablet"],"Basic":["Base"],"(no title)":["(nessun titolo)"],"Select a Form":["Seleziona un modulo"],"No forms found\u2026":["Nessun modulo trovato\u2026"],"Choose":["Scegli"],"Create New":["Crea Nuovo"],"Change Form":["Modifica modulo"],"This form has been deleted or is unavailable.":["Questo modulo \u00e8 stato eliminato o non \u00e8 disponibile."],"Form Settings":["Impostazioni del modulo"],"Show Form Title on this Page":["Mostra il titolo del modulo su questa pagina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Nota: Per modificare i SureForms, fare riferimento all'Editor di SureForms -"],"Field preview":["Anteprima del campo"],"General":["Generale"],"Style":["Stile"],"Advanced":["Avanzato"],"No tags available":["Nessun tag disponibile"],"Device":["Dispositivo"],"Select Shortcodes":["Seleziona i codici brevi"],"Page Break Label":["Etichetta di interruzione di pagina"],"Next":["Avanti"],"Back":["Indietro"],"Reset":["Reimposta"],"Generic tags":["Tag generici"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Seleziona unit\u00e0"],"%s units":["%s unit\u00e0"],"Margin":["Margine"],"Attributes":["Attributi"],"Input Pattern":["Schema di input"],"None":["Nessuno"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personalizzato"],"Custom Mask":["Maschera personalizzata"],"Please check the documentation to manage custom input pattern ":["Si prega di controllare la documentazione per gestire il modello di input personalizzato"],"here":["qui"],"Default Value":["Valore predefinito"],"Error Message":["Messaggio di errore"],"Help Text":["Testo di aiuto"],"Number Format":["Formato numero"],"US Style (Eg: 9,999.99)":["Stile USA (Es: 9.999,99)"],"EU Style (Eg: 9.999,99)":["Stile UE (Es: 9.999,99)"],"Minimum Value":["Valore minimo"],"Maximum Value":["Valore massimo"],"Please check the Minimum and Maximum value":["Si prega di controllare il valore minimo e massimo"],"Enable Email Confirmation":["Abilita la conferma email"],"Checked by Default":["Selezionato per impostazione predefinita"],"Error message":["Messaggio di errore"],"Checked by default":["Selezionato per impostazione predefinita"],"Please add a option props to MultiButtonsControl":["Si prega di aggiungere un'opzione props a MultiButtonsControl"],"Icon Library":["Libreria di icone"],"Close":["Chiudi"],"All Icons":["Tutte le icone"],"Other":["Altro"],"No Icons Found":["Nessuna icona trovata"],"Insert Icon":["Inserisci icona"],"Change Icon":["Cambia icona"],"Choose Icon":["Scegli icona"],"Confirm":["Conferma"],"Cancel":["Annulla"],"Processing\u2026":["Elaborazione\u2026"],"Select Video":["Seleziona video"],"Change Video":["Cambia video"],"Select Lottie Animation":["Seleziona animazione Lottie"],"Change Lottie Animation":["Cambia animazione Lottie"],"Upload SVG":["Carica SVG"],"Change SVG":["Cambia SVG"],"Select Image":["Seleziona immagine"],"Change Image":["Cambia immagine"],"Upload SVG?":["Caricare SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Caricare SVG pu\u00f2 essere potenzialmente rischioso. Sei sicuro?"],"Upload Anyway":["Carica comunque"],"Bulk Add":["Aggiunta in blocco"],"Bulk Add Options":["Aggiungi opzioni in blocco"],"Enter each option on a new line.":["Inserisci ogni opzione su una nuova riga."],"Insert Options":["Inserisci opzioni"],"Full Width":["Larghezza completa"],"Option Type":["Tipo di opzione"],"Edit Options":["Opzioni di modifica"],"Add New Option":["Aggiungi nuova opzione"],"ADD":["AGGIUNGI"],"Enable Auto Country Detection":["Abilita il rilevamento automatico del paese"],"%s Width":["Larghezza %s"],"Upgrade":["Aggiornamento"],"Clear":["Chiaro"],"Select Color":["Seleziona colore"],"Primary Color":["Colore primario"],"Text Color":["Colore del testo"],"Field Spacing":["Spaziatura del campo"],"Small":["Piccolo"],"Large":["Grande"],"Left":["Sinistra"],"Center":["Centro"],"Right":["Destra"],"Color":["Colore"],"Background Color":["Colore di sfondo"],"Auto":["Auto"],"Default":["Predefinito"],"Normal":["Normale"],"%":["%"],"Top":["In alto"],"Bottom":["Fondo"],"Width":["Larghezza"],"Size":["Dimensione"],"EM":["EM"],"Padding":["Riempimento"],"Color 1":["Colore 1"],"Color 2":["Colore 2"],"Type":["Tipo"],"Linear":["Lineare"],"Radial":["Radiale"],"Location 1":["Posizione 1"],"Location 2":["Posizione 2"],"Angle":["Angolo"],"Classic":["Classico"],"Gradient":["Gradiente"],"Horizontal":["Orizzontale"],"Vertical":["Verticale"],"Background":["Sfondo"],"Cover":["Copertina"],"Contain":["Contenere"],"Layout":["Layout"],"Overlay":["Sovrapposizione"],"No Repeat":["Nessuna ripetizione"],"Overlay Opacity":["Opacit\u00e0 dell'overlay"],"Conditional Logic":["Logica Condizionale"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Passa al piano Starter di SureForms per creare moduli dinamici che si adattano in base all'input dell'utente, offrendo un'esperienza modulare personalizzata ed efficiente."],"Enable Conditional Logic":["Abilita la logica condizionale"],"this field if":["questo campo se"],"Configure Conditions":["Configura condizioni"],"Premium":["Premium"],"Overlay Type":["Tipo di sovrapposizione"],"Image Overlay Color":["Colore di sovrapposizione dell'immagine"],"Image Position":["Posizione dell'immagine"],"Attachment":["Allegato"],"Fixed":["Fisso"],"Blend Mode":["Modalit\u00e0 di fusione"],"Multiply":["Moltiplica"],"Screen":["Schermo"],"Darken":["Scurisci"],"Lighten":["Alleggerire"],"Color Dodge":["Schiarisci colore"],"Saturation":["Saturazione"],"Repeat-x":["Ripeti-x"],"Repeat-y":["Ripeti-y"],"PX":["PX"],"Button":["Pulsante"],"Prefix Label":["Etichetta prefisso"],"Suffix Label":["Etichetta suffisso"],"Border Radius":["Raggio del bordo"],"Form Theme":["Tema del modulo"],"Select Gradient":["Seleziona sfumatura"],"Unlock Conditional Logic Editor":["Sblocca l'editor di logica condizionale"],"Rich Text Editor":["Editor di testo ricco"],"Read Only":["Solo lettura"],"Select Country":["Seleziona Paese"],"Default Country":["Paese predefinito"],"Subscription":["Abbonamento"],"One Time":["Una volta"],"Unique Entry":["Ingresso Unico"],"Maximum Characters":["Caratteri massimi"],"Textarea Height":["Altezza dell'area di testo"],"Minimum Selections":["Selezioni Minime"],"Maximum Selections":["Selezioni massime"],"Add Numeric Values to Options":["Aggiungi valori numerici alle opzioni"],"Single Choice Only":["Solo una scelta"],"Enable Dropdown Search":["Abilita la ricerca a discesa"],"Allow Multiple":["Consenti multipli"],"%1$s fields are required. Please configure these fields in the block settings.":["I campi %1$s sono obbligatori. Si prega di configurare questi campi nelle impostazioni del blocco."],"%1$s field is required. Please configure this field in the block settings.":["Il campo %1$s \u00e8 obbligatorio. Si prega di configurare questo campo nelle impostazioni del blocco."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["\u00c8 necessario configurare un account di pagamento per raccogliere i pagamenti da questo modulo. Si prega di configurare il proprio fornitore di pagamento per procedere."],"Configure Payment Account":["Configura l'account di pagamento"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Questo \u00e8 un segnaposto per il blocco di pagamento. I campi di pagamento effettivi per il\/i fornitore\/i di pagamento configurato\/i appariranno solo quando visualizzi in anteprima o pubblichi il modulo."],"2 Payments":["2 Pagamenti"],"3 Payments":["3 Pagamenti"],"4 Payments":["4 Pagamenti"],"5 Payments":["5 Pagamenti"],"Never":["Mai"],"Stop Subscription After":["Interrompi l'abbonamento dopo"],"Choose when to automatically stop the subscription":["Scegli quando interrompere automaticamente l'abbonamento"],"Number of Payments":["Numero di pagamenti"],"Enter a number between 1 to 100":["Inserisci un numero tra 1 e 100"],"Form Field":["Campo del modulo"],"Payment Type":["Tipo di pagamento"],"Subscription Plan Name":["Nome del piano di abbonamento"],"Billing Interval":["Intervallo di fatturazione"],"Daily":["Quotidiano"],"Weekly":["Settimanale"],"Monthly":["Mensile"],"Quarterly":["Trimestrale"],"Yearly":["Annuale"],"Amount Type":["Tipo di importo"],"Fixed Amount":["Importo fisso"],"Dynamic Amount":["Importo Dinamico"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Scegli se addebitare un importo fisso o addebitare l'importo in base all'input dell'utente in altri campi del modulo."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Imposta l'importo esatto che desideri addebitare. Gli utenti non potranno modificarlo"],"Choose Amount Field":["Scegli il campo Importo"],"Select a field\u2026":["Seleziona un campo\u2026"],"Minimum Amount":["Importo minimo"],"Set the minimum amount users can enter (0 for no minimum)":["Imposta l'importo minimo che gli utenti possono inserire (0 per nessun minimo)"],"Customer Name Field (Required)":["Campo Nome Cliente (Obbligatorio)"],"Customer Name Field (Optional)":["Campo Nome Cliente (Facoltativo)"],"Select the input field that contains the customer name (Required for subscriptions)":["Seleziona il campo di input che contiene il nome del cliente (Richiesto per gli abbonamenti)"],"Select the input field that contains the customer name":["Seleziona il campo di input che contiene il nome del cliente"],"Customer Email Field (Required)":["Campo Email Cliente (Obbligatorio)"],"Select the email field that contains the customer email":["Seleziona il campo email che contiene l'email del cliente"],"Payment":["Pagamento"],"%s - Order ID":["%s - ID Ordine"],"%s - Amount":["%s - Importo"],"%s - Customer Email":["%s - Email del cliente"],"%s - Customer Name":["%s - Nome del cliente"],"%s - Status":["%s - Stato"],"Button Alignment":["Allineamento del pulsante"],"Placeholder":["Segnaposto"],"Preselect this option":["Preseleziona questa opzione"],"Restrict Country Codes":["Limita i codici paese"],"Restriction Type":["Tipo di restrizione"],"Allow":["Permetti"],"Block":["Blocca"],"Select Allowed Countries":["Seleziona i Paesi consentiti"],"Choose countries\u2026":["Scegli i paesi\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Scegli quali codici paese gli utenti possono selezionare nel campo del numero di telefono. Lascia vuoto per consentire tutti i codici paese."],"Select Blocked Countries":["Seleziona Paesi Bloccati"],"These countries will be hidden from the dropdown.":["Questi paesi saranno nascosti dal menu a tendina."],"Bulk Edit":["Modifica in blocco"],"Select Layout":["Seleziona layout"],"Number of Columns":["Numero di colonne"],"Validation Message for Duplicate":["Messaggio di convalida per duplicato"],"Click here to insert a form":["Fai clic qui per inserire un modulo"],"Inherit Form's Original Style":["Eredita lo stile originale del modulo"],"Text on Primary":["Testo su Primario"],"%s - Description":["%s - Descrizione"],"Upgrade to Unlock":["Aggiorna per sbloccare"],"Custom (Premium)":["Personalizzato (Premium)"],"Select a theme style for this form embed.":["Seleziona uno stile tema per questo modulo incorporato."],"Colors":["Colori"],"Advanced Styling":["Stile avanzato"],"Unlock Custom Styling":["Sblocca lo stile personalizzato"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Passa alla Modalit\u00e0 Personalizzata per avere il pieno controllo del design e della spaziatura del tuo modulo."],"Full color control (buttons, fields, text)":["Controllo completo del colore (bottoni, campi, testo)"],"Row and column gap control":["Controllo dello spazio tra righe e colonne"],"Field spacing and layout precision":["Spaziatura dei campi e precisione del layout"],"Complete button styling":["Completare lo stile del pulsante"],"Payment Description":["Descrizione del pagamento"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Mostrato sulle ricevute di pagamento e nel tuo cruscotto dei pagamenti (Stripe e PayPal). Lascia vuoto per utilizzare il predefinito."],"Slug":["Lumaca"],"Auto-generated on save":["Generato automaticamente al salvataggio"],"This slug is already used by another field. It will revert to the previous value.":["Questo slug \u00e8 gi\u00e0 utilizzato da un altro campo. Torner\u00e0 al valore precedente."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["La modifica dello slug potrebbe interrompere l'invio dei moduli, la logica condizionale, le integrazioni o qualsiasi altra funzione che attualmente fa riferimento a questo slug. Dovrai aggiornare manualmente tutti questi riferimenti."],"Field Slug":["Slug del campo"],"Location Services":["Servizi di localizzazione"],"Unlock Address Autocomplete":["Sblocca il completamento automatico degli indirizzi"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Aggiorna per abilitare il completamento automatico degli indirizzi di Google con l'anteprima interattiva della mappa, rendendo l'inserimento degli indirizzi pi\u00f9 veloce e preciso per i tuoi utenti."],"Enable Google Autocomplete":["Abilita il completamento automatico di Google"],"Show Interactive Map":["Mostra mappa interattiva"],"Payments Per Page":["Pagamenti per pagina"],"Show Subscriptions Section":["Mostra la sezione Abbonamenti"],"Show a dedicated subscriptions section above payment history.":["Mostra una sezione dedicata agli abbonamenti sopra la cronologia dei pagamenti."],"Payment Dashboard":["Dashboard dei pagamenti"],"View your payments and manage subscriptions in a single dashboard.":["Visualizza i tuoi pagamenti e gestisci gli abbonamenti in un'unica dashboard."],"Dynamic Default Value":["Valore predefinito dinamico"],"Minimum Characters":["Caratteri Minimi"],"Minimum characters cannot exceed Maximum characters.":["I caratteri minimi non possono superare i caratteri massimi."],"Both":["Entrambi"],"One-Time Label":["Etichetta monouso"],"Label shown to users for the one-time payment option.":["Etichetta mostrata agli utenti per l'opzione di pagamento una tantum."],"Subscription Label":["Etichetta di abbonamento"],"Label shown to users for the subscription option.":["Etichetta mostrata agli utenti per l'opzione di abbonamento."],"Default Selection":["Selezione predefinita"],"Which option is pre-selected when the form loads.":["Quale opzione \u00e8 preselezionata quando il modulo viene caricato."],"One-Time Amount Type":["Tipo di importo una tantum"],"Set how the one-time payment amount is determined.":["Imposta come viene determinato l'importo del pagamento una tantum."],"One-Time Fixed Amount":["Importo fisso una tantum"],"Amount charged for a one-time payment.":["Importo addebitato per un pagamento una tantum."],"One-Time Amount Field":["Campo Importo Una Tantum"],"Pick a form field whose value determines the one-time payment amount.":["Scegli un campo del modulo il cui valore determina l'importo del pagamento una tantum."],"One-Time Minimum Amount":["Importo minimo una tantum"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Importo minimo che gli utenti possono inserire per un pagamento una tantum (0 per nessun minimo)."],"Subscription Amount Type":["Tipo di importo dell'abbonamento"],"Set how the subscription amount is determined.":["Imposta come viene determinato l'importo dell'abbonamento."],"Subscription Fixed Amount":["Importo fisso dell'abbonamento"],"Recurring amount charged per billing interval.":["Importo ricorrente addebitato per intervallo di fatturazione."],"Subscription Amount Field":["Campo Importo Abbonamento"],"Pick a form field whose value determines the subscription amount.":["Scegli un campo del modulo il cui valore determina l'importo dell'abbonamento."],"Subscription Minimum Amount":["Importo minimo di sottoscrizione"],"Minimum amount users can enter for subscription (0 for no minimum).":["Importo minimo che gli utenti possono inserire per l'abbonamento (0 per nessun minimo)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Scegli un campo dal tuo modulo come un numero, un menu a tendina, una scelta multipla o nascosto il cui valore dovrebbe determinare l'importo del pagamento."],"Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.":["Usa un tag intelligente come {get_input:country}. La prima opzione il cui titolo corrisponde al valore risolto sar\u00e0 preselezionata."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.":["Usa un tag intelligente come {get_input:colors} e passa valori separati da pipe nell'URL (ad esempio ?colors=Red|Blue). Ogni opzione il cui titolo corrisponde a un valore sar\u00e0 selezionata. Puoi anche concatenare pi\u00f9 tag intelligenti separati da pipe."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.":["Usa un tag intelligente come {get_input:colors} e passa valori separati da pipe nell'URL (ad esempio ?colors=Red|Blue). Ogni opzione il cui etichetta corrisponde a un valore sar\u00e0 preselezionata. Puoi anche concatenare pi\u00f9 tag intelligenti separati da pipe."],"Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.":["Usa un tag intelligente come {get_input:country}. La prima opzione il cui etichetta corrisponde al valore risolto sar\u00e0 preselezionata."]}}} \ No newline at end of file diff --git a/languages/sureforms-it_IT-51635fe6489fc8288d603fe596c755ca.json b/languages/sureforms-it_IT-51635fe6489fc8288d603fe596c755ca.json index a090ecf27..7e65d97ef 100644 --- a/languages/sureforms-it_IT-51635fe6489fc8288d603fe596c755ca.json +++ b/languages/sureforms-it_IT-51635fe6489fc8288d603fe596c755ca.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Cruscotto"],"Settings":["Impostazioni"],"Entries":["Voci"],"Activated":["Attivato"],"Activate":["Attiva"],"Monday":["Luned\u00ec"],"Forms":["Moduli"],"GitHub":["GitHub"],"General":["Generale"],"Other":["Altro"],"Confirm":["Conferma"],"Cancel":["Annulla"],"Install":["Installa"],"Plugin Installation failed, Please try again later.":["Installazione del plugin fallita, per favore riprova pi\u00f9 tardi."],"Plugin activation failed, Please try again later.":["Attivazione del plugin fallita, riprova pi\u00f9 tardi."],"Integrations":["Integrazioni"],"What's New?":["Novit\u00e0?"],"Core":["Nucleo"],"Unlicensed":["Senza licenza"],"Connecting\u2026":["Connessione in corso\u2026"],"Install & Activate":["Installa e attiva"],"Send Email To":["Invia email a"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisibile"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Convalide"],"Spam Protection":["Protezione antispam"],"Email Summaries":["Riepiloghi email"],"Tuesday":["Marted\u00ec"],"Wednesday":["Mercoled\u00ec"],"Thursday":["Gioved\u00ec"],"Friday":["Venerd\u00ec"],"Saturday":["Sabato"],"Sunday":["Domenica"],"Test Email":["Email di prova"],"Schedule Reports":["Programma rapporti"],"IP Logging":["Registrazione IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Se questa opzione \u00e8 attivata, l'indirizzo IP dell'utente verr\u00e0 salvato con i dati del modulo"],"Confirmation Email Mismatch Message":["Messaggio di mancata corrispondenza dell'email di conferma"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s rappresenta il valore minimo di input. Ad esempio: \"Il valore minimo \u00e8 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s rappresenta il valore massimo di input. Ad esempio: \"Il valore massimo \u00e8 100.\""],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s rappresenta le selezioni minime necessarie. Ad esempio: \"Sono necessarie almeno 2 selezioni.\""],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s rappresenta il numero massimo di selezioni consentite. Ad esempio: \"Sono consentite al massimo 4 selezioni.\""],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s rappresenta le scelte minime necessarie. Ad esempio: \"\u00c8 richiesta almeno 1 selezione.\""],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s rappresenta il numero massimo di scelte consentite. Ad esempio: \"Sono consentite un massimo di 3 selezioni.\""]," Error Message":["Messaggio di errore"],"Auto":["Auto"],"Light":["Luce"],"Dark":["Scuro"],"Turnstile":["Tornello"],"Honeypot":["Trappola"],"Get Keys":["Ottieni chiavi"],"Documentation":["Documentazione"],"Site Key":["Chiave del sito"],"Secret Key":["Chiave segreta"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Modalit\u00e0 Aspetto"],"Enable Honeypot Security":["Abilita la Sicurezza Honeypot"],"Enable Honeypot Security for better spam protection":["Abilita la Sicurezza Honeypot per una migliore protezione dallo spam"],"This field cannot be left blank.":["Questo campo non pu\u00f2 essere lasciato vuoto."],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connettiti con OttoKit"],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Pronto a superare il piano gratuito?"],"Upgrade now":["Aggiorna ora"],"and unlock the full power of SureForms!":["e sblocca tutta la potenza di SureForms!"],"Upgrade SureForms":["Aggiorna SureForms"],"Upgrade Now":["Aggiorna ora"],"Form Validation":["Validazione del modulo"],"Required Error Messages":["Messaggi di errore richiesti"],"Other Error Messages":["Altri messaggi di errore"],"Input Field Unique":["Campo di input univoco"],"Email Field Unique":["Campo email univoco"],"Invalid URL":["URL non valido"],"Phone Field Unique":["Campo Telefono Unico"],"Invalid Field Number Block":["Blocco Numero Campo Non Valido"],"Invalid Email":["Email non valido"],"Number Minimum Value":["Valore Minimo Numero"],"Number Maximum Value":["Valore Massimo Numero"],"Dropdown Minimum Selections":["Selezioni Minime del Menu a Tendina"],"Dropdown Maximum Selections":["Selezioni massime del menu a tendina"],"Multiple Choice Minimum Selections":["Selezioni Minime a Scelta Multipla"],"Multiple Choice Maximum Selections":["Selezioni massime a scelta multipla"],"Input Field":["Campo di input"],"Email Field":["Campo Email"],"URL Field":["Campo URL"],"Phone Field":["Campo Telefono"],"Textarea Field":["Campo di testo"],"Checkbox Field":["Campo di selezione"],"Dropdown Field":["Campo a discesa"],"Multiple Choice Field":["Campo a scelta multipla"],"Address Field":["Campo Indirizzo"],"Number Field":["Campo numerico"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Per abilitare la funzione reCAPTCHA su SureForms, attiva l'opzione reCAPTCHA nelle impostazioni dei tuoi blocchi e seleziona la versione. Aggiungi qui la chiave segreta e la chiave del sito di Google reCAPTCHA. reCAPTCHA verr\u00e0 aggiunto alla tua pagina nel front-end."],"Enter your %s here":["Inserisci qui il tuo %s"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Per abilitare hCAPTCHA, aggiungi la tua chiave del sito e la chiave segreta. Configura queste impostazioni all'interno del modulo individuale."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Per abilitare Cloudflare Turnstile, aggiungi la tua chiave del sito e la chiave segreta. Configura queste impostazioni all'interno del modulo individuale."],"Save":["Salva"],"Anonymous Analytics":["Analisi Anonime"],"Learn More":["Scopri di pi\u00f9"],"Admin Notification":["Notifica dell'amministratore"],"Enable Admin Notification":["Abilita la Notifica Amministratore"],"Admin notifications keep you informed about new form entries since your last visit.":["Le notifiche dell'amministratore ti tengono informato sui nuovi invii di moduli dalla tua ultima visita."],"Continue":["Continua"],"Get Started":["Inizia"],"Integration":["Integrazione"],"Connect Native Integrations with SureForms":["Collega le integrazioni native con SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Sblocca potenti integrazioni nel piano Premium per automatizzare i tuoi flussi di lavoro e collegare SureForms direttamente con i tuoi strumenti preferiti."],"Send form submissions straight to CRMs, email, and marketing platforms":["Invia le sottomissioni dei moduli direttamente ai CRM, email e piattaforme di marketing"],"Automate repetitive tasks with seamless data syncing":["Automatizza le attivit\u00e0 ripetitive con una sincronizzazione dei dati senza interruzioni"],"Access exclusive native integrations for faster workflows":["Accedi a integrazioni native esclusive per flussi di lavoro pi\u00f9 veloci"],"Payments":["Pagamenti"],"Stripe account disconnected successfully.":["Account Stripe disconnesso con successo."],"Failed to create webhook.":["Impossibile creare il webhook."],"Failed to connect to Stripe.":["Connessione a Stripe non riuscita."],"Webhook":["Webhook"],"Knowledge Base":["Base di conoscenza"],"What\u2019s New":["Novit\u00e0"],"delete":["elimina"],"Please type \"%s\" in the input box":["Per favore digita \"%s\" nella casella di input"],"To confirm, type \"%s\" in the box below:":["Per confermare, digita \"%s\" nella casella sottostante:"],"Type \"%s\"":["Digita \"%s\""],"Go to OttoKit Settings":["Vai alle Impostazioni di OttoKit"],"USD - US Dollar":["USD - Dollaro statunitense"],"Payment Mode":["Modalit\u00e0 di pagamento"],"Test Mode":["Modalit\u00e0 di test"],"Live Mode":["Modalit\u00e0 Live"],"General Settings":["Impostazioni generali"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Imposta i riepiloghi delle email, gli avvisi amministrativi e le preferenze sui dati per gestire i tuoi moduli con facilit\u00e0."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personalizza i messaggi di errore predefiniti mostrati quando gli utenti inviano voci di modulo non valide o incomplete."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Abilita la protezione antispam per i tuoi moduli utilizzando servizi CAPTCHA o la sicurezza honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Collega e gestisci i tuoi gateway di pagamento per accettare transazioni in modo sicuro attraverso i tuoi moduli."],"1% transaction and payment gateway fees apply.":["Si applicano commissioni di transazione e gateway di pagamento dell'1%."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Si applicano commissioni di transazione e gateway di pagamento del 2,9%. Attiva la licenza per ridurre le commissioni di transazione."],"2.9% transaction and payment gateway fees apply.":["Si applicano commissioni di transazione e gateway di pagamento del 2,9%."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Si prega di visitare %1$s, eliminare un webhook non utilizzato, quindi fare clic qui sotto per riprovare."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms non \u00e8 riuscito a creare un webhook perch\u00e9 il tuo account Stripe ha esaurito gli slot gratuiti. I webhook sono necessari per ricevere aggiornamenti sui pagamenti."],"Stripe Dashboard":["Dashboard di Stripe"],"Creating\u2026":["Creando\u2026"],"Create Webhook":["Crea Webhook"],"Successfully connected to Stripe!":["Connessione a Stripe riuscita!"],"Invalid response from server. Please try again.":["Risposta non valida dal server. Per favore riprova."],"Failed to disconnect Stripe account.":["Impossibile disconnettere l'account Stripe."],"Webhook created successfully!":["Webhook creato con successo!"],"Select Currency":["Seleziona valuta"],"Select the default currency for payment forms.":["Seleziona la valuta predefinita per i moduli di pagamento."],"Connection Status":["Stato della connessione"],"Disconnect Stripe Account":["Disconnetti l'account Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Sei sicuro di voler scollegare il tuo account Stripe? Questo interromper\u00e0 tutti i pagamenti attivi, gli abbonamenti e le transazioni dei moduli collegati a questo account."],"Disconnect":["Disconnetti"],"Disconnecting\u2026":["Disconnessione in corso\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook collegato con successo, tutti gli eventi di Stripe vengono tracciati."],"Connect your Stripe account to start accepting payments through your forms.":["Collega il tuo account Stripe per iniziare ad accettare pagamenti tramite i tuoi moduli."],"Connect to Stripe":["Connetti a Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Collegati in modo sicuro a Stripe con pochi clic per iniziare ad accettare pagamenti!"],"Payment Methods":["Metodi di pagamento"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["La modalit\u00e0 di test ti consente di elaborare pagamenti senza addebiti reali. Passa alla modalit\u00e0 Live per le transazioni effettive."],"General Payment Settings":["Impostazioni generali di pagamento"],"These settings apply to all payment gateways.":["Queste impostazioni si applicano a tutti i gateway di pagamento."],"Stripe Settings":["Impostazioni di Stripe"],"Left ($100)":["Sinistra ($100)"],"Right (100$)":["Destra (100$)"],"Left Space ($ 100)":["Spazio Sinistro ($ 100)"],"Right Space (100 $)":["Spazio destro (100 $)"],"Currency Sign Position":["Posizione del simbolo di valuta"],"Select the position of the currency symbol relative to the amount.":["Seleziona la posizione del simbolo della valuta rispetto all'importo."],"Learn":["Impara"],"Enable email summaries":["Abilita i riepiloghi email"],"Enable IP logging":["Abilita la registrazione IP"],"Turn on Admin Notification from here.":["Attiva la notifica amministratore da qui."],"Send entries to 100+ popular apps.":["Invia voci a oltre 100 app popolari."],"Build automated workflows that run instantly.":["Crea flussi di lavoro automatizzati che vengono eseguiti istantaneamente."],"Create custom app integrations using our Custom App feature.":["Crea integrazioni di app personalizzate utilizzando la nostra funzione App personalizzata."],"Keep your tools in sync automatically.":["Mantieni i tuoi strumenti sincronizzati automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Questo installer\u00e0 e attiver\u00e0 OttoKit sul tuo sito WordPress per abilitare le funzionalit\u00e0 di automazione."],"Automate Your Forms with OttoKit":["Automatizza i tuoi moduli con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ogni invio di modulo dovrebbe attivare qualcosa: un avviso Slack, un lead CRM, un'email di follow-up o una nuova riga in Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configura le autorizzazioni del client AI e le impostazioni del server MCP."],"View documentation":["Visualizza la documentazione"],"Copy to clipboard":["Copia negli appunti"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) o %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Codice Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (progetto) o ~\/.claude.json (globale)"],"Cursor":["Cursore"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (progetto) o settings.json > mcp.servers (globale)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml o config.json"],"Your client's MCP configuration file":["Il file di configurazione MCP del tuo cliente"],"Connect Your AI Client":["Collega il tuo client AI"],"AI Client":["Cliente AI"],"Create an Application Password \u2014 ":["Crea una Password per l'Applicazione \u2014"],"Open Application Passwords":["Apri Password Applicazioni"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Oppure usa questo comando CLI per aggiungere rapidamente il server (dovrai comunque impostare le variabili d'ambiente):"],"Copy the JSON config below into: ":["Copia la configurazione JSON qui sotto in:"],"Replace \"your-application-password\" with the password from Step 1.":["Sostituisci \"your-application-password\" con la password del Passo 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 l'endpoint MCP del tuo sito. WP_API_USERNAME \u2014 il tuo nome utente WordPress. WP_API_PASSWORD \u2014 la password dell'applicazione che hai generato."],"View setup docs":["Visualizza i documenti di configurazione"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Il plugin MCP Adapter \u00e8 installato ma non attivo. Attivalo per configurare le impostazioni MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Il plugin MCP Adapter \u00e8 necessario per connettere i client AI ai tuoi moduli. Scaricalo e installalo da GitHub, quindi attivalo."],"Download the latest release from":["Scarica l'ultima versione da"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installa il plugin tramite Plugin > Aggiungi nuovo plugin > Carica plugin."],"Activate the MCP Adapter plugin.":["Attiva il plugin dell'adattatore MCP."],"Activating\u2026":["Attivazione in corso\u2026"],"Activate MCP Adapter":["Attiva l'adattatore MCP"],"Download MCP Adapter":["Scarica l'adattatore MCP"],"Experimental":["Sperimentale"],"Enable Abilities":["Abilita Abilit\u00e0"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registra le abilit\u00e0 di SureForms con l'API Abilities di WordPress. Quando \u00e8 abilitato, i client AI possono elencare, leggere, creare, modificare e eliminare i tuoi moduli e le voci. Quando \u00e8 disabilitato, nessuna abilit\u00e0 \u00e8 registrata e i client AI non possono eseguire alcuna azione sui tuoi moduli."],"Abilities API \u2014 Edit":["API delle abilit\u00e0 \u2014 Modifica"],"Enable Edit Abilities":["Abilita le capacit\u00e0 di modifica"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Quando abilitato, i client AI possono creare nuovi moduli, aggiornare i titoli dei moduli, i campi e le impostazioni, duplicare i moduli e modificare gli stati delle voci. Quando disabilitato, queste capacit\u00e0 vengono annullate e i client AI possono solo leggere i tuoi dati."],"Abilities API \u2014 Delete":["API delle abilit\u00e0 \u2014 Elimina"],"Enable Delete Abilities":["Abilita Elimina Abilit\u00e0"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Quando abilitato, i client AI possono eliminare permanentemente moduli e voci. I dati eliminati non possono essere recuperati. Quando disabilitato, le capacit\u00e0 di eliminazione vengono annullate e i client AI non possono rimuovere alcun dato."],"MCP Server":["Server MCP"],"Enable MCP Server":["Abilita server MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Crea un endpoint SureForms MCP dedicato a cui i clienti AI come Claude possono connettersi. Quando \u00e8 disabilitato, l'endpoint viene rimosso e i clienti AI esterni non possono scoprire o chiamare alcuna funzionalit\u00e0 di SureForms."],"Learn more":["Scopri di pi\u00f9"],"MCP Adapter Required":["Adattatore MCP richiesto"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configura la chiave API di Google Maps per il completamento automatico degli indirizzi e l'anteprima della mappa."],"Help shape the future of SureForms":["Aiuta a plasmare il futuro di SureForms"],"Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ":["Condividi come utilizzi il plugin in modo che possiamo sviluppare funzionalit\u00e0 che contano, risolvere i problemi pi\u00f9 velocemente e prendere decisioni pi\u00f9 intelligenti."],"Enable Google Address Autocomplete":["Abilita il completamento automatico degli indirizzi di Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Passa al piano SureForms Business per aggiungere il completamento automatico degli indirizzi con tecnologia Google e l'anteprima della mappa interattiva ai tuoi moduli."],"Auto-suggest addresses as users type for faster, error-free submissions":["Suggerisci automaticamente gli indirizzi mentre gli utenti digitano per invii pi\u00f9 rapidi e senza errori"],"Show an interactive map preview with draggable pin for precise locations":["Mostra un'anteprima della mappa interattiva con un segnaposto trascinabile per posizioni precise"],"Automatically populate address fields like city, state, and postal code":["Compila automaticamente i campi dell'indirizzo come citt\u00e0, stato e codice postale"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Cruscotto"],"Settings":["Impostazioni"],"Entries":["Voci"],"Activated":["Attivato"],"Activate":["Attiva"],"Monday":["Luned\u00ec"],"Forms":["Moduli"],"New Form Submission - %s":["Nuova presentazione del modulo - %s"],"GitHub":["GitHub"],"(no title)":["(nessun titolo)"],"General":["Generale"],"No tags available":["Nessun tag disponibile"],"Generic tags":["Tag generici"],"Other":["Altro"],"Confirm":["Conferma"],"Cancel":["Annulla"],"Install":["Installa"],"Plugin Installation failed, Please try again later.":["Installazione del plugin fallita, per favore riprova pi\u00f9 tardi."],"Plugin activation failed, Please try again later.":["Attivazione del plugin fallita, riprova pi\u00f9 tardi."],"Integrations":["Integrazioni"],"What's New?":["Novit\u00e0?"],"Core":["Nucleo"],"Unlicensed":["Senza licenza"],"Connecting\u2026":["Connessione in corso\u2026"],"Install & Activate":["Installa e attiva"],"Compliance Settings":["Impostazioni di conformit\u00e0"],"Enable GDPR Compliance":["Abilita la conformit\u00e0 GDPR"],"Never store entry data after form submission":["Non memorizzare mai i dati di ingresso dopo l'invio del modulo"],"When enabled this form will never store Entries.":["Quando abilitato, questo modulo non memorizzer\u00e0 mai le voci."],"Automatically delete entries":["Elimina automaticamente le voci"],"When enabled this form will automatically delete entries after a certain period of time.":["Quando abilitato, questo modulo eliminer\u00e0 automaticamente le voci dopo un certo periodo di tempo."],"Entries older than the days set will be deleted automatically.":["Le voci pi\u00f9 vecchie dei giorni impostati verranno eliminate automaticamente."],"Visual":["Visivo"],"HTML":["HTML"],"All Data":["Tutti i dati"],"Add Shortcode":["Aggiungi shortcode"],"Form input tags":["Tag di input del modulo"],"Comma separated values are also accepted.":["Sono accettati anche i valori separati da virgola."],"Email Notification":["Notifica email"],"Name":["Nome"],"Send Email To":["Invia email a"],"Subject":["Oggetto"],"CC":["CC"],"BCC":["Ccn"],"Reply To":["Rispondi a"],"Add Key":["Aggiungi chiave"],"Add Value":["Aggiungi valore"],"Add":["Aggiungi"],"Confirmation Message":["Messaggio di conferma"],"After Form Submission":["Dopo l'invio del modulo"],"Hide Form":["Nascondi modulo"],"Reset Form":["Reimposta modulo"],"Custom URL":["URL personalizzato"],"Add Query Parameters":["Aggiungi parametri di query"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Seleziona se desideri aggiungere coppie chiave-valore per i campi del modulo da includere nei parametri di query"],"Query Parameters":["Parametri di query"],"Success Message":["Messaggio di successo"],"Redirect":["Reindirizza"],"Redirect to":["Reindirizza a"],"Page":["Pagina"],"Form Confirmation":["Conferma del modulo"],"Confirmation Type":["Tipo di conferma"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invisibile"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Convalide"],"Spam Protection":["Protezione antispam"],"Email Summaries":["Riepiloghi email"],"Tuesday":["Marted\u00ec"],"Wednesday":["Mercoled\u00ec"],"Thursday":["Gioved\u00ec"],"Friday":["Venerd\u00ec"],"Saturday":["Sabato"],"Sunday":["Domenica"],"Test Email":["Email di prova"],"Schedule Reports":["Programma rapporti"],"IP Logging":["Registrazione IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Se questa opzione \u00e8 attivata, l'indirizzo IP dell'utente verr\u00e0 salvato con i dati del modulo"],"Confirmation Email Mismatch Message":["Messaggio di mancata corrispondenza dell'email di conferma"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s rappresenta il valore minimo di input. Ad esempio: \"Il valore minimo \u00e8 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s rappresenta il valore massimo di input. Ad esempio: \"Il valore massimo \u00e8 100.\""],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s rappresenta le selezioni minime necessarie. Ad esempio: \"Sono necessarie almeno 2 selezioni.\""],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s rappresenta il numero massimo di selezioni consentite. Ad esempio: \"Sono consentite al massimo 4 selezioni.\""],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s rappresenta le scelte minime necessarie. Ad esempio: \"\u00c8 richiesta almeno 1 selezione.\""],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s rappresenta il numero massimo di scelte consentite. Ad esempio: \"Sono consentite un massimo di 3 selezioni.\""]," Error Message":["Messaggio di errore"],"Auto":["Auto"],"Light":["Luce"],"Dark":["Scuro"],"Turnstile":["Tornello"],"Honeypot":["Trappola"],"Get Keys":["Ottieni chiavi"],"Documentation":["Documentazione"],"Site Key":["Chiave del sito"],"Secret Key":["Chiave segreta"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Modalit\u00e0 Aspetto"],"Enable Honeypot Security":["Abilita la Sicurezza Honeypot"],"Enable Honeypot Security for better spam protection":["Abilita la Sicurezza Honeypot per una migliore protezione dallo spam"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Connettiti con OttoKit"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'attuale indirizzo 'Da Email' non corrisponde al nome di dominio del tuo sito web (%1$s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'indirizzo email 'Da' attuale non corrisponde al nome di dominio del tuo sito web (%s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica."],"We strongly recommend that you install the free ":["Consigliamo vivamente di installare il gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! Il Wizard di configurazione rende facile correggere le tue email."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["In alternativa, prova a utilizzare un indirizzo mittente che corrisponda al dominio del tuo sito web (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Per favore, inserisci un indirizzo email valido. Le tue notifiche non verranno inviate se il campo non \u00e8 compilato correttamente."],"From Name":["Da Nome"],"From Email":["Da Email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%1$s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%s). Questo pu\u00f2 causare il blocco o la classificazione come spam delle tue email di notifica."],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Pronto a superare il piano gratuito?"],"Upgrade now":["Aggiorna ora"],"and unlock the full power of SureForms!":["e sblocca tutta la potenza di SureForms!"],"Upgrade SureForms":["Aggiorna SureForms"],"Upgrade Now":["Aggiorna ora"],"Entries older than the selected days will be deleted.":["Le voci pi\u00f9 vecchie dei giorni selezionati verranno eliminate."],"Entries Time Period":["Periodo di tempo delle voci"],"Notifications can use only one From Email so please enter a single address.":["Le notifiche possono utilizzare un solo indirizzo email del mittente, quindi inserisci un solo indirizzo."],"Select Page to redirect":["Seleziona la pagina a cui reindirizzare"],"Search for a page":["Cerca una pagina"],"Select a page":["Seleziona una pagina"],"Form Validation":["Validazione del modulo"],"Required Error Messages":["Messaggi di errore richiesti"],"Other Error Messages":["Altri messaggi di errore"],"Input Field Unique":["Campo di input univoco"],"Email Field Unique":["Campo email univoco"],"Invalid URL":["URL non valido"],"Phone Field Unique":["Campo Telefono Unico"],"Invalid Field Number Block":["Blocco Numero Campo Non Valido"],"Invalid Email":["Email non valido"],"Number Minimum Value":["Valore Minimo Numero"],"Number Maximum Value":["Valore Massimo Numero"],"Dropdown Minimum Selections":["Selezioni Minime del Menu a Tendina"],"Dropdown Maximum Selections":["Selezioni massime del menu a tendina"],"Multiple Choice Minimum Selections":["Selezioni Minime a Scelta Multipla"],"Multiple Choice Maximum Selections":["Selezioni massime a scelta multipla"],"Input Field":["Campo di input"],"Email Field":["Campo Email"],"URL Field":["Campo URL"],"Phone Field":["Campo Telefono"],"Textarea Field":["Campo di testo"],"Checkbox Field":["Campo di selezione"],"Dropdown Field":["Campo a discesa"],"Multiple Choice Field":["Campo a scelta multipla"],"Address Field":["Campo Indirizzo"],"Number Field":["Campo numerico"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Per abilitare la funzione reCAPTCHA su SureForms, attiva l'opzione reCAPTCHA nelle impostazioni dei tuoi blocchi e seleziona la versione. Aggiungi qui la chiave segreta e la chiave del sito di Google reCAPTCHA. reCAPTCHA verr\u00e0 aggiunto alla tua pagina nel front-end."],"Enter your %s here":["Inserisci qui il tuo %s"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Per abilitare hCAPTCHA, aggiungi la tua chiave del sito e la chiave segreta. Configura queste impostazioni all'interno del modulo individuale."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Per abilitare Cloudflare Turnstile, aggiungi la tua chiave del sito e la chiave segreta. Configura queste impostazioni all'interno del modulo individuale."],"Save":["Salva"],"Anonymous Analytics":["Analisi Anonime"],"Learn More":["Scopri di pi\u00f9"],"Admin Notification":["Notifica dell'amministratore"],"Enable Admin Notification":["Abilita la Notifica Amministratore"],"Admin notifications keep you informed about new form entries since your last visit.":["Le notifiche dell'amministratore ti tengono informato sui nuovi invii di moduli dalla tua ultima visita."],"Continue":["Continua"],"Maximum Number of Entries":["Numero massimo di voci"],"Maximum Entries":["Voci massime"],"Response Description After Maximum Entries":["Descrizione della risposta dopo il numero massimo di voci"],"Get Started":["Inizia"],"Integration":["Integrazione"],"Connect Native Integrations with SureForms":["Collega le integrazioni native con SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Sblocca potenti integrazioni nel piano Premium per automatizzare i tuoi flussi di lavoro e collegare SureForms direttamente con i tuoi strumenti preferiti."],"Send form submissions straight to CRMs, email, and marketing platforms":["Invia le sottomissioni dei moduli direttamente ai CRM, email e piattaforme di marketing"],"Automate repetitive tasks with seamless data syncing":["Automatizza le attivit\u00e0 ripetitive con una sincronizzazione dei dati senza interruzioni"],"Access exclusive native integrations for faster workflows":["Accedi a integrazioni native esclusive per flussi di lavoro pi\u00f9 veloci"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato previsto per le email - email@sureforms.com o John Doe "],"Payments":["Pagamenti"],"Stripe account disconnected successfully.":["Account Stripe disconnesso con successo."],"Failed to create webhook.":["Impossibile creare il webhook."],"Failed to connect to Stripe.":["Connessione a Stripe non riuscita."],"Webhook":["Webhook"],"Knowledge Base":["Base di conoscenza"],"What\u2019s New":["Novit\u00e0"],"delete":["elimina"],"Please type \"%s\" in the input box":["Per favore digita \"%s\" nella casella di input"],"To confirm, type \"%s\" in the box below:":["Per confermare, digita \"%s\" nella casella sottostante:"],"Type \"%s\"":["Digita \"%s\""],"Go to OttoKit Settings":["Vai alle Impostazioni di OttoKit"],"USD - US Dollar":["USD - Dollaro statunitense"],"Payment Mode":["Modalit\u00e0 di pagamento"],"Test Mode":["Modalit\u00e0 di test"],"Live Mode":["Modalit\u00e0 Live"],"General Settings":["Impostazioni generali"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Imposta i riepiloghi delle email, gli avvisi amministrativi e le preferenze sui dati per gestire i tuoi moduli con facilit\u00e0."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personalizza i messaggi di errore predefiniti mostrati quando gli utenti inviano voci di modulo non valide o incomplete."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Abilita la protezione antispam per i tuoi moduli utilizzando servizi CAPTCHA o la sicurezza honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Collega e gestisci i tuoi gateway di pagamento per accettare transazioni in modo sicuro attraverso i tuoi moduli."],"1% transaction and payment gateway fees apply.":["Si applicano commissioni di transazione e gateway di pagamento dell'1%."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Si applicano commissioni di transazione e gateway di pagamento del 2,9%. Attiva la licenza per ridurre le commissioni di transazione."],"2.9% transaction and payment gateway fees apply.":["Si applicano commissioni di transazione e gateway di pagamento del 2,9%."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Si prega di visitare %1$s, eliminare un webhook non utilizzato, quindi fare clic qui sotto per riprovare."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms non \u00e8 riuscito a creare un webhook perch\u00e9 il tuo account Stripe ha esaurito gli slot gratuiti. I webhook sono necessari per ricevere aggiornamenti sui pagamenti."],"Stripe Dashboard":["Dashboard di Stripe"],"Creating\u2026":["Creando\u2026"],"Create Webhook":["Crea Webhook"],"Successfully connected to Stripe!":["Connessione a Stripe riuscita!"],"Invalid response from server. Please try again.":["Risposta non valida dal server. Per favore riprova."],"Failed to disconnect Stripe account.":["Impossibile disconnettere l'account Stripe."],"Webhook created successfully!":["Webhook creato con successo!"],"Select Currency":["Seleziona valuta"],"Select the default currency for payment forms.":["Seleziona la valuta predefinita per i moduli di pagamento."],"Connection Status":["Stato della connessione"],"Disconnect Stripe Account":["Disconnetti l'account Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Sei sicuro di voler scollegare il tuo account Stripe? Questo interromper\u00e0 tutti i pagamenti attivi, gli abbonamenti e le transazioni dei moduli collegati a questo account."],"Disconnect":["Disconnetti"],"Disconnecting\u2026":["Disconnessione in corso\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook collegato con successo, tutti gli eventi di Stripe vengono tracciati."],"Connect your Stripe account to start accepting payments through your forms.":["Collega il tuo account Stripe per iniziare ad accettare pagamenti tramite i tuoi moduli."],"Connect to Stripe":["Connetti a Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Collegati in modo sicuro a Stripe con pochi clic per iniziare ad accettare pagamenti!"],"Set the total number of submissions allowed for this form.":["Imposta il numero totale di invii consentiti per questo modulo."],"Payment Methods":["Metodi di pagamento"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["La modalit\u00e0 di test ti consente di elaborare pagamenti senza addebiti reali. Passa alla modalit\u00e0 Live per le transazioni effettive."],"General Payment Settings":["Impostazioni generali di pagamento"],"These settings apply to all payment gateways.":["Queste impostazioni si applicano a tutti i gateway di pagamento."],"Stripe Settings":["Impostazioni di Stripe"],"Left ($100)":["Sinistra ($100)"],"Right (100$)":["Destra (100$)"],"Left Space ($ 100)":["Spazio Sinistro ($ 100)"],"Right Space (100 $)":["Spazio destro (100 $)"],"Currency Sign Position":["Posizione del simbolo di valuta"],"Select the position of the currency symbol relative to the amount.":["Seleziona la posizione del simbolo della valuta rispetto all'importo."],"Learn":["Impara"],"Enable email summaries":["Abilita i riepiloghi email"],"Enable IP logging":["Abilita la registrazione IP"],"Turn on Admin Notification from here.":["Attiva la notifica amministratore da qui."],"Send entries to 100+ popular apps.":["Invia voci a oltre 100 app popolari."],"Build automated workflows that run instantly.":["Crea flussi di lavoro automatizzati che vengono eseguiti istantaneamente."],"Create custom app integrations using our Custom App feature.":["Crea integrazioni di app personalizzate utilizzando la nostra funzione App personalizzata."],"Keep your tools in sync automatically.":["Mantieni i tuoi strumenti sincronizzati automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Questo installer\u00e0 e attiver\u00e0 OttoKit sul tuo sito WordPress per abilitare le funzionalit\u00e0 di automazione."],"Automate Your Forms with OttoKit":["Automatizza i tuoi moduli con OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ogni invio di modulo dovrebbe attivare qualcosa: un avviso Slack, un lead CRM, un'email di follow-up o una nuova riga in Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configura le autorizzazioni del client AI e le impostazioni del server MCP."],"View documentation":["Visualizza la documentazione"],"Copy to clipboard":["Copia negli appunti"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) o %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Codice Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (progetto) o ~\/.claude.json (globale)"],"Cursor":["Cursore"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (progetto) o settings.json > mcp.servers (globale)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml o config.json"],"Your client's MCP configuration file":["Il file di configurazione MCP del tuo cliente"],"Connect Your AI Client":["Collega il tuo client AI"],"AI Client":["Cliente AI"],"Create an Application Password \u2014 ":["Crea una Password per l'Applicazione \u2014"],"Open Application Passwords":["Apri Password Applicazioni"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Oppure usa questo comando CLI per aggiungere rapidamente il server (dovrai comunque impostare le variabili d'ambiente):"],"Copy the JSON config below into: ":["Copia la configurazione JSON qui sotto in:"],"Replace \"your-application-password\" with the password from Step 1.":["Sostituisci \"your-application-password\" con la password del Passo 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 l'endpoint MCP del tuo sito. WP_API_USERNAME \u2014 il tuo nome utente WordPress. WP_API_PASSWORD \u2014 la password dell'applicazione che hai generato."],"View setup docs":["Visualizza i documenti di configurazione"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Il plugin MCP Adapter \u00e8 installato ma non attivo. Attivalo per configurare le impostazioni MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Il plugin MCP Adapter \u00e8 necessario per connettere i client AI ai tuoi moduli. Scaricalo e installalo da GitHub, quindi attivalo."],"Download the latest release from":["Scarica l'ultima versione da"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installa il plugin tramite Plugin > Aggiungi nuovo plugin > Carica plugin."],"Activate the MCP Adapter plugin.":["Attiva il plugin dell'adattatore MCP."],"Activating\u2026":["Attivazione in corso\u2026"],"Activate MCP Adapter":["Attiva l'adattatore MCP"],"Download MCP Adapter":["Scarica l'adattatore MCP"],"Experimental":["Sperimentale"],"Enable Abilities":["Abilita Abilit\u00e0"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registra le abilit\u00e0 di SureForms con l'API Abilities di WordPress. Quando \u00e8 abilitato, i client AI possono elencare, leggere, creare, modificare e eliminare i tuoi moduli e le voci. Quando \u00e8 disabilitato, nessuna abilit\u00e0 \u00e8 registrata e i client AI non possono eseguire alcuna azione sui tuoi moduli."],"Abilities API \u2014 Edit":["API delle abilit\u00e0 \u2014 Modifica"],"Enable Edit Abilities":["Abilita le capacit\u00e0 di modifica"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Quando abilitato, i client AI possono creare nuovi moduli, aggiornare i titoli dei moduli, i campi e le impostazioni, duplicare i moduli e modificare gli stati delle voci. Quando disabilitato, queste capacit\u00e0 vengono annullate e i client AI possono solo leggere i tuoi dati."],"Abilities API \u2014 Delete":["API delle abilit\u00e0 \u2014 Elimina"],"Enable Delete Abilities":["Abilita Elimina Abilit\u00e0"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Quando abilitato, i client AI possono eliminare permanentemente moduli e voci. I dati eliminati non possono essere recuperati. Quando disabilitato, le capacit\u00e0 di eliminazione vengono annullate e i client AI non possono rimuovere alcun dato."],"MCP Server":["Server MCP"],"Enable MCP Server":["Abilita server MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Crea un endpoint SureForms MCP dedicato a cui i clienti AI come Claude possono connettersi. Quando \u00e8 disabilitato, l'endpoint viene rimosso e i clienti AI esterni non possono scoprire o chiamare alcuna funzionalit\u00e0 di SureForms."],"Learn more":["Scopri di pi\u00f9"],"MCP Adapter Required":["Adattatore MCP richiesto"],"Heading 1":["Intestazione 1"],"Heading 2":["Intestazione 2"],"Heading 3":["Intestazione 3"],"Heading 4":["Intestazione 4"],"Heading 5":["Intestazione 5"],"Heading 6":["Intestazione 6"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configura la chiave API di Google Maps per il completamento automatico degli indirizzi e l'anteprima della mappa."],"Help shape the future of SureForms":["Aiuta a plasmare il futuro di SureForms"],"Enable Google Address Autocomplete":["Abilita il completamento automatico degli indirizzi di Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Passa al piano SureForms Business per aggiungere il completamento automatico degli indirizzi con tecnologia Google e l'anteprima della mappa interattiva ai tuoi moduli."],"Auto-suggest addresses as users type for faster, error-free submissions":["Suggerisci automaticamente gli indirizzi mentre gli utenti digitano per invii pi\u00f9 rapidi e senza errori"],"Show an interactive map preview with draggable pin for precise locations":["Mostra un'anteprima della mappa interattiva con un segnaposto trascinabile per posizioni precise"],"Automatically populate address fields like city, state, and postal code":["Compila automaticamente i campi dell'indirizzo come citt\u00e0, stato e codice postale"],"This form is now closed as we've received all the entries.":["Questo modulo \u00e8 ora chiuso poich\u00e9 abbiamo ricevuto tutte le iscrizioni."],"Thank you for contacting us! We will be in touch with you shortly.":["Grazie per averci contattato! Saremo in contatto con te a breve."],"Saving\u2026":["Salvataggio in corso\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Quando abilitato, questo modulo non memorizzer\u00e0 l'IP dell'utente, il nome del browser e il nome del dispositivo nelle voci."],"Form data":["Dati del modulo"],"Unsaved changes":["Modifiche non salvate"],"Keep editing":["Continua a modificare"],"Global Defaults":["Impostazioni predefinite globali"],"Form Restrictions":["Restrizioni del modulo"],"Configure default settings that apply to newly created forms.":["Configura le impostazioni predefinite che si applicano ai moduli appena creati."],"Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ":["Raccogli informazioni non sensibili dal tuo sito web, come la versione PHP e le funzionalit\u00e0 utilizzate, per aiutarci a correggere i bug pi\u00f9 velocemente, prendere decisioni pi\u00f9 intelligenti e sviluppare funzionalit\u00e0 che contano davvero per te. "],"Failed to load pages. Please refresh and try again.":["Caricamento delle pagine non riuscito. Si prega di aggiornare e riprovare."],"Failed to load settings. Please refresh and try again.":["Caricamento delle impostazioni non riuscito. Si prega di aggiornare e riprovare."],"Form Validation fields cannot be left blank.":["I campi di convalida del modulo non possono essere lasciati vuoti."],"Recipient email is required when email summaries are enabled.":["L'email del destinatario \u00e8 necessaria quando i riepiloghi email sono abilitati."],"Please enter a valid recipient email.":["Si prega di inserire un'email del destinatario valida."],"Settings saved.":["Impostazioni salvate."],"Failed to save settings.":["Impossibile salvare le impostazioni."],"Some settings failed to save. Please retry.":["Alcune impostazioni non sono state salvate. Riprova."],"Some fields have unsaved changes. Discard them to continue, or stay to save your edits.":["Alcuni campi hanno modifiche non salvate. Scartale per continuare, oppure rimani per salvare le tue modifiche."],"Discard & switch":["Scarta e cambia"],"Quill heading picker: default paragraph style\u0004Normal":["Normale"]}}} \ No newline at end of file diff --git a/languages/sureforms-it_IT-8cf77722f0a349f4f2e7f56437f288f9.json b/languages/sureforms-it_IT-8cf77722f0a349f4f2e7f56437f288f9.json index 62d936fb0..a5feb7cfb 100644 --- a/languages/sureforms-it_IT-8cf77722f0a349f4f2e7f56437f288f9.json +++ b/languages/sureforms-it_IT-8cf77722f0a349f4f2e7f56437f288f9.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Cruscotto"],"Settings":["Impostazioni"],"Entries":["Voci"],"Move to Trash":["Sposta nel cestino"],"Export":["Esporta"],"Trash":["Spazzatura"],"Published":["Pubblicato"],"Restore":["Ripristina"],"Delete Permanently":["Elimina definitivamente"],"Clear Filter":["Cancella filtro"],"Activated":["Attivato"],"Edit":["Modifica"],"Import Form":["Modulo di importazione"],"Add New Form":["Aggiungi nuovo modulo"],"View Form":["Visualizza modulo"],"Forms":["Moduli"],"Shortcode":["Codice breve"],"(no title)":["(nessun titolo)"],"Confirm":["Conferma"],"Cancel":["Annulla"],"What's New?":["Novit\u00e0?"],"Core":["Nucleo"],"Unlicensed":["Senza licenza"],"Page":["Pagina"],"No Date":["Nessuna data"],"Invalid Date":["Data non valida"],"Ready to go beyond free plan?":["Pronto a superare il piano gratuito?"],"Upgrade now":["Aggiorna ora"],"and unlock the full power of SureForms!":["e sblocca tutta la potenza di SureForms!"],"Upgrade SureForms":["Aggiorna SureForms"],"Clear Filters":["Cancella filtri"],"Select Date Range":["Seleziona intervallo di date"],"Actions":["Azioni"],"Duplicate":["Duplicato"],"All Forms":["Tutti i moduli"],"Date & Time":["Data e Ora"],"Payments":["Pagamenti"],"Knowledge Base":["Base di conoscenza"],"What\u2019s New":["Novit\u00e0"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["mm\/dd\/yyyy - mm\/dd\/yyyy"],"out of":["fuori da"],"No entries found":["Nessuna voce trovata"],"delete":["elimina"],"Please type \"%s\" in the input box":["Per favore digita \"%s\" nella casella di input"],"To confirm, type \"%s\" in the box below:":["Per confermare, digita \"%s\" nella casella sottostante:"],"Type \"%s\"":["Digita \"%s\""],"No results found":["Nessun risultato trovato"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Non siamo riusciti a trovare alcun record che corrisponda ai tuoi filtri. Prova a modificare i filtri o a reimpostarli per vedere tutti i risultati."],"Please select a file to import.":["Si prega di selezionare un file da importare."],"Invalid JSON file format.":["Formato del file JSON non valido."],"Failed to read file.":["Impossibile leggere il file."],"Import failed.":["Importazione fallita."],"An error occurred during import.":["Si \u00e8 verificato un errore durante l'importazione."],"Import Forms":["Importa moduli"],"Please select a valid JSON file.":["Si prega di selezionare un file JSON valido."],"Drag and drop or browse files":["Trascina e rilascia o sfoglia i file"],"Importing\u2026":["Importazione in corso\u2026"],"Drafts":["Bozze"],"Search forms\u2026":["Cerca moduli\u2026"],"No forms found":["Nessun modulo trovato"],"Title":["Titolo"],"Copied!":["Copiato!"],"Copy Shortcode":["Copia shortcode"],"No Forms":["Nessun modulo"],"Hi there, let's get you started":["Ciao, iniziamo"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Sembra che tu non abbia ancora creato alcun modulo. Inizia a costruire con SureForms e lancia moduli potenti in pochi clic."],"Design forms with our Gutenberg-native builder.":["Progetta moduli con il nostro builder nativo di Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Usa l'IA per generare moduli istantaneamente da un semplice prompt."],"Build engaging conversational, calculation, and multi-step forms.":["Crea moduli conversazionali, di calcolo e multi-step coinvolgenti."],"Create Form":["Crea modulo"],"An error occurred while fetching forms.":["Si \u00e8 verificato un errore durante il recupero dei moduli."],"%d form moved to trash.":["%d modulo spostato nel cestino."],"%d form restored.":["%d modulo ripristinato."],"%d form permanently deleted.":["%d modulo eliminato definitivamente."],"An error occurred while performing the action.":["Si \u00e8 verificato un errore durante l'esecuzione dell'azione."],"%d form imported successfully.":["%d modulo importato con successo."],"%d form will be moved to trash and can be restored later.":["%d modulo verr\u00e0 spostato nel cestino e potr\u00e0 essere ripristinato in seguito."],"Delete Form":["Elimina modulo"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Sei sicuro di voler eliminare definitivamente il modulo %d? Questa azione non pu\u00f2 essere annullata."],"Restore Form":["Ripristina modulo"],"%d form will be restored from trash.":["%d modulo verr\u00e0 ripristinato dal cestino."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Sei sicuro di voler eliminare definitivamente questo modulo? Questa azione non pu\u00f2 essere annullata."],"This form will be moved to trash and can be restored later.":["Questo modulo verr\u00e0 spostato nel cestino e potr\u00e0 essere ripristinato in seguito."],"An error occurred while duplicating the form.":["Si \u00e8 verificato un errore durante la duplicazione del modulo."],"This will create a copy of \"%s\" with all its settings.":["Questo creer\u00e0 una copia di \"%s\" con tutte le sue impostazioni."],"Learn":["Impara"],"Export failed: no data received.":["Esportazione fallita: nessun dato ricevuto."],"Select a SureForms export file (.json) to import.":["Seleziona un file di esportazione SureForms (.json) da importare."],"Drop a form file (.json) here":["Trascina qui un file di modulo (.json)"],"(Draft)":["(Bozza)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Crea moduli istantanei e condividili con un link, senza bisogno di incorporare."],"Form \"%s\" duplicated successfully.":["Modulo \"%s\" duplicato con successo."],"Error loading forms":["Errore nel caricamento dei moduli"],"Move form to trash?":["Spostare il modulo nel cestino?"],"Delete form?":["Eliminare il modulo?"],"Duplicate form?":["Duplicare il modulo?"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Cruscotto"],"Settings":["Impostazioni"],"Entries":["Voci"],"Move to Trash":["Sposta nel cestino"],"Export":["Esporta"],"Trash":["Spazzatura"],"Published":["Pubblicato"],"Restore":["Ripristina"],"Delete Permanently":["Elimina definitivamente"],"Clear Filter":["Cancella filtro"],"Activated":["Attivato"],"Edit":["Modifica"],"Import Form":["Modulo di importazione"],"Add New Form":["Aggiungi nuovo modulo"],"View Form":["Visualizza modulo"],"Forms":["Moduli"],"Shortcode":["Codice breve"],"(no title)":["(nessun titolo)"],"Confirm":["Conferma"],"Cancel":["Annulla"],"What's New?":["Novit\u00e0?"],"Core":["Nucleo"],"Unlicensed":["Senza licenza"],"Page":["Pagina"],"No Date":["Nessuna data"],"Invalid Date":["Data non valida"],"Ready to go beyond free plan?":["Pronto a superare il piano gratuito?"],"Upgrade now":["Aggiorna ora"],"and unlock the full power of SureForms!":["e sblocca tutta la potenza di SureForms!"],"Upgrade SureForms":["Aggiorna SureForms"],"Clear Filters":["Cancella filtri"],"Select Date Range":["Seleziona intervallo di date"],"Actions":["Azioni"],"Duplicate":["Duplicato"],"All Forms":["Tutti i moduli"],"Date & Time":["Data e Ora"],"Payments":["Pagamenti"],"Knowledge Base":["Base di conoscenza"],"What\u2019s New":["Novit\u00e0"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["mm\/dd\/yyyy - mm\/dd\/yyyy"],"out of":["fuori da"],"No entries found":["Nessuna voce trovata"],"delete":["elimina"],"Please type \"%s\" in the input box":["Per favore digita \"%s\" nella casella di input"],"To confirm, type \"%s\" in the box below:":["Per confermare, digita \"%s\" nella casella sottostante:"],"Type \"%s\"":["Digita \"%s\""],"No results found":["Nessun risultato trovato"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Non siamo riusciti a trovare alcun record che corrisponda ai tuoi filtri. Prova a modificare i filtri o a reimpostarli per vedere tutti i risultati."],"Please select a file to import.":["Si prega di selezionare un file da importare."],"Invalid JSON file format.":["Formato del file JSON non valido."],"Failed to read file.":["Impossibile leggere il file."],"Import failed.":["Importazione fallita."],"An error occurred during import.":["Si \u00e8 verificato un errore durante l'importazione."],"Import Forms":["Importa moduli"],"Please select a valid JSON file.":["Si prega di selezionare un file JSON valido."],"Drag and drop or browse files":["Trascina e rilascia o sfoglia i file"],"Importing\u2026":["Importazione in corso\u2026"],"Drafts":["Bozze"],"Search forms\u2026":["Cerca moduli\u2026"],"No forms found":["Nessun modulo trovato"],"Title":["Titolo"],"Copied!":["Copiato!"],"Copy Shortcode":["Copia shortcode"],"No Forms":["Nessun modulo"],"Hi there, let's get you started":["Ciao, iniziamo"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Sembra che tu non abbia ancora creato alcun modulo. Inizia a costruire con SureForms e lancia moduli potenti in pochi clic."],"Design forms with our Gutenberg-native builder.":["Progetta moduli con il nostro builder nativo di Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Usa l'IA per generare moduli istantaneamente da un semplice prompt."],"Build engaging conversational, calculation, and multi-step forms.":["Crea moduli conversazionali, di calcolo e multi-step coinvolgenti."],"Create Form":["Crea modulo"],"An error occurred while fetching forms.":["Si \u00e8 verificato un errore durante il recupero dei moduli."],"%d form moved to trash.":["%d modulo spostato nel cestino."],"%d form restored.":["%d modulo ripristinato."],"%d form permanently deleted.":["%d modulo eliminato definitivamente."],"An error occurred while performing the action.":["Si \u00e8 verificato un errore durante l'esecuzione dell'azione."],"%d form imported successfully.":["%d modulo importato con successo."],"%d form will be moved to trash and can be restored later.":["%d modulo verr\u00e0 spostato nel cestino e potr\u00e0 essere ripristinato in seguito."],"Delete Form":["Elimina modulo"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Sei sicuro di voler eliminare definitivamente il modulo %d? Questa azione non pu\u00f2 essere annullata."],"Restore Form":["Ripristina modulo"],"%d form will be restored from trash.":["%d modulo verr\u00e0 ripristinato dal cestino."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Sei sicuro di voler eliminare definitivamente questo modulo? Questa azione non pu\u00f2 essere annullata."],"This form will be moved to trash and can be restored later.":["Questo modulo verr\u00e0 spostato nel cestino e potr\u00e0 essere ripristinato in seguito."],"An error occurred while duplicating the form.":["Si \u00e8 verificato un errore durante la duplicazione del modulo."],"This will create a copy of \"%s\" with all its settings.":["Questo creer\u00e0 una copia di \"%s\" con tutte le sue impostazioni."],"Learn":["Impara"],"Export failed: no data received.":["Esportazione fallita: nessun dato ricevuto."],"Select a SureForms export file (.json) to import.":["Seleziona un file di esportazione SureForms (.json) da importare."],"Drop a form file (.json) here":["Trascina qui un file di modulo (.json)"],"(Draft)":["(Bozza)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Crea moduli istantanei e condividili con un link, senza bisogno di incorporare."],"Form \"%s\" duplicated successfully.":["Modulo \"%s\" duplicato con successo."],"Error loading forms":["Errore nel caricamento dei moduli"],"Move form to trash?":["Spostare il modulo nel cestino?"],"Delete form?":["Eliminare il modulo?"],"Duplicate form?":["Duplicare il modulo?"],"Switch to Draft":["Passa a Bozza"],"%d form switched to draft.":["%d modulo cambiato in bozza."],"Switch form to draft?":["Passare il modulo a bozza?"],"%d form will be switched to draft and will no longer be publicly accessible.":["%d modulo verr\u00e0 spostato in bozza e non sar\u00e0 pi\u00f9 accessibile pubblicamente."],"This form will be switched to draft and will no longer be publicly accessible.":["Questo modulo verr\u00e0 convertito in bozza e non sar\u00e0 pi\u00f9 accessibile pubblicamente."]}}} \ No newline at end of file diff --git a/languages/sureforms-it_IT-e2cfcb2408d95abf73e3ead4a0965656.json b/languages/sureforms-it_IT-e2cfcb2408d95abf73e3ead4a0965656.json new file mode 100644 index 000000000..19ff51455 --- /dev/null +++ b/languages/sureforms-it_IT-e2cfcb2408d95abf73e3ead4a0965656.json @@ -0,0 +1 @@ +{"translation-revision-date":"2025-01-01T06:16:29+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/partialEntriesEmptyState.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Cruscotto"],"Settings":["Impostazioni"],"Entries":["Voci"],"Activated":["Attivato"],"Forms":["Moduli"],"What's New?":["Novit\u00e0?"],"Core":["Nucleo"],"Unlicensed":["Senza licenza"],"Ready to go beyond free plan?":["Pronto a superare il piano gratuito?"],"Upgrade now":["Aggiorna ora"],"and unlock the full power of SureForms!":["e sblocca tutta la potenza di SureForms!"],"Upgrade SureForms":["Aggiorna SureForms"],"Payments":["Pagamenti"],"Knowledge Base":["Base di conoscenza"],"What\u2019s New":["Novit\u00e0"],"Learn":["Impara"],"Upgrade to SureForms":["Aggiorna a SureForms"],"Partial Entries Placeholder":["Segnaposto per voci parziali"],"Capture in-progress form data the moment visitors stop typing \u2014 no submit required":["Acquisisci i dati del modulo in corso nel momento in cui i visitatori smettono di digitare \u2014 non \u00e8 necessario inviare"],"Recover abandoned submissions and follow up with prospects you would otherwise lose":["Recupera le presentazioni abbandonate e segui i potenziali clienti che altrimenti perderesti"],"Let visitors pick up where they left off with secure, shareable resume links":["Consenti ai visitatori di riprendere da dove avevano interrotto con link di ripresa sicuri e condivisibili"],"Stop Losing Leads to Abandoned Forms":["Smetti di perdere contatti a causa di moduli abbandonati"],"See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:":["Scopri cosa hanno digitato i visitatori prima di andarsene. Passa a SureForms Premium per sbloccare le Voci Parziali:"]}}} \ No newline at end of file diff --git a/languages/sureforms-it_IT.mo b/languages/sureforms-it_IT.mo index a0b7e69f1..30d0babc7 100644 Binary files a/languages/sureforms-it_IT.mo and b/languages/sureforms-it_IT.mo differ diff --git a/languages/sureforms-it_IT.po b/languages/sureforms-it_IT.po index 7d485082a..4e13e3c4e 100644 --- a/languages/sureforms-it_IT.po +++ b/languages/sureforms-it_IT.po @@ -14,9 +14,9 @@ msgstr "" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -43,13 +43,14 @@ msgstr "Un modo semplice ma potente per creare moduli moderni per il tuo sito we msgid "https://sureforms.com/" msgstr "https://sureforms.com/" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -58,15 +59,16 @@ msgstr "https://sureforms.com/" msgid "Dashboard" msgstr "Cruscotto" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -74,21 +76,22 @@ msgstr "Cruscotto" msgid "Settings" msgstr "Impostazioni" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "Nuovo modulo" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -97,7 +100,7 @@ msgid "Entries" msgstr "Voci" #. Translators: Post Title. -#: admin/admin.php:843 +#: admin/admin.php:869 #, php-format msgid "Edit %1$s" msgstr "Modifica %1$s" @@ -111,25 +114,25 @@ msgstr "Modifica %1$s" #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "Verifica del nonce fallita." #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 +#: admin/admin.php:1504 #, php-format msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "Per favore %1$sattiva%2$s la tua copia di %3$s per ottenere nuove funzionalità, accedere al supporto, ricevere notifiche di aggiornamento e altro ancora." #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 +#: admin/admin.php:1522 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "SureForms %1$s richiede almeno %2$s %3$s per funzionare correttamente. Si prega di aggiornare all'ultima versione da %4$squi%5$s." -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 @@ -197,7 +200,7 @@ msgstr "Spazzatura" msgid "Published" msgstr "Pubblicato" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "Visualizza" @@ -286,17 +289,18 @@ msgstr "Nessun plugin specificato" msgid "Plugin Successfully Activated" msgstr "Plugin attivato con successo" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "Attivazione in corso..." -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -305,17 +309,17 @@ msgstr "Attivazione in corso..." msgid "Activated" msgstr "Attivato" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "Attiva" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "Installazione in corso..." -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "Installato" @@ -323,14 +327,14 @@ msgstr "Installato" msgid "You do not have permission to access this page." msgstr "Non hai il permesso di accedere a questa pagina." -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "Nonce non valido." @@ -339,7 +343,7 @@ msgid "Form ID is required." msgstr "L'ID del modulo è obbligatorio." #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1001 msgid "Invalid form ID." msgstr "ID modulo non valido." @@ -591,28 +595,23 @@ msgstr "C'è stato un errore nel tentativo di inviare il modulo. Per favore ripr msgid "Test Email Sent Successfully." msgstr "Email di prova inviato con successo." -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "Nessun modulo trovato." #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "Lunedì" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" -msgstr "Errore nel salvataggio delle impostazioni!" - -#: inc/global-settings/global-settings.php:122 #: assets/build/formEditor.js:172 msgid "Global Settings" msgstr "Impostazioni globali" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "Impostazioni salvate con successo." @@ -626,7 +625,6 @@ msgid "Advanced Fields" msgstr "Campi Avanzati" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "Questo campo è obbligatorio." @@ -638,7 +636,7 @@ msgstr "Il valore deve essere unico." msgid "Sorry, you are not allowed to perform this action." msgstr "Spiacente, non ti è permesso eseguire questa azione." -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "Valuta SureForms" @@ -685,7 +683,7 @@ msgstr "Nascondi" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "Modifica modulo" @@ -709,37 +707,38 @@ msgstr "Crea" msgid "Import Form" msgstr "Modulo di importazione" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "Aggiungi nuovo modulo" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "Nessun record trovato" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "Qui è dove appariranno le voci del tuo modulo" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "Visualizza modulo" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "Visualizza moduli" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -747,32 +746,37 @@ msgstr "Visualizza moduli" msgid "Forms" msgstr "Moduli" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "Moduli di ricerca" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "Moduli genitori:" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "Nessun modulo trovato nel Cestino." -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "Modulo pubblicato." -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "Modulo aggiornato." -#: inc/post-types.php:977 +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 msgid "Admin Notification Email" msgstr "Email di notifica amministrativa" #. translators: %s: Form title smart tag -#: inc/post-types.php:984 +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 #, php-format msgid "New Form Submission - %s" msgstr "Nuova presentazione del modulo - %s" @@ -8236,7 +8240,7 @@ msgstr "Sociale" msgid "Travel" msgstr "Viaggio" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "Modulo Vuoto" @@ -8266,6 +8270,7 @@ msgstr "Realizzato con ♡ %s" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "(nessun titolo)" @@ -8292,7 +8297,7 @@ msgstr "Modifica modulo" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "Questo modulo è stato eliminato o non è disponibile." @@ -8338,6 +8343,7 @@ msgstr "Avanzato" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "Nessun tag disponibile" @@ -8382,6 +8388,7 @@ msgstr "Reimposta" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "Tag generici" @@ -8761,6 +8768,7 @@ msgstr "Integrazioni" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8773,6 +8781,7 @@ msgstr "Novità?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8785,6 +8794,7 @@ msgstr "Nucleo" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8793,52 +8803,52 @@ msgid "Unlicensed" msgstr "Senza licenza" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 #, js-format msgid "%s Removed from Quick Action Bar." msgstr "%s rimosso dalla barra delle azioni rapide." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "Aggiungi alla barra delle azioni rapide" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 #, js-format msgid "%s Added to Quick Action Bar." msgstr "%s aggiunto alla barra delle azioni rapide." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "Già presente nella barra delle azioni rapide" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "Nessun risultato trovato." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "l'oggetto dati è vuoto" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "Aggiungi blocchi alla barra delle azioni rapide" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "Riorganizza il blocco all'interno della Barra delle Azioni Rapide" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -8864,30 +8874,37 @@ msgid "Install & Activate" msgstr "Installa e attiva" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Compliance Settings" msgstr "Impostazioni di conformità" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "Abilita la conformità GDPR" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "Non memorizzare mai i dati di ingresso dopo l'invio del modulo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "Quando abilitato, questo modulo non memorizzerà mai le voci." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "Elimina automaticamente le voci" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "Quando abilitato, questo modulo eliminerà automaticamente le voci dopo un certo periodo di tempo." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "Le voci più vecchie dei giorni impostati verranno eliminate automaticamente." @@ -8900,34 +8917,42 @@ msgid "The following CSS styles added below will only apply to this form contain msgstr "I seguenti stili CSS aggiunti di seguito si applicheranno solo a questo contenitore del modulo." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "Visivo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "HTML" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "Tutti i dati" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "Aggiungi shortcode" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "Tag di input del modulo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Comma separated values are also accepted." msgstr "Sono accettati anche i valori separati da virgola." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "Notifica email" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Name" msgstr "Nome" @@ -8937,18 +8962,22 @@ msgid "Send Email To" msgstr "Invia email a" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Subject" msgstr "Oggetto" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "CC" msgstr "CC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "BCC" msgstr "Ccn" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reply To" msgstr "Rispondi a" @@ -8957,54 +8986,57 @@ msgid "Add Notification" msgstr "Aggiungi notifica" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." -msgstr "Notifica email disabilitata con successo." - -#: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." -msgstr "Notifica email abilitata con successo." - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "Aggiungi chiave" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "Aggiungi valore" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "Aggiungi" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "Messaggio di conferma" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "Dopo l'invio del modulo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "Nascondi modulo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "Reimposta modulo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "URL personalizzato" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "Aggiungi parametri di query" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "Seleziona se desideri aggiungere coppie chiave-valore per i campi del modulo da includere nei parametri di query" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "Parametri di query" @@ -9017,14 +9049,17 @@ msgid "Suggestion: URL should use HTTPS" msgstr "Suggerimento: l'URL dovrebbe utilizzare HTTPS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Success Message" msgstr "Messaggio di successo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect" msgstr "Reindirizza" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect to" msgstr "Reindirizza a" @@ -9032,14 +9067,17 @@ msgstr "Reindirizza a" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "Pagina" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form Confirmation" msgstr "Conferma del modulo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "Tipo di conferma" @@ -9181,7 +9219,7 @@ msgstr "Centro" msgid "Right" msgstr "Destra" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1178 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" @@ -9191,7 +9229,7 @@ msgstr "Google reCAPTCHA" msgid "CloudFlare Turnstile" msgstr "CloudFlare Turnstile" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1182 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" @@ -9250,7 +9288,8 @@ msgstr "Interruzione di pagina" msgid "Previous" msgstr "Precedente" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 #: assets/build/formEditor.js:172 msgid "Thank you" msgstr "Grazie" @@ -9483,7 +9522,7 @@ msgstr "Chiave del sito" msgid "Secret Key" msgstr "Chiave segreta" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1186 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "Cloudflare Turnstile" @@ -9500,10 +9539,6 @@ msgstr "Abilita la Sicurezza Honeypot" msgid "Enable Honeypot Security for better spam protection" msgstr "Abilita la Sicurezza Honeypot per una migliore protezione dallo spam" -#: assets/build/settings.js:172 -msgid "This field cannot be left blank." -msgstr "Questo campo non può essere lasciato vuoto." - #: assets/build/templatePicker.js:172 msgid "Connect Now" msgstr "Connetti ora" @@ -10481,18 +10516,18 @@ msgstr "Sblocca Aggiungi Nota" msgid "With the SureForms Starter plan, enhance your submitted form entries by adding personalized notes for better clarity and tracking." msgstr "Con il piano SureForms Starter, migliora le tue voci di modulo inviate aggiungendo note personalizzate per una maggiore chiarezza e tracciabilità." -#: inc/form-submit.php:823 +#: inc/form-submit.php:852 msgid "Email notification passed to the sending server" msgstr "Notifica email passata al server di invio" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 +#: inc/form-submit.php:925 #, php-format msgid "Email notification recipient: %s" msgstr "Destinatario della notifica email: %s" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 +#: inc/form-submit.php:942 #, php-format msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "Il server di posta elettronica non è riuscito a inviare la notifica email. Destinatario: %1$s. Motivo: %2$s" @@ -10535,7 +10570,7 @@ msgstr "Sblocca moduli conversazionali" msgid "With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience." msgstr "Con il piano SureForms Pro, puoi trasformare i tuoi moduli in layout conversazionali coinvolgenti per un'esperienza utente senza interruzioni." -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "Ottieni SureForms Pro" @@ -10631,7 +10666,7 @@ msgstr "PX" msgid "Button" msgstr "Pulsante" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" @@ -10663,46 +10698,56 @@ msgid "SUREFORMS PREMIUM FIELDS" msgstr "CAMPI PREMIUM DI SUREFORMS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "L'attuale indirizzo 'Da Email' non corrisponde al nome di dominio del tuo sito web (%1$s). Questo può causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "L'indirizzo email 'Da' attuale non corrisponde al nome di dominio del tuo sito web (%s). Questo può causare il blocco o la classificazione come spam delle tue email di notifica." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "We strongly recommend that you install the free " msgstr "Consigliamo vivamente di installare il gratuito" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "plugin! Il Wizard di configurazione rende facile correggere le tue email." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "In alternativa, prova a utilizzare un indirizzo mittente che corrisponda al dominio del tuo sito web (admin@%s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "Per favore, inserisci un indirizzo email valido. Le tue notifiche non verranno inviate se il campo non è compilato correttamente." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Name" msgstr "Da Nome" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Email" msgstr "Da Email" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%1$s). Questo può causare il blocco o la classificazione come spam delle tue email di notifica. In alternativa, prova a utilizzare un indirizzo Da che corrisponda al dominio del tuo sito web (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "L'attuale indirizzo 'Da Email' potrebbe non corrispondere al nome di dominio del tuo sito web (%s). Questo può causare il blocco o la classificazione come spam delle tue email di notifica." @@ -10736,24 +10781,24 @@ msgstr "Seleziona sfumatura" msgid "reCAPTCHA" msgstr "reCAPTCHA" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1122 msgid "Captcha validation failed. No error code provided." msgstr "La validazione del captcha non è riuscita. Nessun codice di errore fornito." -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1123 msgid "Captcha validation failed." msgstr "La validazione del captcha è fallita." -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1190 msgid "Unknown Captcha" msgstr "Captcha sconosciuto" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1191 msgid "Invalid captcha type." msgstr "Tipo di captcha non valido." #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 +#: inc/form-submit.php:1204 #, php-format msgid "%s verification failed. Please contact your site administrator." msgstr "La verifica di %s non è riuscita. Si prega di contattare l'amministratore del sito." @@ -10776,11 +10821,11 @@ msgstr "La verifica del sitekey di HCaptcha non è riuscita. Si prega di contatt msgid "%s sitekey is missing. Please contact your site administrator." msgstr "Manca il sitekey %s. Si prega di contattare l'amministratore del sito." -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "SureMail" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "Modelli di partenza" @@ -10821,6 +10866,7 @@ msgstr "Data non valida" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10833,6 +10879,7 @@ msgstr "Pronto a superare il piano gratuito?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10845,6 +10892,7 @@ msgstr "Aggiorna ora" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10857,6 +10905,7 @@ msgstr "e sblocca tutta la potenza di SureForms!" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10947,10 +10996,12 @@ msgid "Free" msgstr "Gratis" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "Le voci più vecchie dei giorni selezionati verranno eliminate." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "Periodo di tempo delle voci" @@ -10959,6 +11010,7 @@ msgid "Custom CSS Panel" msgstr "Pannello CSS personalizzato" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "Le notifiche possono utilizzare un solo indirizzo email del mittente, quindi inserisci un solo indirizzo." @@ -10986,14 +11038,17 @@ msgid "Delete" msgstr "Elimina" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "Seleziona la pagina a cui reindirizzare" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "Cerca una pagina" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "Seleziona una pagina" @@ -11119,6 +11174,7 @@ msgstr "Per abilitare hCAPTCHA, aggiungi la tua chiave del sito e la chiave segr msgid "To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form." msgstr "Per abilitare Cloudflare Turnstile, aggiungi la tua chiave del sito e la chiave segreta. Configura queste impostazioni all'interno del modulo individuale." +#: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Save" msgstr "Salva" @@ -11139,8 +11195,8 @@ msgstr "Descrivi il modulo che desideri creare" msgid "We are building your form…" msgstr "Stiamo creando il tuo modulo…" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "SMTP" @@ -11270,28 +11326,28 @@ msgstr "Abilita la Notifica Amministratore" msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "Le notifiche dell'amministratore ti tengono informato sui nuovi invii di moduli dalla tua ultima visita." -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "Utente non autorizzato." #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 +#: admin/admin.php:1774 #, php-format msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "%1$sInizia %2$scostruendo il tuo primo modulo%3$s.%4$s%5$sScopri la potenza del nostro intuitivo Costruttore di Moduli AI%6$s" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "SureForms ti sta aspettando!" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "Crea il mio primo modulo" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "Chiudi" @@ -11311,51 +11367,51 @@ msgstr "Accesso" msgid "Register" msgstr "Registrati" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "Voci recenti" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "( Ultimi 7 giorni )" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "Usa la logica condizionale per mostrare solo ciò che conta" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "Dividi il tuo modulo in passaggi per mantenerlo semplice" -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "Consenti alle persone di caricare file direttamente nel tuo modulo" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "Trasforma automaticamente le risposte in PDF scaricabili" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "Consenti agli utenti di firmare con un semplice campo firma" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "Collega il tuo modulo ad altri strumenti utilizzando i webhook" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "Usa moduli conversazionali per un'esperienza simile a una chat" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "Consenti agli utenti di registrarsi o accedere tramite il tuo modulo" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "Crea moduli che creano account utente WordPress" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "Aggiungi calcoli per totalizzare automaticamente i punteggi o i prezzi" @@ -11585,21 +11641,21 @@ msgstr "Ritocchi finali che fanno la differenza:" msgid "Build Your First Form" msgstr "Crea il tuo primo modulo" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "Azione o nome del nonce non valido." -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "Token di sicurezza non valido." -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "Tipo di richiesta non valido." -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "Non hai il permesso di eseguire questa azione." @@ -11677,10 +11733,12 @@ msgid "Form Restriction" msgstr "Restrizione del modulo" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "Numero massimo di voci" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "Voci massime" @@ -11698,6 +11756,7 @@ msgid "Click here" msgstr "Fai clic qui" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "Descrizione della risposta dopo il numero massimo di voci" @@ -11711,7 +11770,7 @@ msgstr "Ciao," msgid "Email Summary of your last week - %1$s to %2$s" msgstr "Riepilogo email della tua ultima settimana - %1$s a %2$s" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "Componenti aggiuntivi avanzati per Elementor" @@ -11773,7 +11832,7 @@ msgstr "Esplora SureDash" msgid "Something went wrong. We have logged the error for further investigation" msgstr "Qualcosa è andato storto. Abbiamo registrato l'errore per ulteriori indagini." -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "Il campo non è valido." @@ -11837,16 +11896,18 @@ msgid "SureForms Video Thumbnail" msgstr "Miniatura video di SureForms" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Expected format for emails - email@sureforms.com or John Doe " msgstr "Formato previsto per le email - email@sureforms.com o John Doe " -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -12010,47 +12071,47 @@ msgstr "La modalità di test è attivata:" msgid "Click here to enable live mode and accept payment" msgstr "Fai clic qui per abilitare la modalità live e accettare il pagamento" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "Migliora immediatamente la tua deliverability delle email!" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "Accedi a un potente servizio di consegna email facile da usare che garantisce che le tue email arrivino nelle caselle di posta, non nelle cartelle di spam. Automatizza con sicurezza i tuoi flussi di lavoro email di WordPress con SureMail." -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "Automatizza i tuoi flussi di lavoro WordPress senza sforzo." -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "Collega i tuoi plugin di WordPress e le app preferite, automatizza le attività e sincronizza i dati senza sforzo utilizzando il pulito e visivo builder di flussi di lavoro di OttoKit — senza bisogno di codifica o configurazioni complesse." -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "Lancia bellissimi siti web in pochi minuti!" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "Scegli tra modelli progettati professionalmente, importa con un clic e personalizza facilmente per adattarli al tuo marchio." -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "Potenzia Elementor per creare siti web straordinari più velocemente!" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "Migliora Elementor con potenti widget e template. Crea siti web straordinari e ad alte prestazioni più velocemente con elementi di design creativi e personalizzazione senza interruzioni." -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "SureRank" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "Eleva il tuo SEO e scala le classifiche di ricerca senza sforzo!" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "Aumenta la visibilità del tuo sito web con l'automazione intelligente della SEO. Ottimizza i contenuti, monitora le prestazioni delle parole chiave e ottieni informazioni utili, tutto all'interno di WordPress." @@ -12175,49 +12236,49 @@ msgstr "%1$d pagamento(i) eliminato(i) con successo. %2$d non riuscito(i)." msgid "Failed to delete payments. Please try again." msgstr "Impossibile eliminare i pagamenti. Per favore riprova." -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "Modulo sconosciuto" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "N/D" #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "Subscription" msgstr "Abbonamento" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "Rinnovo" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "Una volta" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "Sconosciuto" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -12233,7 +12294,7 @@ msgstr "È richiesta un'email cliente valida per i pagamenti." #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -12312,7 +12373,7 @@ msgstr "Errore imprevisto: %s" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "ID di abbonamento non trovato." @@ -12375,9 +12436,9 @@ msgstr "Verifica dell'abbonamento" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 +#: inc/payments/stripe/stripe-webhook.php:1120 #, php-format msgid "Subscription ID: %s" msgstr "ID di abbonamento: %s" @@ -12392,13 +12453,13 @@ msgstr "ID di abbonamento: %s" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 #, php-format msgid "Payment Gateway: %s" msgstr "Gateway di Pagamento: %s" @@ -12411,7 +12472,7 @@ msgstr "ID dell'intento di pagamento: %s" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 +#: inc/payments/stripe/stripe-webhook.php:1050 #, php-format msgid "Charge ID: %s" msgstr "ID di addebito: %s" @@ -12421,14 +12482,14 @@ msgstr "ID di addebito: %s" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 +#: inc/payments/stripe/admin-stripe-handler.php:516 #, php-format msgid "Subscription Status: %s" msgstr "Stato dell'abbonamento: %s" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 +#: inc/payments/stripe/stripe-webhook.php:1124 #, php-format msgid "Customer ID: %s" msgstr "ID cliente: %s" @@ -12437,8 +12498,8 @@ msgstr "ID cliente: %s" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 #, php-format msgid "Amount: %1$s %2$s" msgstr "Importo: %1$s %2$s" @@ -12473,7 +12534,7 @@ msgstr "Verifica del pagamento" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 +#: inc/payments/stripe/stripe-webhook.php:1112 #, php-format msgid "Transaction ID: %s" msgstr "ID transazione: %s" @@ -12482,7 +12543,7 @@ msgstr "ID transazione: %s" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 #, php-format msgid "Status: %s" msgstr "Stato: %s" @@ -12850,23 +12911,23 @@ msgid "Unknown error" msgstr "Errore sconosciuto" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "ID di pagamento mancante." -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "Non sei autorizzato a eseguire questa azione." #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "Pagamento non trovato nel database." #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "Questo non è un pagamento di abbonamento." @@ -12876,7 +12937,7 @@ msgid "Subscription cancellation failed." msgstr "La cancellazione dell'abbonamento non è riuscita." #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "Impossibile aggiornare lo stato dell'abbonamento nel database." @@ -12885,58 +12946,58 @@ msgstr "Impossibile aggiornare lo stato dell'abbonamento nel database." msgid "Invalid payment data." msgstr "Dati di pagamento non validi." -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "Solo i pagamenti riusciti o parzialmente rimborsati possono essere rimborsati." -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "ID transazione non corrispondente." -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "Formato ID transazione non valido per il rimborso." -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "Impossibile elaborare il rimborso tramite l'API di Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "Impossibile aggiornare il record di pagamento dopo il rimborso." #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "Rimborso effettuato con successo." #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "Impossibile elaborare il rimborso. Per favore riprova." -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "La sospensione dell'abbonamento non è riuscita." -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "Pieno" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "Parziale" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 #, php-format msgid "Refund ID: %s" msgstr "ID rimborso: %s" @@ -12944,9 +13005,9 @@ msgstr "ID rimborso: %s" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 #, php-format msgid "Refund Amount: %1$s %2$s" msgstr "Importo del rimborso: %1$s %2$s" @@ -12954,9 +13015,9 @@ msgstr "Importo del rimborso: %1$s %2$s" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 #, php-format msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "Totale rimborsato: %1$s %2$s di %3$s %4$s" @@ -12964,9 +13025,9 @@ msgstr "Totale rimborsato: %1$s %2$s di %3$s %4$s" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 #, php-format msgid "Refund Status: %s" msgstr "Stato del rimborso: %s" @@ -12975,10 +13036,10 @@ msgstr "Stato del rimborso: %s" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 #, php-format msgid "Payment Status: %s" msgstr "Stato del pagamento: %s" @@ -12986,132 +13047,132 @@ msgstr "Stato del pagamento: %s" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 #, php-format msgid "Refunded by: %s" msgstr "Rimborsato da: %s" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 #, php-format msgid "Refund Notes: %s" msgstr "Note di rimborso: %s" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 #, php-format msgid "%s Payment Refund" msgstr "Rimborso del pagamento %s" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 #, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "I webhook mantengono SureForms sincronizzato con Stripe aggiornando automaticamente i dati di pagamento e abbonamento. Si prega di %1$s Webhook." -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "configurare" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "Parametri di rimborso non validi forniti." -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "Questo pagamento non è legato a un abbonamento." -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "Solo i pagamenti degli abbonamenti attivi, riusciti o parzialmente rimborsati possono essere rimborsati." -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "La creazione del rimborso Stripe non è riuscita. Si prega di controllare il dashboard di Stripe per ulteriori dettagli." -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "Il rimborso è stato elaborato da Stripe ma non è riuscito ad aggiornare i record locali. Si prega di controllare manualmente i record di pagamento." -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "Pagamento dell'abbonamento rimborsato con successo." #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 +#: inc/payments/stripe/admin-stripe-handler.php:977 #, php-format msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "L'importo del rimborso supera l'importo disponibile. Importo massimo rimborsabile: %1$s %2$s" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "L'importo del rimborso deve essere maggiore di zero." -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "L'importo del rimborso deve essere di almeno $0,50." -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "Impossibile determinare il metodo di rimborso appropriato per questo pagamento dell'abbonamento." #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 +#: inc/payments/stripe/admin-stripe-handler.php:1256 #, php-format msgid "%s Subscription Payment Refund" msgstr "Rimborso del pagamento dell'abbonamento %s" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "Questo pagamento è già stato completamente rimborsato." -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "Il pagamento non è stato trovato in Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "L'importo del rimborso supera l'importo rimborsabile disponibile." -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "Il pagamento per questo abbonamento non è stato trovato." -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "L'abbonamento non è stato trovato in Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "Questo abbonamento non ha pagamenti riusciti da rimborsare." -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "Il metodo di pagamento per questo abbonamento non è valido." -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "Permessi insufficienti per elaborare i rimborsi." -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "Troppe richieste. Per favore riprova tra un momento." -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "Errore di rete. Controlla la tua connessione e riprova." #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 +#: inc/payments/stripe/admin-stripe-handler.php:1308 #, php-format msgid "Subscription refund failed: %s" msgstr "Rimborso dell'abbonamento fallito: %s" @@ -13261,7 +13322,7 @@ msgstr "Annullato alle: %s" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 +#: inc/payments/stripe/stripe-webhook.php:892 #, php-format msgid "Cancellation Reason: %s" msgstr "Motivo della cancellazione: %s" @@ -13280,24 +13341,24 @@ msgstr "Abbonamento annullato" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "Webhook" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "Rimborso annullato" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:882 #, php-format msgid "Canceled Refund Amount: %1$s %2$s" msgstr "Importo del rimborso annullato: %1$s %2$s" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 +#: inc/payments/stripe/stripe-webhook.php:885 #, php-format msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "Rimborso rimanente: %1$s %2$s di %3$s %4$s" @@ -13306,52 +13367,52 @@ msgstr "Rimborso rimanente: %1$s %2$s di %3$s %4$s" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:896 #, php-format msgid "Canceled by: %s" msgstr "Annullato da: %s" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "Pagamento iniziale dell'abbonamento riuscito" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 #, php-format msgid "Invoice ID: %s" msgstr "ID Fattura: %s" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "Stato del pagamento: Riuscito" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "Stato dell'abbonamento: Attivo" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "Pagamento della quota di abbonamento" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "Riuscito" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 +#: inc/payments/stripe/stripe-webhook.php:1126 #, php-format msgid "Customer Email: %s" msgstr "Email del cliente: %s" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 +#: inc/payments/stripe/stripe-webhook.php:1128 #, php-format msgid "Customer Name: %s" msgstr "Nome del cliente: %s" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "Creato tramite ciclo di fatturazione in abbonamento" @@ -13359,19 +13420,20 @@ msgstr "Creato tramite ciclo di fatturazione in abbonamento" msgid "Edit this form" msgstr "Modifica questo modulo" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." msgstr "Il tuo modulo è stato inviato con successo. Esamineremo i tuoi dettagli e ti ricontatteremo presto." #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "L'ID di ingresso è obbligatorio." #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "Voce non trovata." @@ -13571,6 +13633,7 @@ msgstr "Seleziona il campo email che contiene l'email del cliente" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13583,6 +13646,7 @@ msgstr "Base di conoscenza" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13664,6 +13728,7 @@ msgid "Go to Forms" msgstr "Vai a Moduli" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13671,6 +13736,7 @@ msgid "delete" msgstr "elimina" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13679,6 +13745,7 @@ msgid "Please type \"%s\" in the input box" msgstr "Per favore digita \"%s\" nella casella di input" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13687,6 +13754,7 @@ msgid "To confirm, type \"%s\" in the box below:" msgstr "Per confermare, digita \"%s\" nella casella sottostante:" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14113,7 +14181,7 @@ msgstr "Usa l'IA per generare moduli istantaneamente da un semplice prompt." msgid "Build engaging conversational, calculation, and multi-step forms." msgstr "Crea moduli conversazionali, di calcolo e multi-step coinvolgenti." -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "Crea modulo" @@ -14897,22 +14965,22 @@ msgstr "Nota: L'abbonamento è stato annullato definitivamente. Il cliente non v #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "In pausa" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 +#: inc/payments/stripe/admin-stripe-handler.php:521 #, php-format msgid "Paused by: %s" msgstr "Messo in pausa da: %s" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "Nota: La fatturazione dell'abbonamento è stata sospesa. Non verranno addebitati costi fino a quando l'abbonamento non verrà ripreso." -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "Abbonamento in pausa" @@ -14921,6 +14989,7 @@ msgid "This entry will be moved to trash and can be restored later." msgstr "Questa voce verrà spostata nel cestino e potrà essere ripristinata in seguito." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "Imposta il numero totale di invii consentiti per questo modulo." @@ -15048,7 +15117,7 @@ msgstr "È richiesto il valore del campo importo variabile." msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "Importo del pagamento inferiore al minimo. Minimo: %1$s, ricevuto %2$s." -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "(Copia)" @@ -15109,12 +15178,14 @@ msgstr "Questo creerà una copia di \"%s\" con tutte le sue impostazioni." msgid "Pay with credit or debit card" msgstr "Paga con carta di credito o debito" +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 msgid "This form is not yet available. Please check back after the scheduled start time." msgstr "Questo modulo non è ancora disponibile. Si prega di ricontrollare dopo l'orario di inizio programmato." #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "Questo modulo non accetta più invii. Il periodo di invio è terminato." @@ -15133,7 +15204,7 @@ msgstr "Il rimborso non è supportato per il gateway %s." msgid "Number field configuration not found." msgstr "Configurazione del campo numerico non trovata." -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "Parametri di rimborso non validi." @@ -15248,24 +15319,24 @@ msgid "Stripe Settings" msgstr "Impostazioni di Stripe" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 +#: admin/admin.php:1439 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "SureForms %1$s richiede almeno %2$s %3$s per funzionare correttamente. Si prega di aggiornare all'ultima versione." -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "Aggiorna ora" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "SureContact" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "Trasforma le email in entrate con un CRM creato per il tuo sito web!" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "Invia newsletter, gestisci campagne, imposta automazioni, gestisci contatti e vedi esattamente quanto reddito generano le tue email, tutto in un unico posto." @@ -15301,13 +15372,14 @@ msgstr "Posizione del simbolo di valuta" msgid "Select the position of the currency symbol relative to the amount." msgstr "Seleziona la posizione del simbolo della valuta rispetto all'importo." -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -15315,40 +15387,40 @@ msgstr "Seleziona la posizione del simbolo della valuta rispetto all'importo." msgid "Learn" msgstr "Impara" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "Incredibile! SureForms sta alimentando i tuoi moduli e le tue sottomissioni - continuiamo a crescere insieme!" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "Se SureForms ti è stato utile, ti dispiacerebbe prendere un momento per lasciare una recensione a 5 stelle su WordPress.org?" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "Forse più tardi" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "L'ho già fatto" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "SureForms è pronto a potenziare i tuoi moduli — scopri cosa è possibile!" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "Gestisci i tuoi moduli, traccia le sottomissioni e scopri funzionalità come AI Form Builder, integrazioni di pagamento e altro ancora dalla dashboard di SureForms." -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "Vai al cruscotto" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "Lo so già" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "Parametri non validi." @@ -15510,7 +15582,7 @@ msgstr "È richiesto almeno un campo del modulo." msgid "Failed to generate form fields from the provided data." msgstr "Impossibile generare i campi del modulo dai dati forniti." -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "Creazione del modulo non riuscita." @@ -15730,15 +15802,16 @@ msgstr "Campo di testo" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "Questo modulo non è ancora disponibile. Ricontrolla dopo l'orario di inizio programmato." +#: inc/admin/html-form-detector.php:268 #: inc/form-submit.php:99 #: inc/form-submit.php:400 #: inc/form-submit.php:445 -#: inc/form-submit.php:968 +#: inc/form-submit.php:997 #: inc/payments/front-end.php:78 #: inc/payments/front-end.php:263 #: inc/rest-api.php:98 @@ -15752,9 +15825,10 @@ msgstr "Questo modulo non è ancora disponibile. Ricontrolla dopo l'orario di in #: inc/rest-api.php:667 #: inc/rest-api.php:716 #: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 msgid "Security verification failed. Please refresh the page and try again." msgstr "Verifica di sicurezza fallita. Si prega di aggiornare la pagina e riprovare." @@ -15787,19 +15861,19 @@ msgstr "Si prega di controllare il modulo per eventuali errori." msgid "Your submission was flagged as spam. Please try again." msgstr "Il tuo invio è stato segnalato come spam. Per favore riprova." -#: inc/form-submit.php:651 +#: inc/form-submit.php:680 msgid "Unable to submit form. Please try again." msgstr "Impossibile inviare il modulo. Per favore riprova." -#: inc/form-submit.php:903 +#: inc/form-submit.php:932 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "Nessun plugin SMTP rilevato. Si prega di configurare un plugin SMTP per abilitare l'invio di email." -#: inc/form-submit.php:904 +#: inc/form-submit.php:933 msgid "Email sending failed for an unknown reason." msgstr "Invio email fallito per una ragione sconosciuta." -#: inc/form-submit.php:943 +#: inc/form-submit.php:972 msgid "No emails were sent." msgstr "Nessuna email è stata inviata." @@ -15984,7 +16058,7 @@ msgstr "Impossibile creare il pagamento. Si prega di contattare il supporto." msgid "Subscription canceled successfully!" msgstr "Abbonamento annullato con successo!" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "Abbonamento sospeso con successo!" @@ -16016,8 +16090,8 @@ msgstr "Impossibile eliminare il webhook." msgid "Unable to connect to Stripe." msgstr "Impossibile connettersi a Stripe." -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "Questo modulo è chiuso. Il periodo di invio è terminato." @@ -16056,28 +16130,28 @@ msgstr "Azione non valida. Usa \"read\" o \"unread\"." msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "Azione non valida. Usa \"trash\" o \"restore\"." -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "Seleziona almeno un modulo e specifica un'azione." -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "Modulo non trovato o non è un tipo di modulo valido." -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "Questo modulo è già nel cestino." -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "Questo modulo non è nel cestino." -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "Azione non valida." #. translators: %s: action name -#: inc/rest-api.php:1100 +#: inc/rest-api.php:1124 #, php-format msgid "Failed to %s this form. Please try again." msgstr "Impossibile %s questo modulo. Per favore riprova." @@ -16220,10 +16294,6 @@ msgstr "Informazioni di ingresso" msgid "Resend Email Notification" msgstr "Invia nuovamente la notifica email" -#: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." -msgstr "Quando abilitato, questo modulo non memorizzerà l'IP dell'utente, il nome del browser o il nome del dispositivo nelle voci." - #: assets/build/formEditor.js:172 msgid "Select a spam protection service. Configure API keys in Global Settings before enabling." msgstr "Seleziona un servizio di protezione antispam. Configura le chiavi API nelle Impostazioni Globali prima di abilitare." @@ -16691,26 +16761,27 @@ msgstr "Segreto del webhook non configurato." msgid "Invalid webhook signature." msgstr "Firma del webhook non valida." -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "Quiz" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "Voci del quiz" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "Nuovo" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1006 msgid "Invalid form." msgstr "Modulo non valido." -#: inc/form-submit.php:982 +#: inc/form-submit.php:1011 msgid "Too many requests. Please try again shortly." msgstr "Troppe richieste. Si prega di riprovare a breve." @@ -16922,10 +16993,6 @@ msgstr "Informativa sulla privacy" msgid "Finish" msgstr "Finire" -#: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." -msgstr "Scegli un metodo di protezione antispam per questo modulo per prevenire invii indesiderati." - #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Send entries to 100+ popular apps." @@ -17005,6 +17072,7 @@ msgstr "Crea quiz coinvolgenti con SureForms" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "Trasforma i tuoi moduli in quiz potenti. Passa a SureForms per sbloccare le funzionalità dei quiz:" +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/surveyEmptyState.js:172 msgid "Upgrade to SureForms" @@ -17222,39 +17290,45 @@ msgstr "Perfetto per l'istruzione, la formazione e i quiz divertenti" msgid "Select this to create a quiz with scored questions and graded results." msgstr "Seleziona questo per creare un quiz con domande a punteggio e risultati valutati." -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "Rapporti di indagine" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "Intestazione 1" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "Intestazione 2" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "Intestazione 3" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "Intestazione 4" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "Intestazione 5" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "Intestazione 6" @@ -17271,7 +17345,7 @@ msgid "Cancellation not supported for this gateway." msgstr "Annullamento non supportato per questo gateway." #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "Abbonamento annullato con successo." @@ -17488,10 +17562,6 @@ msgstr "Configura la chiave API di Google Maps per il completamento automatico d msgid "Help shape the future of SureForms" msgstr "Aiuta a plasmare il futuro di SureForms" -#: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " -msgstr "Condividi come utilizzi il plugin in modo che possiamo sviluppare funzionalità che contano, risolvere i problemi più velocemente e prendere decisioni più intelligenti." - #: assets/build/settings.js:172 msgid "Enable Google Address Autocomplete" msgstr "Abilita il completamento automatico degli indirizzi di Google" @@ -17576,16 +17646,16 @@ msgstr "Złoty polacco" msgid "Dynamic Default Value" msgstr "Valore predefinito dinamico" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "Ehi! Sembra che tu stia creando un modulo. Crea un modulo pronto all'uso in meno di 30 secondi con SureForms AI, senza bisogno di configurazioni aggiuntive." -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "Post non valido." -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "Non puoi modificare questo post." @@ -17624,7 +17694,7 @@ msgid "Error creating SureForms Form." msgstr "Errore nella creazione del modulo SureForms." #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 #, php-format msgid "Please enter at least %s characters." @@ -17782,22 +17852,374 @@ msgstr "La risposta dell'IA era vuota. Per favore, perfeziona il tuo prompt e ri msgid "Unable to build form fields from the AI response." msgstr "Impossibile creare i campi del modulo dalla risposta dell'AI." -#: inc/post-types.php:205 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "Voci parziali" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." +msgstr "Questo modulo è ora chiuso poiché abbiamo ricevuto tutte le iscrizioni." + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." +msgstr "Scheda delle impostazioni non valida." + +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "Grazie per averci contattato! Saremo in contatto con te a breve." + +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "Utilizza l'azione di ripristino per recuperare un modulo cestinato prima di passarlo a bozza." + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "Questo modulo è già una bozza." + +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "Non hai il permesso di modificare questo modulo." + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "ID modulo non valido." + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "Impostazioni del modulo salvate." + +#: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "Il limite di inserimento si basa sulle voci memorizzate per contare le sottomissioni. Quando nelle Impostazioni di Conformità è abilitata l'opzione \"Non memorizzare mai i dati di inserimento dopo l'invio del modulo\", questo limite non verrà applicato. Disabilita quell'opzione o rimuovi il limite di inserimento per utilizzare questa funzione." + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "Segnaposto per voci parziali" + +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "Testo segnaposto mostrato all'interno dell'input/textarea vuoto o come prima opzione vuota in un menu a discesa." + +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "Array di campi prodotti dal parser lato editor." + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "HTML grezzo della sorgente . Necessario quando la fiducia del parser è bassa, così possiamo consegnare il markup al middleware AI." + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "Descrittore di stile a miglior sforzo (colori esadecimali) estratto dagli stili inline sul di origine." + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "Non ti è permesso convertire i moduli HTML." + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "Modulo convertito" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "Il modulo HTML è troppo grande per essere convertito. Si prega di semplificare il markup o costruire il modulo manualmente." + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "Non è stato possibile derivare alcun campo dal modulo fornito." + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "Il servizio SureForms AI non è riuscito a elaborare questo modulo. Riprova o crea il modulo manualmente." + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "Il servizio SureForms AI ha restituito una risposta inutilizzabile. Riprova o crea il modulo manualmente." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "Usa un tag intelligente come {get_input:country}. La prima opzione il cui titolo corrisponde al valore risolto sarà preselezionata." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "Usa un tag intelligente come {get_input:colors} e passa valori separati da pipe nell'URL (ad esempio ?colors=Red|Blue). Ogni opzione il cui titolo corrisponde a un valore sarà selezionata. Puoi anche concatenare più tag intelligenti separati da pipe." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "Usa un tag intelligente come {get_input:colors} e passa valori separati da pipe nell'URL (ad esempio ?colors=Red|Blue). Ogni opzione il cui etichetta corrisponde a un valore sarà preselezionata. Puoi anche concatenare più tag intelligenti separati da pipe." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "Usa un tag intelligente come {get_input:country}. La prima opzione il cui etichetta corrisponde al valore risolto sarà preselezionata." + +#: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "Impostazioni salvate, ma gli attributi del post (password / titolo / contenuto) non sono stati aggiornati. Riprova per mantenerli." + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "Impossibile salvare le impostazioni del modulo." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "Salvataggio in corso…" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." +msgstr "Quando abilitato, questo modulo non memorizzerà l'IP dell'utente, il nome del browser e il nome del dispositivo nelle voci." + +#: assets/build/formEditor.js:172 +msgid "Failed to save. Please try again." +msgstr "Salvataggio non riuscito. Per favore riprova." + +#: assets/build/formEditor.js:172 +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "Le chiavi API di reCAPTCHA per la versione selezionata non sono configurate. Impostale nelle Impostazioni Globali." + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "Si prega di selezionare una versione di reCAPTCHA." + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "Le chiavi API di hCaptcha non sono configurate. Impostale nelle Impostazioni Globali." + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." +msgstr "Le chiavi API di Cloudflare Turnstile non sono configurate. Impostale nelle Impostazioni Globali." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "Dati del modulo" + +#: assets/build/formEditor.js:172 +msgid "Some fields need attention" +msgstr "Alcuni campi necessitano di attenzione" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Unsaved changes" +msgstr "Modifiche non salvate" + +#: assets/build/formEditor.js:172 +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "È necessario un indirizzo email del destinatario e una riga dell'oggetto prima che questa notifica possa essere salvata. Correggi i campi evidenziati o annulla le modifiche per tornare indietro." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "Hai modifiche non salvate per questa notifica. Scartale per tornare indietro o rimani per salvarle." + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "Annulla e torna indietro" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "Rimani e ripara" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" +msgstr "Continua a modificare" + +#: assets/build/formEditor.js:172 +msgid "Please provide a recipient email address." +msgstr "Si prega di fornire un indirizzo email del destinatario." + +#: assets/build/formEditor.js:172 +msgid "Please provide a subject line." +msgstr "Si prega di fornire un oggetto." + +#: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "Si prega di fornire un URL personalizzato." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "Hai modifiche non salvate. Scartale per continuare o rimani per salvare le tue modifiche." + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "Scarta e continua" + +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "Passa a Bozza" + +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "%d modulo cambiato in bozza." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "Passare il modulo a bozza?" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "%d modulo verrà spostato in bozza e non sarà più accessibile pubblicamente." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "Questo modulo verrà convertito in bozza e non sarà più accessibile pubblicamente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "SureForms non è riuscito ad autenticare questa richiesta. Ricarica l'editor e riprova." + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "%s — Forma convertita" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "Modulo convertito in SureForms utilizzando l'IA. Rivedi il nuovo modulo per eventuali modifiche." + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "Modulo convertito in SureForms." + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "Non hai il permesso di convertire questo modulo." + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "Questo modulo è troppo grande per essere convertito. Prova a semplificare il markup o a costruire il modulo manualmente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "SureForms non è riuscito a derivare alcun campo da questo modulo." + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "Il servizio SureForms AI non è riuscito a elaborare questo modulo. Si prega di riprovare o di creare il modulo manualmente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "SureForms ha ricevuto una risposta inaspettata. Per favore riprova." + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "Impossibile convertire questo modulo in SureForms. Per favore riprova." + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "Conversione in corso…" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "Converti in SureForms" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "Acquisisci i dati del modulo in corso nel momento in cui i visitatori smettono di digitare — non è necessario inviare" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "Recupera le presentazioni abbandonate e segui i potenziali clienti che altrimenti perderesti" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "Consenti ai visitatori di riprendere da dove avevano interrotto con link di ripresa sicuri e condivisibili" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "Smetti di perdere contatti a causa di moduli abbandonati" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "Scopri cosa hanno digitato i visitatori prima di andarsene. Passa a SureForms Premium per sbloccare le Voci Parziali:" + +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "Impostazioni predefinite globali" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "Restrizioni del modulo" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "Configura le impostazioni predefinite che si applicano ai moduli appena creati." + +#: assets/build/settings.js:172 +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " +msgstr "Raccogli informazioni non sensibili dal tuo sito web, come la versione PHP e le funzionalità utilizzate, per aiutarci a correggere i bug più velocemente, prendere decisioni più intelligenti e sviluppare funzionalità che contano davvero per te. " + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." +msgstr "Caricamento delle pagine non riuscito. Si prega di aggiornare e riprovare." + +#: assets/build/settings.js:172 +msgid "Failed to load settings. Please refresh and try again." +msgstr "Caricamento delle impostazioni non riuscito. Si prega di aggiornare e riprovare." + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "I campi di convalida del modulo non possono essere lasciati vuoti." + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "L'email del destinatario è necessaria quando i riepiloghi email sono abilitati." + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "Si prega di inserire un'email del destinatario valida." + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "Impostazioni salvate." + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "Impossibile salvare le impostazioni." + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "Alcune impostazioni non sono state salvate. Riprova." + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." +msgstr "Alcuni campi hanno modifiche non salvate. Scartale per continuare, oppure rimani per salvare le tue modifiche." + +#: assets/build/settings.js:172 +msgid "Discard & switch" +msgstr "Scarta e cambia" + +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "Moduli" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "Modulo" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "Moduli" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "Aggiungi nuovo" @@ -18206,6 +18628,7 @@ msgstr "account" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "Normale" diff --git a/languages/sureforms-nl_NL-1cb9ecd067cd971ff5d9db0b4dae2891.json b/languages/sureforms-nl_NL-1cb9ecd067cd971ff5d9db0b4dae2891.json index e0590a4f6..870fd5d4c 100644 --- a/languages/sureforms-nl_NL-1cb9ecd067cd971ff5d9db0b4dae2891.json +++ b/languages/sureforms-nl_NL-1cb9ecd067cd971ff5d9db0b4dae2891.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formulier"],"Fields":["Velden"],"Image":["Afbeelding"],"Activated":["Geactiveerd"],"Activate":["Activeren"],"Submit":["Indienen"],"Global Settings":["Globale instellingen"],"This field is required.":["Dit veld is verplicht."],"Form Title":["Formuliertitel"],"Edit":["Bewerken"],"Please enter a valid URL.":["Voer een geldige URL in."],"Desktop":["Bureaublad"],"Medium":["Middelgroot"],"Mobile":["Mobiel"],"Repeat":["Herhaal"],"Scroll":["Scrollen"],"Signature":["Handtekening"],"Tablet":["Tablet"],"Upload":["Uploaden"],"Basic":["Basis"],"Form Settings":["Formulierinstellingen"],"General":["Algemeen"],"Style":["Stijl"],"Advanced":["Geavanceerd"],"No tags available":["Geen tags beschikbaar"],"Device":["Apparaat"],"Select Shortcodes":["Selecteer shortcodes"],"Page Break Label":["Pagina-einde label"],"Next":["Volgende"],"Back":["Terug"],"Reset":["Resetten"],"Generic tags":["Algemene tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecteer eenheden"],"%s units":["%s eenheden"],"Margin":["Marge"],"None":["Geen"],"Custom":["Aangepast"],"Please add a option props to MultiButtonsControl":["Voeg alstublieft een optie-eigenschap toe aan MultiButtonsControl"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"Processing\u2026":["Bezig met verwerken\u2026"],"Select Video":["Selecteer video"],"Change Video":["Video wijzigen"],"Select Lottie Animation":["Selecteer Lottie-animatie"],"Change Lottie Animation":["Wijzig Lottie-animatie"],"Upload SVG":["SVG uploaden"],"Change SVG":["SVG wijzigen"],"Select Image":["Selecteer afbeelding"],"Change Image":["Afbeelding wijzigen"],"Upload SVG?":["SVG uploaden?"],"Upload SVG can be potentially risky. Are you sure?":["Het uploaden van SVG kan potentieel riskant zijn. Weet je het zeker?"],"Upload Anyway":["Toch uploaden"],"Full Width":["Volledige breedte"],"Install":["Installeren"],"Plugin Installation failed, Please try again later.":["Installatie van de plugin mislukt, probeer het later opnieuw."],"Plugin activation failed, Please try again later.":["Plug-in activering mislukt, probeer het later opnieuw."],"Integrations":["Integraties"],"%s Removed from Quick Action Bar.":["%s verwijderd van de snelle actiebalk."],"Add to Quick Action Bar":["Toevoegen aan de Snelle Actiebalk"],"%s Added to Quick Action Bar.":["%s toegevoegd aan de Snelle Actiebalk."],"Already Present in Quick Action Bar":["Al aanwezig in de snelle actiebalk"],"No results found.":["Geen resultaten gevonden."],"data object is empty":["gegevensobject is leeg"],"Add blocks to Quick Action Bar":["Blokken toevoegen aan de Snelle Actiebalk"],"Re-arrange block inside Quick Action Bar":["Blok herschikken in de Snelle Actiebalk"],"Upgrade":["Upgrade"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installeren & Activeren"],"Compliance Settings":["Instellingen voor naleving"],"Enable GDPR Compliance":["Schakel GDPR-naleving in"],"Never store entry data after form submission":["Sla nooit invoergegevens op na het indienen van het formulier"],"When enabled this form will never store Entries.":["Wanneer ingeschakeld, zal dit formulier nooit inzendingen opslaan."],"Automatically delete entries":["Automatisch items verwijderen"],"When enabled this form will automatically delete entries after a certain period of time.":["Wanneer ingeschakeld, zal dit formulier automatisch inzendingen na een bepaalde periode verwijderen."],"Entries older than the days set will be deleted automatically.":["Inzendingen ouder dan de ingestelde dagen worden automatisch verwijderd."],"Custom CSS":["Aangepaste CSS"],"The following CSS styles added below will only apply to this form container.":["De volgende CSS-stijlen die hieronder worden toegevoegd, zijn alleen van toepassing op deze formuliercontainer."],"Visual":["Visueel"],"HTML":["HTML"],"All Data":["Alle gegevens"],"Add Shortcode":["Voeg shortcode toe"],"Form input tags":["Formulierveldlabels"],"Comma separated values are also accepted.":["Door komma's gescheiden waarden worden ook geaccepteerd."],"Email Notification":["E-mailmelding"],"Name":["Naam"],"Send Email To":["E-mail verzenden naar"],"Subject":["Onderwerp"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Antwoord aan"],"Add Notification":["Melding toevoegen"],"Email Notification disabled successfully.":["E-mailmelding succesvol uitgeschakeld."],"Email Notification enabled successfully.":["E-mailmelding succesvol ingeschakeld."],"Add Key":["Sleutel toevoegen"],"Add Value":["Waarde toevoegen"],"Add":["Toevoegen"],"Confirmation Message":["Bevestigingsbericht"],"After Form Submission":["Na het indienen van het formulier"],"Hide Form":["Formulier verbergen"],"Reset Form":["Formulier opnieuw instellen"],"Custom URL":["Aangepaste URL"],"Add Query Parameters":["Queryparameters toevoegen"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Selecteer of u sleutel-waardeparen wilt toevoegen voor formuliervelden om op te nemen in queryparameters"],"Query Parameters":["Queryparameters"],"Please select a page.":["Selecteer een pagina."],"Suggestion: URL should use HTTPS":["Suggestie: URL moet HTTPS gebruiken"],"Success Message":["Succesbericht"],"Redirect":["Doorsturen"],"Redirect to":["Doorsturen naar"],"Page":["Pagina"],"Form Confirmation":["Formulierbevestiging"],"Confirmation Type":["Bevestigingstype"],"Use Labels as Placeholders":["Gebruik labels als placeholders"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Bovenstaande instelling plaatst de labels binnen de velden als placeholders (waar mogelijk). Deze instelling is alleen van toepassing op de live pagina, niet in de voorbeeldweergave van de editor."],"Page Break":["Pagina-einde"],"Show Labels":["Labels weergeven"],"First Page Label":["Eerste paginalabel"],"Progress Indicator":["Voortgangsindicator"],"Progress Bar":["Voortgangsbalk"],"Connector":["Connector"],"Steps":["Stappen"],"Next Button Text":["Volgende knoptekst"],"Back Button Text":["Terugknoptekst"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Weet je zeker dat je wilt afsluiten? Je niet-opgeslagen wijzigingen gaan verloren omdat je enkele validatiefouten hebt."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Er zijn enkele niet-opgeslagen wijzigingen. Sla uw wijzigingen op om de updates door te voeren."],"Form Behavior":["Formuliergedrag"],"Clear":["Duidelijk"],"Select Color":["Selecteer kleur"],"Primary Color":["Primaire kleur"],"Text Color":["Tekstkleur"],"Text Color on Primary":["Tekstkleur op primair"],"Field Spacing":["Veldafstand"],"Small":["Klein"],"Large":["Groot"],"Left":["Links"],"Center":["Centrum"],"Right":["Rechts"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Onzichtbaar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Datumkiezer"],"Time Picker":["Tijdkiezer"],"Hidden":["Verborgen"],"Slider":["Schuifregelaar"],"Rating":["Beoordeling"],"Upgrade to Unlock These Fields":["Upgrade om deze velden te ontgrendelen"],"Add Block":["Blok toevoegen"],"Customize with SureForms":["Pas aan met SureForms"],"Page break":["Pagina-einde"],"Previous":["Vorige"],"Thank you":["Dank je"],"Form submitted successfully!":["Formulier succesvol ingediend!"],"Instant Form":["Direct formulier"],"Enable Instant Form":["Instant Form inschakelen"],"Enable Preview":["Voorbeeld inschakelen"],"Show Title":["Toon titel"],"Site Logo":["Site-logo"],"Banner Background":["Banner Achtergrond"],"Color":["Kleur"],"Upload Image":["Afbeelding uploaden"],"Background Color":["Achtergrondkleur"],"Use banner as page background":["Gebruik banner als paginabackground"],"Form Width":["Formulierbreedte"],"URL":["URL"],"URL Slug":["URL-slug"],"The last part of the URL.":["Het laatste deel van de URL."],"Learn more.":["Meer informatie."],"SureForms Description":["SureForms Beschrijving"],"Form Options":["Formulieropties"],"Form Shortcode":["Formulier Shortcode"],"Paste this shortcode on the page or post to render this form.":["Plaats deze shortcode op de pagina of het bericht om dit formulier weer te geven."],"Spam Protection":["Spam Bescherming"],"Auto":["Auto"],"Normal":["Normaal"],"%":["%"],"Top":["Top"],"Bottom":["Onderkant"],"Solid":["Solide"],"Width":["Breedte"],"Size":["Grootte"],"EM":["EM"],"Padding":["Opvulling"],"Color 1":["Kleur 1"],"Color 2":["Kleur 2"],"Type":["Type"],"Linear":["Lineair"],"Radial":["Radiaal"],"Location 1":["Locatie 1"],"Location 2":["Locatie 2"],"Angle":["Hoek"],"Classic":["Klassiek"],"Gradient":["Gradi\u00ebnt"],"Background":["Achtergrond"],"Cover":["Omslag"],"Contain":["Bevatten"],"Overlay":["Overlay"],"No Repeat":["Geen herhaling"],"Overlay Opacity":["Overlay-opaciteit"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Klasnamen moeten gescheiden worden door spaties. Elke klasnaam mag niet beginnen met een cijfer, streepje of onderstrepingsteken. Ze mogen alleen letters (inclusief Unicode-tekens), cijfers, streepjes en onderstrepingstekens bevatten."],"Conversational Layout":["Gespreksindeling"],"Unlock Conversational Forms":["Ontgrendel Gespreksformulieren"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Met het SureForms Pro Plan kun je je formulieren omzetten in boeiende, conversatiegerichte lay-outs voor een naadloze gebruikerservaring."],"Premium":["Premium"],"Overlay Type":["Overlaytype"],"Image Overlay Color":["Afbeelding Overlay Kleur"],"Image Position":["Afbeeldingspositie"],"Attachment":["Bijlage"],"Fixed":["Vast"],"Blend Mode":["Overvloeimodus"],"Multiply":["Vermenigvuldigen"],"Screen":["Scherm"],"Darken":["Verduisteren"],"Lighten":["Verlichten"],"Color Dodge":["Kleur Dodge"],"Saturation":["Verzadiging"],"Repeat-x":["Herhaal-x"],"Repeat-y":["Herhaal-y"],"PX":["PX"],"Button":["Knop"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Verbind met OttoKit"],"SUREFORMS PREMIUM FIELDS":["SUREFORMS PREMIUM VELDEN"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd."],"We strongly recommend that you install the free ":["We raden ten zeerste aan dat u de gratis installeert"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! De Setup Wizard maakt het gemakkelijk om je e-mails te repareren."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Probeer afwisselend een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Voer een geldig e-mailadres in. Uw meldingen worden niet verzonden als het veld niet correct is ingevuld."],"From Name":["Van Naam"],"From Email":["Van e-mail"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website domein (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd."],"Border Radius":["Randstraal"],"Form Theme":["Formulier Thema"],"Instant Form Padding":["Directe Formuliervulling"],"Instant Form Border Radius":["Directe Formulier Randstraal"],"Select Gradient":["Selecteer verloop"],"Upgrade Now":["Nu upgraden"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Inzendingen ouder dan de geselecteerde dagen worden verwijderd."],"Entries Time Period":["Invoerperiode"],"Custom CSS Panel":["Aangepast CSS-paneel"],"Notifications can use only one From Email so please enter a single address.":["Meldingen kunnen slechts \u00e9\u00e9n Van E-mailadres gebruiken, dus voer alstublieft \u00e9\u00e9n enkel adres in."],"Email Notifications":["E-mailmeldingen"],"Actions":["Acties"],"Duplicate":["Duplicaat"],"Delete":["Verwijderen"],"Select Page to redirect":["Selecteer pagina om te omleiden"],"Search for a page":["Zoek naar een pagina"],"Select a page":["Selecteer een pagina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Login":["Inloggen"],"Register":["Registreren"],"Date":["Datum"],"Advanced Settings":["Geavanceerde instellingen"],"Form Restriction":["Formulierbeperking"],"Maximum Number of Entries":["Maximaal aantal vermeldingen"],"Maximum Entries":["Maximale invoer"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["De instelling voor de tijdsperiode werkt volgens de tijdzone van je WordPress-site. Klik hier<\/a> om je WordPress Algemene Instellingen te openen, waar je deze kunt controleren en bijwerken."],"Click here":["Klik hier"],"Response Description After Maximum Entries":["Beschrijving van de reactie na maximale invoer"],"All changes will be saved automatically when you press back.":["Alle wijzigingen worden automatisch opgeslagen wanneer u op terug drukt."],"Repeater":["Herhaler"],"OttoKit Settings":["OttoKit-instellingen"],"Get Started":["Beginnen"],"Connect Native Integrations with SureForms":["Verbind native integraties met SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Verwacht formaat voor e-mails - email@sureforms.com of John Doe "],"Payment":["Betaling"],"%s - Order ID":["%s - Bestel-ID"],"%s - Amount":["%s - Bedrag"],"%s - Customer Email":["%s - Klant e-mail"],"%s - Customer Name":["%s - Klantnaam"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["Voeg aangepaste CSS-regels toe om dit specifieke formulier onafhankelijk van globale stijlen te stylen."],"Spam Protection Type":["Type spambeveiliging"],"Select Security Type":["Selecteer beveiligingstype"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Opmerking: Het gebruik van verschillende reCAPTCHA-versies (V2 checkbox en V3) op dezelfde pagina zal conflicten tussen de versies veroorzaken. Vermijd alstublieft het gebruik van verschillende versies op dezelfde pagina."],"Select Version":["Selecteer versie"],"Please configure the API keys correctly from the settings":["Configureer de API-sleutels correct via de instellingen"],"Control email alerts sent to admins or users after a form submission.":["Beheer e-mailmeldingen die naar beheerders of gebruikers worden verzonden na een formulierinzending."],"Customize the confirmation message or redirect the users after submitting the form.":["Pas het bevestigingsbericht aan of leid de gebruikers om nadat ze het formulier hebben ingediend."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Stel limieten in voor het aantal keren dat een formulier kan worden ingediend en beheer nalevingsopties, waaronder AVG en gegevensbewaring."],"Go to OttoKit Settings":["Ga naar OttoKit-instellingen"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Verbind SureForms met je favoriete apps om taken te automatiseren en gegevens naadloos te synchroniseren."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Ontgrendel krachtige integraties in het Premium-plan om uw workflows te automatiseren en SureForms direct te verbinden met uw favoriete tools."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Stuur formulierinzendingen rechtstreeks naar CRM's, e-mail en marketingplatforms."],"Automate repetitive tasks with seamless data syncing.":["Automatiseer repetitieve taken met naadloze gegevenssynchronisatie."],"Access exclusive native integrations for faster workflows.":["Toegang tot exclusieve native integraties voor snellere workflows."],"PDF Generation":["PDF-generatie"],"Generate and customize PDF copies of form submissions.":["Genereer en pas PDF-kopie\u00ebn van formulierinzendingen aan."],"Generate Submission PDFs":["Genereer indienings-PDF's"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Zet elke formulierinvoer om in een gepolijste PDF-bestand, waardoor het perfect is voor rapporten, archieven of om te delen."],"Automatically generate PDFs from your form submissions.":["Genereer automatisch PDF's van uw formulierinzendingen."],"Customize PDF templates with your branding.":["Pas PDF-sjablonen aan met uw branding."],"Download or email PDFs instantly.":["Download of e-mail PDF's direct."],"User Registration":["Gebruikersregistratie"],"Onboard new users or update existing accounts through beautiful looking forms.":["Nieuwe gebruikers onboarden of bestaande accounts bijwerken via prachtig uitziende formulieren."],"Register Users with SureForms":["Registreer gebruikers met SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Stroomlijn het gehele onboardingproces voor gebruikers op uw sites met naadloze, formuliergestuurde logins en registraties."],"Register new users directly via your form submissions.":["Registreer nieuwe gebruikers direct via uw formulierinzendingen."],"Create or update existing accounts by mapping form data to user fields.":["Maak nieuwe accounts aan of werk bestaande accounts bij door formuliergegevens aan gebruikersvelden te koppelen."],"Assign roles and control access automatically.":["Wijs rollen toe en beheer de toegang automatisch."],"Post Feed":["Berichtenfeed"],"Transform your form submission into WordPress posts.":["Transformeer je formulierinzending in WordPress-berichten."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Zet automatisch formulierinzendingen om in WordPress-berichten, pagina's of aangepaste berichttypen. Bespaar veel tijd en laat je formulieren direct content publiceren."],"Create posts, pages, or CPTs from your form entries.":["Maak berichten, pagina's of CPT's van uw formulierinzendingen."],"Map form fields to your post fields easily.":["Wijs formulier velden eenvoudig toe aan je berichtvelden."],"Automate the content publishing flow with few simple steps.":["Automatiseer de inhoudspublicatiestroom met een paar eenvoudige stappen."],"Automations":["Automatiseringen"],"Unlock Advanced Styling":["Ontgrendel geavanceerde opmaak"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Krijg volledige controle over het uiterlijk van uw formulier met aangepaste kleuren, lettertypen en lay-outs."],"Button Alignment":["Knopuitlijning"],"Add Custom CSS Class(es)":["Voeg Aangepaste CSS Klasse(n) Toe"],"Set the total number of submissions allowed for this form.":["Stel het totale aantal toegestane inzendingen voor dit formulier in."],"Save & Progress":["Opslaan & Voortgang"],"Allow users to save their progress and continue form completion later.":["Sta gebruikers toe hun voortgang op te slaan en later verder te gaan met het invullen van het formulier."],"Save & Progress in SureForms":["Opslaan & Verdergaan in SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Geef uw gebruikers de flexibiliteit om formulieren in hun eigen tempo in te vullen door hen toe te staan hun voortgang op te slaan en op elk moment terug te keren."],"Let users pause long or multi-step forms and continue later.":["Laat gebruikers lange of meerstapsformulieren pauzeren en later doorgaan."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Verminder het verlaten van formulieren met handige hervattingslinks en krijg overal toegang tot hun voortgang."],"Improve user experience for lengthy, complex, or multi-page forms.":["Verbeter de gebruikerservaring voor lange, complexe of meerpaginaformulieren."],"This form is not yet available. Please check back after the scheduled start time.":["Dit formulier is nog niet beschikbaar. Kom na de geplande starttijd terug."],"This form is no longer accepting submissions. The submission period has ended.":["Dit formulier accepteert geen inzendingen meer. De inzendperiode is afgelopen."],"The start date and time must be before the end date and time.":["De startdatum en -tijd moeten v\u00f3\u00f3r de einddatum en -tijd liggen."],"Form Scheduling":["Formulierplanning"],"Enable Form Scheduling":["Formulierplanning inschakelen"],"Set a time period during which this form will be available for submissions.":["Stel een periode in waarin dit formulier beschikbaar zal zijn voor inzendingen."],"Start Date & Time":["Startdatum en tijd"],"End Date & Time":["Einddatum en tijd"],"Response Description Before Start Date":["Reactiebeschrijving v\u00f3\u00f3r de startdatum"],"Response Description After End Date":["Reactiebeschrijving na einddatum"],"Conditional Confirmations":["Voorwaardelijke Bevestigingen"],"Set up the message or redirect users will see after submitting the form.":["Stel het bericht in of leid gebruikers om dat ze zullen zien na het indienen van het formulier."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Toon het juiste bericht aan de juiste gebruiker op basis van hun reactie. Personaliseer bevestigingen met slimme voorwaarden en begeleid gebruikers automatisch naar de volgende beste stap."],"Display different confirmation messages based on form responses.":["Toon verschillende bevestigingsberichten op basis van formulierreacties."],"Redirect users to specific pages or URLs conditionally.":["Leid gebruikers voorwaardelijk naar specifieke pagina's of URL's om."],"Create personalized thank-you messages without extra forms.":["Maak gepersonaliseerde bedankberichten zonder extra formulieren."],"Lost Password":["Wachtwoord Vergeten"],"Reset Password":["Wachtwoord opnieuw instellen"],"When enabled, this form will not store user IP, browser name, or device name in entries.":["Wanneer ingeschakeld, zal dit formulier geen gebruikers-IP, browsernaam of apparaatsnaam opslaan in inzendingen."],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Selecteer een spambeveiligingsdienst. Configureer API-sleutels in de globale instellingen voordat u deze inschakelt."],"Send as Raw HTML":["Als ruwe HTML verzenden"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Wanneer ingeschakeld, wordt de HTML van de e-mailtekst exact bewaard zoals geschreven en verpakt in een professioneel e-mailsjabloon."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Smart tags die verwijzen naar door gebruikers ingediende velden, worden niet ge\u00ebscaped in de ruwe HTML-modus. Vermijd het direct invoegen van niet-vertrouwde veldwaarden in de e-mailinhoud."],"Please provide a recipient email address and subject line.":["Geef alstublieft een e-mailadres van de ontvanger en een onderwerpregel op."],"Email notification duplicated!":["E-mailmelding gedupliceerd!"],"Are you sure you want to delete this email notification?":["Weet je zeker dat je deze e-mailmelding wilt verwijderen?"],"Email notification deleted!":["E-mailmelding verwijderd!"],"URL is missing Top Level Domain (TLD).":["URL mist het Top Level Domain (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Dit formulier is nu gesloten omdat het maximale aantal inzendingen is ontvangen."],"Publish Your Form":["Publiceer uw formulier"],"Enable This to Instantly Publish the Form":["Schakel dit in om het formulier direct te publiceren"],"Style Your Instant Form Page Here":["Stijl hier je instant formulierpagina"],"Quizzes":["Quizzen"],"%s - Description":["%s - Beschrijving"],"Choose a spam protection method for this form to prevent unwanted submissions.":["Kies een spambeveiligingsmethode voor dit formulier om ongewenste inzendingen te voorkomen."],"Send entries to 100+ popular apps.":["Verzend inzendingen naar meer dan 100 populaire apps."],"Build automated workflows that run instantly.":["Bouw geautomatiseerde workflows die direct worden uitgevoerd."],"Create custom app integrations using our Custom App feature.":["Maak aangepaste app-integraties met behulp van onze functie Aangepaste App."],"Keep your tools in sync automatically.":["Houd je gereedschap automatisch gesynchroniseerd."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Hiermee wordt OttoKit op je WordPress-site ge\u00efnstalleerd en geactiveerd om automatiseringsfuncties mogelijk te maken."],"Automate Your Forms with OttoKit":["Automatiseer uw formulieren met OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Elke formulierinzending zou iets moeten activeren \u2014 een Slack-melding, een CRM-lead, een opvolg-e-mail of een nieuwe rij in Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Maak interactieve quizzen om je publiek te betrekken en inzichten te verzamelen."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Ontwerp boeiende quizzen met verschillende vraagtypen, gepersonaliseerde feedback en geautomatiseerde scoring om je publiek te boeien en waardevolle inzichten te verkrijgen."],"Create interactive quizzes with multiple question types.":["Maak interactieve quizzen met meerdere vraagtypen."],"Provide personalized feedback based on user responses.":["Geef gepersonaliseerde feedback op basis van gebruikersreacties."],"Automate scoring and lead segmentation for better insights.":["Automatiseer scoring en leadsegmentatie voor betere inzichten."],"Heading 1":["Kop 1"],"Heading 2":["Kop 2"],"Heading 3":["Kop 3"],"Heading 4":["Kop 4"],"Heading 5":["Kop 5"],"Heading 6":["Kop 6"],"Quill heading picker: default paragraph style\u0004Normal":["Normaal"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formulier"],"Fields":["Velden"],"Image":["Afbeelding"],"Activated":["Geactiveerd"],"Activate":["Activeren"],"Submit":["Indienen"],"Global Settings":["Globale instellingen"],"Form Title":["Formuliertitel"],"Edit":["Bewerken"],"Please enter a valid URL.":["Voer een geldige URL in."],"Desktop":["Bureaublad"],"Medium":["Middelgroot"],"Mobile":["Mobiel"],"Repeat":["Herhaal"],"Scroll":["Scrollen"],"Signature":["Handtekening"],"Tablet":["Tablet"],"Upload":["Uploaden"],"Basic":["Basis"],"Form Settings":["Formulierinstellingen"],"General":["Algemeen"],"Style":["Stijl"],"Advanced":["Geavanceerd"],"No tags available":["Geen tags beschikbaar"],"Device":["Apparaat"],"Select Shortcodes":["Selecteer shortcodes"],"Page Break Label":["Pagina-einde label"],"Next":["Volgende"],"Back":["Terug"],"Reset":["Resetten"],"Generic tags":["Algemene tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecteer eenheden"],"%s units":["%s eenheden"],"Margin":["Marge"],"None":["Geen"],"Custom":["Aangepast"],"Please add a option props to MultiButtonsControl":["Voeg alstublieft een optie-eigenschap toe aan MultiButtonsControl"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"Processing\u2026":["Bezig met verwerken\u2026"],"Select Video":["Selecteer video"],"Change Video":["Video wijzigen"],"Select Lottie Animation":["Selecteer Lottie-animatie"],"Change Lottie Animation":["Wijzig Lottie-animatie"],"Upload SVG":["SVG uploaden"],"Change SVG":["SVG wijzigen"],"Select Image":["Selecteer afbeelding"],"Change Image":["Afbeelding wijzigen"],"Upload SVG?":["SVG uploaden?"],"Upload SVG can be potentially risky. Are you sure?":["Het uploaden van SVG kan potentieel riskant zijn. Weet je het zeker?"],"Upload Anyway":["Toch uploaden"],"Full Width":["Volledige breedte"],"Install":["Installeren"],"Plugin Installation failed, Please try again later.":["Installatie van de plugin mislukt, probeer het later opnieuw."],"Plugin activation failed, Please try again later.":["Plug-in activering mislukt, probeer het later opnieuw."],"Integrations":["Integraties"],"%s Removed from Quick Action Bar.":["%s verwijderd van de snelle actiebalk."],"Add to Quick Action Bar":["Toevoegen aan de Snelle Actiebalk"],"%s Added to Quick Action Bar.":["%s toegevoegd aan de Snelle Actiebalk."],"Already Present in Quick Action Bar":["Al aanwezig in de snelle actiebalk"],"No results found.":["Geen resultaten gevonden."],"data object is empty":["gegevensobject is leeg"],"Add blocks to Quick Action Bar":["Blokken toevoegen aan de Snelle Actiebalk"],"Re-arrange block inside Quick Action Bar":["Blok herschikken in de Snelle Actiebalk"],"Upgrade":["Upgrade"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installeren & Activeren"],"Compliance Settings":["Instellingen voor naleving"],"Enable GDPR Compliance":["Schakel GDPR-naleving in"],"Never store entry data after form submission":["Sla nooit invoergegevens op na het indienen van het formulier"],"When enabled this form will never store Entries.":["Wanneer ingeschakeld, zal dit formulier nooit inzendingen opslaan."],"Automatically delete entries":["Automatisch items verwijderen"],"When enabled this form will automatically delete entries after a certain period of time.":["Wanneer ingeschakeld, zal dit formulier automatisch inzendingen na een bepaalde periode verwijderen."],"Entries older than the days set will be deleted automatically.":["Inzendingen ouder dan de ingestelde dagen worden automatisch verwijderd."],"Custom CSS":["Aangepaste CSS"],"The following CSS styles added below will only apply to this form container.":["De volgende CSS-stijlen die hieronder worden toegevoegd, zijn alleen van toepassing op deze formuliercontainer."],"Visual":["Visueel"],"HTML":["HTML"],"All Data":["Alle gegevens"],"Add Shortcode":["Voeg shortcode toe"],"Form input tags":["Formulierveldlabels"],"Comma separated values are also accepted.":["Door komma's gescheiden waarden worden ook geaccepteerd."],"Email Notification":["E-mailmelding"],"Name":["Naam"],"Send Email To":["E-mail verzenden naar"],"Subject":["Onderwerp"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Antwoord aan"],"Add Notification":["Melding toevoegen"],"Add Key":["Sleutel toevoegen"],"Add Value":["Waarde toevoegen"],"Add":["Toevoegen"],"Confirmation Message":["Bevestigingsbericht"],"After Form Submission":["Na het indienen van het formulier"],"Hide Form":["Formulier verbergen"],"Reset Form":["Formulier opnieuw instellen"],"Custom URL":["Aangepaste URL"],"Add Query Parameters":["Queryparameters toevoegen"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Selecteer of u sleutel-waardeparen wilt toevoegen voor formuliervelden om op te nemen in queryparameters"],"Query Parameters":["Queryparameters"],"Please select a page.":["Selecteer een pagina."],"Suggestion: URL should use HTTPS":["Suggestie: URL moet HTTPS gebruiken"],"Success Message":["Succesbericht"],"Redirect":["Doorsturen"],"Redirect to":["Doorsturen naar"],"Page":["Pagina"],"Form Confirmation":["Formulierbevestiging"],"Confirmation Type":["Bevestigingstype"],"Use Labels as Placeholders":["Gebruik labels als placeholders"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Bovenstaande instelling plaatst de labels binnen de velden als placeholders (waar mogelijk). Deze instelling is alleen van toepassing op de live pagina, niet in de voorbeeldweergave van de editor."],"Page Break":["Pagina-einde"],"Show Labels":["Labels weergeven"],"First Page Label":["Eerste paginalabel"],"Progress Indicator":["Voortgangsindicator"],"Progress Bar":["Voortgangsbalk"],"Connector":["Connector"],"Steps":["Stappen"],"Next Button Text":["Volgende knoptekst"],"Back Button Text":["Terugknoptekst"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Weet je zeker dat je wilt afsluiten? Je niet-opgeslagen wijzigingen gaan verloren omdat je enkele validatiefouten hebt."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Er zijn enkele niet-opgeslagen wijzigingen. Sla uw wijzigingen op om de updates door te voeren."],"Form Behavior":["Formuliergedrag"],"Clear":["Duidelijk"],"Select Color":["Selecteer kleur"],"Primary Color":["Primaire kleur"],"Text Color":["Tekstkleur"],"Text Color on Primary":["Tekstkleur op primair"],"Field Spacing":["Veldafstand"],"Small":["Klein"],"Large":["Groot"],"Left":["Links"],"Center":["Centrum"],"Right":["Rechts"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Onzichtbaar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Datumkiezer"],"Time Picker":["Tijdkiezer"],"Hidden":["Verborgen"],"Slider":["Schuifregelaar"],"Rating":["Beoordeling"],"Upgrade to Unlock These Fields":["Upgrade om deze velden te ontgrendelen"],"Add Block":["Blok toevoegen"],"Customize with SureForms":["Pas aan met SureForms"],"Page break":["Pagina-einde"],"Previous":["Vorige"],"Thank you":["Dank je"],"Form submitted successfully!":["Formulier succesvol ingediend!"],"Instant Form":["Direct formulier"],"Enable Instant Form":["Instant Form inschakelen"],"Enable Preview":["Voorbeeld inschakelen"],"Show Title":["Toon titel"],"Site Logo":["Site-logo"],"Banner Background":["Banner Achtergrond"],"Color":["Kleur"],"Upload Image":["Afbeelding uploaden"],"Background Color":["Achtergrondkleur"],"Use banner as page background":["Gebruik banner als paginabackground"],"Form Width":["Formulierbreedte"],"URL":["URL"],"URL Slug":["URL-slug"],"The last part of the URL.":["Het laatste deel van de URL."],"Learn more.":["Meer informatie."],"SureForms Description":["SureForms Beschrijving"],"Form Options":["Formulieropties"],"Form Shortcode":["Formulier Shortcode"],"Paste this shortcode on the page or post to render this form.":["Plaats deze shortcode op de pagina of het bericht om dit formulier weer te geven."],"Spam Protection":["Spam Bescherming"],"Auto":["Auto"],"Normal":["Normaal"],"%":["%"],"Top":["Top"],"Bottom":["Onderkant"],"Solid":["Solide"],"Width":["Breedte"],"Size":["Grootte"],"EM":["EM"],"Padding":["Opvulling"],"Color 1":["Kleur 1"],"Color 2":["Kleur 2"],"Type":["Type"],"Linear":["Lineair"],"Radial":["Radiaal"],"Location 1":["Locatie 1"],"Location 2":["Locatie 2"],"Angle":["Hoek"],"Classic":["Klassiek"],"Gradient":["Gradi\u00ebnt"],"Background":["Achtergrond"],"Cover":["Omslag"],"Contain":["Bevatten"],"Overlay":["Overlay"],"No Repeat":["Geen herhaling"],"Overlay Opacity":["Overlay-opaciteit"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Klasnamen moeten gescheiden worden door spaties. Elke klasnaam mag niet beginnen met een cijfer, streepje of onderstrepingsteken. Ze mogen alleen letters (inclusief Unicode-tekens), cijfers, streepjes en onderstrepingstekens bevatten."],"Conversational Layout":["Gespreksindeling"],"Unlock Conversational Forms":["Ontgrendel Gespreksformulieren"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Met het SureForms Pro Plan kun je je formulieren omzetten in boeiende, conversatiegerichte lay-outs voor een naadloze gebruikerservaring."],"Premium":["Premium"],"Overlay Type":["Overlaytype"],"Image Overlay Color":["Afbeelding Overlay Kleur"],"Image Position":["Afbeeldingspositie"],"Attachment":["Bijlage"],"Fixed":["Vast"],"Blend Mode":["Overvloeimodus"],"Multiply":["Vermenigvuldigen"],"Screen":["Scherm"],"Darken":["Verduisteren"],"Lighten":["Verlichten"],"Color Dodge":["Kleur Dodge"],"Saturation":["Verzadiging"],"Repeat-x":["Herhaal-x"],"Repeat-y":["Herhaal-y"],"PX":["PX"],"Button":["Knop"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Verbind met OttoKit"],"SUREFORMS PREMIUM FIELDS":["SUREFORMS PREMIUM VELDEN"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd."],"We strongly recommend that you install the free ":["We raden ten zeerste aan dat u de gratis installeert"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! De Setup Wizard maakt het gemakkelijk om je e-mails te repareren."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Probeer afwisselend een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Voer een geldig e-mailadres in. Uw meldingen worden niet verzonden als het veld niet correct is ingevuld."],"From Name":["Van Naam"],"From Email":["Van e-mail"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website domein (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd."],"Border Radius":["Randstraal"],"Form Theme":["Formulier Thema"],"Instant Form Padding":["Directe Formuliervulling"],"Instant Form Border Radius":["Directe Formulier Randstraal"],"Select Gradient":["Selecteer verloop"],"Upgrade Now":["Nu upgraden"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Inzendingen ouder dan de geselecteerde dagen worden verwijderd."],"Entries Time Period":["Invoerperiode"],"Custom CSS Panel":["Aangepast CSS-paneel"],"Notifications can use only one From Email so please enter a single address.":["Meldingen kunnen slechts \u00e9\u00e9n Van E-mailadres gebruiken, dus voer alstublieft \u00e9\u00e9n enkel adres in."],"Email Notifications":["E-mailmeldingen"],"Actions":["Acties"],"Duplicate":["Duplicaat"],"Delete":["Verwijderen"],"Select Page to redirect":["Selecteer pagina om te omleiden"],"Search for a page":["Zoek naar een pagina"],"Select a page":["Selecteer een pagina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Save":["Opslaan"],"Login":["Inloggen"],"Register":["Registreren"],"Date":["Datum"],"Advanced Settings":["Geavanceerde instellingen"],"Form Restriction":["Formulierbeperking"],"Maximum Number of Entries":["Maximaal aantal vermeldingen"],"Maximum Entries":["Maximale invoer"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["De instelling voor de tijdsperiode werkt volgens de tijdzone van je WordPress-site. Klik hier<\/a> om je WordPress Algemene Instellingen te openen, waar je deze kunt controleren en bijwerken."],"Click here":["Klik hier"],"Response Description After Maximum Entries":["Beschrijving van de reactie na maximale invoer"],"All changes will be saved automatically when you press back.":["Alle wijzigingen worden automatisch opgeslagen wanneer u op terug drukt."],"Repeater":["Herhaler"],"OttoKit Settings":["OttoKit-instellingen"],"Get Started":["Beginnen"],"Connect Native Integrations with SureForms":["Verbind native integraties met SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Verwacht formaat voor e-mails - email@sureforms.com of John Doe "],"delete":["verwijderen"],"Please type \"%s\" in the input box":["Typ alstublieft \"%s\" in het invoerveld"],"To confirm, type \"%s\" in the box below:":["Om te bevestigen, typ \"%s\" in het vak hieronder:"],"Type \"%s\"":["Typ \"%s\""],"Payment":["Betaling"],"%s - Order ID":["%s - Bestel-ID"],"%s - Amount":["%s - Bedrag"],"%s - Customer Email":["%s - Klant e-mail"],"%s - Customer Name":["%s - Klantnaam"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["Voeg aangepaste CSS-regels toe om dit specifieke formulier onafhankelijk van globale stijlen te stylen."],"Spam Protection Type":["Type spambeveiliging"],"Select Security Type":["Selecteer beveiligingstype"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Opmerking: Het gebruik van verschillende reCAPTCHA-versies (V2 checkbox en V3) op dezelfde pagina zal conflicten tussen de versies veroorzaken. Vermijd alstublieft het gebruik van verschillende versies op dezelfde pagina."],"Select Version":["Selecteer versie"],"Please configure the API keys correctly from the settings":["Configureer de API-sleutels correct via de instellingen"],"Control email alerts sent to admins or users after a form submission.":["Beheer e-mailmeldingen die naar beheerders of gebruikers worden verzonden na een formulierinzending."],"Customize the confirmation message or redirect the users after submitting the form.":["Pas het bevestigingsbericht aan of leid de gebruikers om nadat ze het formulier hebben ingediend."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Stel limieten in voor het aantal keren dat een formulier kan worden ingediend en beheer nalevingsopties, waaronder AVG en gegevensbewaring."],"Go to OttoKit Settings":["Ga naar OttoKit-instellingen"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Verbind SureForms met je favoriete apps om taken te automatiseren en gegevens naadloos te synchroniseren."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Ontgrendel krachtige integraties in het Premium-plan om uw workflows te automatiseren en SureForms direct te verbinden met uw favoriete tools."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Stuur formulierinzendingen rechtstreeks naar CRM's, e-mail en marketingplatforms."],"Automate repetitive tasks with seamless data syncing.":["Automatiseer repetitieve taken met naadloze gegevenssynchronisatie."],"Access exclusive native integrations for faster workflows.":["Toegang tot exclusieve native integraties voor snellere workflows."],"PDF Generation":["PDF-generatie"],"Generate and customize PDF copies of form submissions.":["Genereer en pas PDF-kopie\u00ebn van formulierinzendingen aan."],"Generate Submission PDFs":["Genereer indienings-PDF's"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Zet elke formulierinvoer om in een gepolijste PDF-bestand, waardoor het perfect is voor rapporten, archieven of om te delen."],"Automatically generate PDFs from your form submissions.":["Genereer automatisch PDF's van uw formulierinzendingen."],"Customize PDF templates with your branding.":["Pas PDF-sjablonen aan met uw branding."],"Download or email PDFs instantly.":["Download of e-mail PDF's direct."],"User Registration":["Gebruikersregistratie"],"Onboard new users or update existing accounts through beautiful looking forms.":["Nieuwe gebruikers onboarden of bestaande accounts bijwerken via prachtig uitziende formulieren."],"Register Users with SureForms":["Registreer gebruikers met SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Stroomlijn het gehele onboardingproces voor gebruikers op uw sites met naadloze, formuliergestuurde logins en registraties."],"Register new users directly via your form submissions.":["Registreer nieuwe gebruikers direct via uw formulierinzendingen."],"Create or update existing accounts by mapping form data to user fields.":["Maak nieuwe accounts aan of werk bestaande accounts bij door formuliergegevens aan gebruikersvelden te koppelen."],"Assign roles and control access automatically.":["Wijs rollen toe en beheer de toegang automatisch."],"Post Feed":["Berichtenfeed"],"Transform your form submission into WordPress posts.":["Transformeer je formulierinzending in WordPress-berichten."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Zet automatisch formulierinzendingen om in WordPress-berichten, pagina's of aangepaste berichttypen. Bespaar veel tijd en laat je formulieren direct content publiceren."],"Create posts, pages, or CPTs from your form entries.":["Maak berichten, pagina's of CPT's van uw formulierinzendingen."],"Map form fields to your post fields easily.":["Wijs formulier velden eenvoudig toe aan je berichtvelden."],"Automate the content publishing flow with few simple steps.":["Automatiseer de inhoudspublicatiestroom met een paar eenvoudige stappen."],"Automations":["Automatiseringen"],"Unlock Advanced Styling":["Ontgrendel geavanceerde opmaak"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Krijg volledige controle over het uiterlijk van uw formulier met aangepaste kleuren, lettertypen en lay-outs."],"Button Alignment":["Knopuitlijning"],"Add Custom CSS Class(es)":["Voeg Aangepaste CSS Klasse(n) Toe"],"Set the total number of submissions allowed for this form.":["Stel het totale aantal toegestane inzendingen voor dit formulier in."],"Save & Progress":["Opslaan & Voortgang"],"Allow users to save their progress and continue form completion later.":["Sta gebruikers toe hun voortgang op te slaan en later verder te gaan met het invullen van het formulier."],"Save & Progress in SureForms":["Opslaan & Verdergaan in SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Geef uw gebruikers de flexibiliteit om formulieren in hun eigen tempo in te vullen door hen toe te staan hun voortgang op te slaan en op elk moment terug te keren."],"Let users pause long or multi-step forms and continue later.":["Laat gebruikers lange of meerstapsformulieren pauzeren en later doorgaan."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Verminder het verlaten van formulieren met handige hervattingslinks en krijg overal toegang tot hun voortgang."],"Improve user experience for lengthy, complex, or multi-page forms.":["Verbeter de gebruikerservaring voor lange, complexe of meerpaginaformulieren."],"This form is not yet available. Please check back after the scheduled start time.":["Dit formulier is nog niet beschikbaar. Kom na de geplande starttijd terug."],"This form is no longer accepting submissions. The submission period has ended.":["Dit formulier accepteert geen inzendingen meer. De inzendperiode is afgelopen."],"The start date and time must be before the end date and time.":["De startdatum en -tijd moeten v\u00f3\u00f3r de einddatum en -tijd liggen."],"Form Scheduling":["Formulierplanning"],"Enable Form Scheduling":["Formulierplanning inschakelen"],"Set a time period during which this form will be available for submissions.":["Stel een periode in waarin dit formulier beschikbaar zal zijn voor inzendingen."],"Start Date & Time":["Startdatum en tijd"],"End Date & Time":["Einddatum en tijd"],"Response Description Before Start Date":["Reactiebeschrijving v\u00f3\u00f3r de startdatum"],"Response Description After End Date":["Reactiebeschrijving na einddatum"],"Conditional Confirmations":["Voorwaardelijke Bevestigingen"],"Set up the message or redirect users will see after submitting the form.":["Stel het bericht in of leid gebruikers om dat ze zullen zien na het indienen van het formulier."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Toon het juiste bericht aan de juiste gebruiker op basis van hun reactie. Personaliseer bevestigingen met slimme voorwaarden en begeleid gebruikers automatisch naar de volgende beste stap."],"Display different confirmation messages based on form responses.":["Toon verschillende bevestigingsberichten op basis van formulierreacties."],"Redirect users to specific pages or URLs conditionally.":["Leid gebruikers voorwaardelijk naar specifieke pagina's of URL's om."],"Create personalized thank-you messages without extra forms.":["Maak gepersonaliseerde bedankberichten zonder extra formulieren."],"Lost Password":["Wachtwoord Vergeten"],"Reset Password":["Wachtwoord opnieuw instellen"],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Selecteer een spambeveiligingsdienst. Configureer API-sleutels in de globale instellingen voordat u deze inschakelt."],"Send as Raw HTML":["Als ruwe HTML verzenden"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Wanneer ingeschakeld, wordt de HTML van de e-mailtekst exact bewaard zoals geschreven en verpakt in een professioneel e-mailsjabloon."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Smart tags die verwijzen naar door gebruikers ingediende velden, worden niet ge\u00ebscaped in de ruwe HTML-modus. Vermijd het direct invoegen van niet-vertrouwde veldwaarden in de e-mailinhoud."],"Please provide a recipient email address and subject line.":["Geef alstublieft een e-mailadres van de ontvanger en een onderwerpregel op."],"Email notification duplicated!":["E-mailmelding gedupliceerd!"],"Are you sure you want to delete this email notification?":["Weet je zeker dat je deze e-mailmelding wilt verwijderen?"],"Email notification deleted!":["E-mailmelding verwijderd!"],"URL is missing Top Level Domain (TLD).":["URL mist het Top Level Domain (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Dit formulier is nu gesloten omdat het maximale aantal inzendingen is ontvangen."],"Publish Your Form":["Publiceer uw formulier"],"Enable This to Instantly Publish the Form":["Schakel dit in om het formulier direct te publiceren"],"Style Your Instant Form Page Here":["Stijl hier je instant formulierpagina"],"Quizzes":["Quizzen"],"%s - Description":["%s - Beschrijving"],"Send entries to 100+ popular apps.":["Verzend inzendingen naar meer dan 100 populaire apps."],"Build automated workflows that run instantly.":["Bouw geautomatiseerde workflows die direct worden uitgevoerd."],"Create custom app integrations using our Custom App feature.":["Maak aangepaste app-integraties met behulp van onze functie Aangepaste App."],"Keep your tools in sync automatically.":["Houd je gereedschap automatisch gesynchroniseerd."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Hiermee wordt OttoKit op je WordPress-site ge\u00efnstalleerd en geactiveerd om automatiseringsfuncties mogelijk te maken."],"Automate Your Forms with OttoKit":["Automatiseer uw formulieren met OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Elke formulierinzending zou iets moeten activeren \u2014 een Slack-melding, een CRM-lead, een opvolg-e-mail of een nieuwe rij in Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Maak interactieve quizzen om je publiek te betrekken en inzichten te verzamelen."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Ontwerp boeiende quizzen met verschillende vraagtypen, gepersonaliseerde feedback en geautomatiseerde scoring om je publiek te boeien en waardevolle inzichten te verkrijgen."],"Create interactive quizzes with multiple question types.":["Maak interactieve quizzen met meerdere vraagtypen."],"Provide personalized feedback based on user responses.":["Geef gepersonaliseerde feedback op basis van gebruikersreacties."],"Automate scoring and lead segmentation for better insights.":["Automatiseer scoring en leadsegmentatie voor betere inzichten."],"Heading 1":["Kop 1"],"Heading 2":["Kop 2"],"Heading 3":["Kop 3"],"Heading 4":["Kop 4"],"Heading 5":["Kop 5"],"Heading 6":["Kop 6"],"Form settings saved.":["Formulierinstellingen opgeslagen."],"The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature.":["De invoerlimiet is afhankelijk van opgeslagen invoeren om inzendingen te tellen. Als in de nalevingsinstellingen \"Nooit invoergegevens opslaan na formulierinzending\" is ingeschakeld, wordt deze limiet niet afgedwongen. Schakel die optie uit, of verwijder de invoerlimiet, om deze functie te gebruiken."],"Settings saved, but post attributes (password \/ title \/ content) failed to update. Retry to persist them.":["Instellingen opgeslagen, maar postattributen (wachtwoord \/ titel \/ inhoud) konden niet worden bijgewerkt. Probeer opnieuw om ze te behouden."],"Failed to save form settings.":["Opslaan van formulierinstellingen mislukt."],"Saving\u2026":["Opslaan\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Wanneer ingeschakeld, zal dit formulier het IP-adres van de gebruiker, de naam van de browser en de naam van het apparaat niet opslaan in de inzendingen."],"Failed to save. Please try again.":["Opslaan mislukt. Probeer het opnieuw."],"reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.":["reCAPTCHA API-sleutels voor de geselecteerde versie zijn niet geconfigureerd. Stel ze in bij de Globale Instellingen."],"Please select a reCAPTCHA version.":["Selecteer een reCAPTCHA-versie. "],"hCaptcha API keys are not configured. Set them in Global Settings.":["hCaptcha API-sleutels zijn niet geconfigureerd. Stel ze in bij de Algemene Instellingen."],"Cloudflare Turnstile API keys are not configured. Set them in Global Settings.":["Cloudflare Turnstile API-sleutels zijn niet geconfigureerd. Stel ze in bij de Globale Instellingen."],"Form data":["Formuliergegevens"],"Some fields need attention":["Sommige velden hebben aandacht nodig"],"Unsaved changes":["Niet-opgeslagen wijzigingen"],"A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.":["Een e-mailadres van de ontvanger en een onderwerpregel zijn vereist voordat deze melding kan worden opgeslagen. Corrigeer de gemarkeerde velden of verwijder uw wijzigingen om terug te gaan."],"You have unsaved changes for this notification. Discard them to go back, or stay to save them.":["Je hebt niet-opgeslagen wijzigingen voor deze melding. Verwijder ze om terug te gaan, of blijf om ze op te slaan."],"Discard & go back":["Verwijderen & teruggaan"],"Stay & fix":["Blijf & repareer"],"Keep editing":["Blijf bewerken"],"Please provide a recipient email address.":["Geef alstublieft een e-mailadres van de ontvanger op."],"Please provide a subject line.":["Geef alstublieft een onderwerpregel op."],"Please provide a custom URL.":["Geef een aangepaste URL op."],"You have unsaved changes. Discard them to continue, or stay to save your changes.":["Je hebt niet-opgeslagen wijzigingen. Verwijder ze om door te gaan, of blijf om je wijzigingen op te slaan."],"Discard & continue":["Weggooien & doorgaan"],"Quill heading picker: default paragraph style\u0004Normal":["Normaal"]}}} \ No newline at end of file diff --git a/languages/sureforms-nl_NL-46b85b18ab0a35677f7beff46af30190.json b/languages/sureforms-nl_NL-46b85b18ab0a35677f7beff46af30190.json new file mode 100644 index 000000000..2eb2b941a --- /dev/null +++ b/languages/sureforms-nl_NL-46b85b18ab0a35677f7beff46af30190.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/htmlFormDetector.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Converted form":["Omgezette vorm"],"SureForms could not authenticate this request. Please reload the editor and try again.":["SureForms kon dit verzoek niet verifi\u00ebren. Herlaad de editor en probeer het opnieuw."],"%s \u2014 Converted form":["%s \u2014 Omgezette vorm"],"Form converted to SureForms using AI. Review the new form for any tweaks.":["Formulier omgezet naar SureForms met behulp van AI. Bekijk het nieuwe formulier voor eventuele aanpassingen."],"Form converted to SureForms.":["Formulier omgezet naar SureForms."],"You do not have permission to convert this form.":["U heeft geen toestemming om dit formulier te converteren."],"This form is too large to convert. Try simplifying the markup or building the form manually.":["Dit formulier is te groot om te converteren. Probeer de opmaak te vereenvoudigen of het formulier handmatig te maken."],"SureForms could not derive any fields from this form.":["SureForms kon geen velden uit dit formulier afleiden."],"The SureForms AI service could not process this form. Please try again or build the form manually.":["De SureForms AI-service kon dit formulier niet verwerken. Probeer het opnieuw of bouw het formulier handmatig."],"SureForms received an unexpected response. Please try again.":["SureForms ontving een onverwachte reactie. Probeer het alstublieft opnieuw."],"Could not convert this form to SureForms. Please try again.":["Kon dit formulier niet omzetten naar SureForms. Probeer het alstublieft opnieuw."],"Converting\u2026":["Bezig met converteren\u2026"],"Convert to SureForms":["Converteren naar SureForms"]}}} \ No newline at end of file diff --git a/languages/sureforms-nl_NL-4b62e3f004dea2c587b5a3069263d994.json b/languages/sureforms-nl_NL-4b62e3f004dea2c587b5a3069263d994.json index f6fd76771..c855a7fd7 100644 --- a/languages/sureforms-nl_NL-4b62e3f004dea2c587b5a3069263d994.json +++ b/languages/sureforms-nl_NL-4b62e3f004dea2c587b5a3069263d994.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Instellingen"],"Search":["Zoeken"],"Fields":["Velden"],"Image":["Afbeelding"],"Submit":["Indienen"],"Required":["Vereist"],"Form Title":["Formuliertitel"],"Show":["Tonen"],"Hide":["Verbergen"],"Edit Form":["Formulier bewerken"],"Icon":["Icoon"],"Desktop":["Bureaublad"],"Medium":["Middelgroot"],"Mobile":["Mobiel"],"Repeat":["Herhaal"],"Scroll":["Scrollen"],"Tablet":["Tablet"],"Basic":["Basis"],"(no title)":["(geen titel)"],"Select a Form":["Selecteer een formulier"],"No forms found\u2026":["Geen formulieren gevonden\u2026"],"Choose":["Kies"],"Create New":["Nieuw maken"],"Change Form":["Formulier wijzigen"],"This form has been deleted or is unavailable.":["Dit formulier is verwijderd of is niet beschikbaar."],"Form Settings":["Formulierinstellingen"],"Show Form Title on this Page":["Toon formulier titel op deze pagina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Opmerking: Voor het bewerken van SureForms, raadpleeg de SureForms Editor -"],"Field preview":["Veldvoorbeeld"],"General":["Algemeen"],"Style":["Stijl"],"Advanced":["Geavanceerd"],"No tags available":["Geen tags beschikbaar"],"Device":["Apparaat"],"Select Shortcodes":["Selecteer shortcodes"],"Page Break Label":["Pagina-einde label"],"Next":["Volgende"],"Back":["Terug"],"Reset":["Resetten"],"Generic tags":["Algemene tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecteer eenheden"],"%s units":["%s eenheden"],"Margin":["Marge"],"Attributes":["Kenmerken"],"Input Pattern":["Invoermuster"],"None":["Geen"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Aangepast"],"Custom Mask":["Aangepast masker"],"Please check the documentation to manage custom input pattern ":["Controleer de documentatie om het aangepaste invoerpatroon te beheren"],"here":["hier"],"Default Value":["Standaardwaarde"],"Error Message":["Foutmelding"],"Help Text":["Helptekst"],"Number Format":["Getalnotatie"],"US Style (Eg: 9,999.99)":["VS-stijl (Bijv: 9.999,99)"],"EU Style (Eg: 9.999,99)":["EU-stijl (Bijv: 9.999,99)"],"Minimum Value":["Minimumwaarde"],"Maximum Value":["Maximale waarde"],"Please check the Minimum and Maximum value":["Controleer de minimum- en maximumwaarde"],"Enable Email Confirmation":["E-mailbevestiging inschakelen"],"Checked by Default":["Standaard aangevinkt"],"Error message":["Foutmelding"],"Checked by default":["Standaard aangevinkt"],"Please add a option props to MultiButtonsControl":["Voeg alstublieft een optie-eigenschap toe aan MultiButtonsControl"],"Icon Library":["Iconenbibliotheek"],"Close":["Sluiten"],"All Icons":["Alle pictogrammen"],"Other":["Anders"],"No Icons Found":["Geen pictogrammen gevonden"],"Insert Icon":["Pictogram invoegen"],"Change Icon":["Pictogram wijzigen"],"Choose Icon":["Kies pictogram"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"Processing\u2026":["Bezig met verwerken\u2026"],"Select Video":["Selecteer video"],"Change Video":["Video wijzigen"],"Select Lottie Animation":["Selecteer Lottie-animatie"],"Change Lottie Animation":["Wijzig Lottie-animatie"],"Upload SVG":["SVG uploaden"],"Change SVG":["SVG wijzigen"],"Select Image":["Selecteer afbeelding"],"Change Image":["Afbeelding wijzigen"],"Upload SVG?":["SVG uploaden?"],"Upload SVG can be potentially risky. Are you sure?":["Het uploaden van SVG kan potentieel riskant zijn. Weet je het zeker?"],"Upload Anyway":["Toch uploaden"],"Bulk Add":["Bulk toevoegen"],"Bulk Add Options":["Bulkopties toevoegen"],"Enter each option on a new line.":["Voer elke optie op een nieuwe regel in."],"Insert Options":["Opties invoegen"],"Full Width":["Volledige breedte"],"Option Type":["Optietype"],"Edit Options":["Bewerk opties"],"Add New Option":["Nieuwe optie toevoegen"],"ADD":["TOEVOEGEN"],"Enable Auto Country Detection":["Automatische landdetectie inschakelen"],"%s Width":["%s Breedte"],"Upgrade":["Upgrade"],"Clear":["Duidelijk"],"Select Color":["Selecteer kleur"],"Primary Color":["Primaire kleur"],"Text Color":["Tekstkleur"],"Field Spacing":["Veldafstand"],"Small":["Klein"],"Large":["Groot"],"Left":["Links"],"Center":["Centrum"],"Right":["Rechts"],"Color":["Kleur"],"Background Color":["Achtergrondkleur"],"Auto":["Auto"],"Default":["Standaard"],"Normal":["Normaal"],"%":["%"],"Top":["Top"],"Bottom":["Onderkant"],"Width":["Breedte"],"Size":["Grootte"],"EM":["EM"],"Padding":["Opvulling"],"Color 1":["Kleur 1"],"Color 2":["Kleur 2"],"Type":["Type"],"Linear":["Lineair"],"Radial":["Radiaal"],"Location 1":["Locatie 1"],"Location 2":["Locatie 2"],"Angle":["Hoek"],"Classic":["Klassiek"],"Gradient":["Gradi\u00ebnt"],"Horizontal":["Horizontaal"],"Vertical":["Verticaal"],"Background":["Achtergrond"],"Cover":["Omslag"],"Contain":["Bevatten"],"Layout":["Indeling"],"Overlay":["Overlay"],"No Repeat":["Geen herhaling"],"Overlay Opacity":["Overlay-opaciteit"],"Conditional Logic":["Conditionele logica"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Upgrade naar het SureForms Starter Plan om dynamische formulieren te maken die zich aanpassen op basis van gebruikersinvoer, en zo een gepersonaliseerde en effici\u00ebnte formulierervaring bieden."],"Enable Conditional Logic":["Voorwaardelijke logica inschakelen"],"this field if":["dit veld indien"],"Configure Conditions":["Voorwaarden configureren"],"Premium":["Premium"],"Overlay Type":["Overlaytype"],"Image Overlay Color":["Afbeelding Overlay Kleur"],"Image Position":["Afbeeldingspositie"],"Attachment":["Bijlage"],"Fixed":["Vast"],"Blend Mode":["Overvloeimodus"],"Multiply":["Vermenigvuldigen"],"Screen":["Scherm"],"Darken":["Verduisteren"],"Lighten":["Verlichten"],"Color Dodge":["Kleur Dodge"],"Saturation":["Verzadiging"],"Repeat-x":["Herhaal-x"],"Repeat-y":["Herhaal-y"],"PX":["PX"],"Button":["Knop"],"Prefix Label":["Voorvoegsel Label"],"Suffix Label":["Achtervoegsel Label"],"Border Radius":["Randstraal"],"Form Theme":["Formulier Thema"],"Select Gradient":["Selecteer verloop"],"Unlock Conditional Logic Editor":["Ontgrendel de voorwaardelijke logica-editor"],"Rich Text Editor":["Rich Text Editor"],"Read Only":["Alleen lezen"],"Select Country":["Selecteer land"],"Default Country":["Standaardland"],"Subscription":["Abonnement"],"One Time":["E\u00e9n keer"],"Unique Entry":["Unieke invoer"],"Maximum Characters":["Maximale tekens"],"Textarea Height":["Hoogte van tekstvak"],"Minimum Selections":["Minimale selecties"],"Maximum Selections":["Maximale selecties"],"Add Numeric Values to Options":["Numerieke waarden aan opties toevoegen"],"Single Choice Only":["Enkel \u00e9\u00e9n keuze"],"Enable Dropdown Search":["Dropdown zoeken inschakelen"],"Allow Multiple":["Meerdere toestaan"],"%1$s fields are required. Please configure these fields in the block settings.":["%1$s velden zijn verplicht. Configureer deze velden in de blokinstellingen."],"%1$s field is required. Please configure this field in the block settings.":["%1$s veld is verplicht. Configureer dit veld in de blokinstellingen."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["U moet een betaalrekening configureren om betalingen van dit formulier te innen. Configureer uw betalingsprovider om door te gaan."],"Configure Payment Account":["Betaalrekening configureren"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Dit is een tijdelijke aanduiding voor het betalingsblok. De daadwerkelijke betalingsvelden voor uw geconfigureerde betalingsprovider(s) verschijnen alleen wanneer u het formulier bekijkt of publiceert."],"2 Payments":["2 Betalingen"],"3 Payments":["3 Betalingen"],"4 Payments":["4 Betalingen"],"5 Payments":["5 Betalingen"],"Never":["Nooit"],"Stop Subscription After":["Abonnement Stoppen Na"],"Choose when to automatically stop the subscription":["Kies wanneer het abonnement automatisch moet worden stopgezet"],"Number of Payments":["Aantal betalingen"],"Enter a number between 1 to 100":["Voer een getal in tussen 1 en 100"],"Form Field":["Formulier Veld"],"Payment Type":["Betalingstype"],"Subscription Plan Name":["Abonnementsplan Naam"],"Billing Interval":["Factureringsinterval"],"Daily":["Dagelijks"],"Weekly":["Wekelijks"],"Monthly":["Maandelijks"],"Quarterly":["Per kwartaal"],"Yearly":["Jaarlijks"],"Amount Type":["Bedragstype"],"Fixed Amount":["Vast Bedrag"],"Dynamic Amount":["Dynamisch Bedrag"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Kies of u een vast bedrag wilt rekenen of het bedrag wilt berekenen op basis van gebruikersinvoer in andere formuliervelden."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Stel het exacte bedrag in dat u wilt berekenen. Gebruikers kunnen het niet wijzigen"],"Choose Amount Field":["Kies bedragveld"],"Select a field\u2026":["Selecteer een veld\u2026"],"Minimum Amount":["Minimumbedrag"],"Set the minimum amount users can enter (0 for no minimum)":["Stel het minimale bedrag in dat gebruikers kunnen invoeren (0 voor geen minimum)"],"Customer Name Field (Required)":["Klantnaamveld (Verplicht)"],"Customer Name Field (Optional)":["Klantnaamveld (Optioneel)"],"Select the input field that contains the customer name (Required for subscriptions)":["Selecteer het invoerveld dat de klantnaam bevat (Vereist voor abonnementen)"],"Select the input field that contains the customer name":["Selecteer het invoerveld dat de klantnaam bevat"],"Customer Email Field (Required)":["Klant e-mailveld (verplicht)"],"Select the email field that contains the customer email":["Selecteer het e-mailveld dat het e-mailadres van de klant bevat"],"Payment":["Betaling"],"%s - Order ID":["%s - Bestel-ID"],"%s - Amount":["%s - Bedrag"],"%s - Customer Email":["%s - Klant e-mail"],"%s - Customer Name":["%s - Klantnaam"],"%s - Status":["%s - Status"],"Button Alignment":["Knopuitlijning"],"Placeholder":["Placeholder"],"Preselect this option":["Selecteer deze optie vooraf"],"Restrict Country Codes":["Beperk landcodes"],"Restriction Type":["Beperkingstype"],"Allow":["Toestaan"],"Block":["Blok"],"Select Allowed Countries":["Selecteer Toegestane Landen"],"Choose countries\u2026":["Kies landen\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Kies welke landcodes gebruikers kunnen selecteren in het telefoonnummer veld. Laat leeg om alle landcodes toe te staan."],"Select Blocked Countries":["Selecteer geblokkeerde landen"],"These countries will be hidden from the dropdown.":["Deze landen worden verborgen in de dropdown."],"Bulk Edit":["Bulk bewerken"],"Select Layout":["Selecteer indeling"],"Number of Columns":["Aantal kolommen"],"Validation Message for Duplicate":["Validatiebericht voor duplicaat"],"Click here to insert a form":["Klik hier om een formulier in te voegen"],"Inherit Form's Original Style":["De oorspronkelijke stijl van het formulier overnemen"],"Text on Primary":["Tekst op primair"],"%s - Description":["%s - Beschrijving"],"Upgrade to Unlock":["Upgrade om te ontgrendelen"],"Custom (Premium)":["Aangepast (Premium)"],"Select a theme style for this form embed.":["Selecteer een themastijl voor deze formulierinsluiting."],"Colors":["Kleuren"],"Advanced Styling":["Geavanceerde styling"],"Unlock Custom Styling":["Aangepaste styling ontgrendelen"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Schakel over naar Aangepaste Modus om volledige controle te krijgen over het ontwerp en de ruimte van uw formulier."],"Full color control (buttons, fields, text)":["Volledige kleurcontrole (knoppen, velden, tekst)"],"Row and column gap control":["Regel de rij- en kolomafstand"],"Field spacing and layout precision":["Veldafstand en lay-outprecisie"],"Complete button styling":["Voltooi knopstijl"],"Payment Description":["Betalingsomschrijving"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Weergegeven op betalingsbewijzen en in uw betalingsdashboard (Stripe en PayPal). Laat leeg om de standaard te gebruiken."],"Slug":["Naaktslak"],"Auto-generated on save":["Automatisch gegenereerd bij opslaan"],"This slug is already used by another field. It will revert to the previous value.":["Deze slug wordt al gebruikt door een ander veld. Het zal terugkeren naar de vorige waarde."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Het wijzigen van de slug kan ervoor zorgen dat formulierinzendingen, voorwaardelijke logica, integraties of andere functies die momenteel naar deze slug verwijzen, niet meer werken. U moet al deze verwijzingen handmatig bijwerken."],"Field Slug":["Veld Slug"],"Location Services":["Locatiediensten"],"Unlock Address Autocomplete":["Adres automatisch aanvullen ontgrendelen"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Upgrade om Google Address Autocomplete met interactieve kaartvoorvertoning in te schakelen, waardoor het invoeren van adressen sneller en nauwkeuriger wordt voor uw gebruikers."],"Enable Google Autocomplete":["Google Autocomplete inschakelen"],"Show Interactive Map":["Interactieve kaart weergeven"],"Payments Per Page":["Betalingen Per Pagina"],"Show Subscriptions Section":["Abonnementssectie weergeven"],"Show a dedicated subscriptions section above payment history.":["Toon een speciale abonnementssectie boven de betalingsgeschiedenis."],"Payment Dashboard":["Betalingsdashboard"],"View your payments and manage subscriptions in a single dashboard.":["Bekijk uw betalingen en beheer abonnementen in \u00e9\u00e9n dashboard."],"Dynamic Default Value":["Dynamische Standaardwaarde"],"Minimum Characters":["Minimale tekens"],"Minimum characters cannot exceed Maximum characters.":["Minimumtekens kunnen niet groter zijn dan maximumtekens."],"Both":["Beide"],"One-Time Label":["Eenmalig label"],"Label shown to users for the one-time payment option.":["Label getoond aan gebruikers voor de eenmalige betalingsoptie."],"Subscription Label":["Abonnementslabel"],"Label shown to users for the subscription option.":["Label getoond aan gebruikers voor de abonnementsoptie."],"Default Selection":["Standaardselectie"],"Which option is pre-selected when the form loads.":["Welke optie is vooraf geselecteerd wanneer het formulier wordt geladen."],"One-Time Amount Type":["Eenmalig Bedragstype"],"Set how the one-time payment amount is determined.":["Stel in hoe het bedrag van de eenmalige betaling wordt bepaald."],"One-Time Fixed Amount":["Eenmalig vast bedrag"],"Amount charged for a one-time payment.":["Bedrag in rekening gebracht voor een eenmalige betaling."],"One-Time Amount Field":["Eenmalig Bedrag Veld"],"Pick a form field whose value determines the one-time payment amount.":["Kies een formulier veld waarvan de waarde het eenmalige betalingsbedrag bepaalt."],"One-Time Minimum Amount":["Eenmalig Minimum Bedrag"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Minimumbedrag dat gebruikers kunnen invoeren voor een eenmalige betaling (0 voor geen minimum)."],"Subscription Amount Type":["Type abonnementsbedrag"],"Set how the subscription amount is determined.":["Stel in hoe het abonnementsbedrag wordt bepaald."],"Subscription Fixed Amount":["Vast bedrag voor abonnement"],"Recurring amount charged per billing interval.":["Terugkerend bedrag dat per factureringsinterval in rekening wordt gebracht."],"Subscription Amount Field":["Veld Abonnementsbedrag"],"Pick a form field whose value determines the subscription amount.":["Kies een formulier veld waarvan de waarde het abonnementsbedrag bepaalt."],"Subscription Minimum Amount":["Minimumbedrag voor abonnement"],"Minimum amount users can enter for subscription (0 for no minimum).":["Minimumbedrag dat gebruikers kunnen invoeren voor abonnement (0 voor geen minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Kies een veld uit uw formulier, zoals een nummer, dropdown, meerkeuze of verborgen veld, waarvan de waarde het betalingsbedrag moet bepalen."]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Instellingen"],"Search":["Zoeken"],"Fields":["Velden"],"Image":["Afbeelding"],"Submit":["Indienen"],"Required":["Vereist"],"Form Title":["Formuliertitel"],"Show":["Tonen"],"Hide":["Verbergen"],"Edit Form":["Formulier bewerken"],"Icon":["Icoon"],"Desktop":["Bureaublad"],"Medium":["Middelgroot"],"Mobile":["Mobiel"],"Repeat":["Herhaal"],"Scroll":["Scrollen"],"Tablet":["Tablet"],"Basic":["Basis"],"(no title)":["(geen titel)"],"Select a Form":["Selecteer een formulier"],"No forms found\u2026":["Geen formulieren gevonden\u2026"],"Choose":["Kies"],"Create New":["Nieuw maken"],"Change Form":["Formulier wijzigen"],"This form has been deleted or is unavailable.":["Dit formulier is verwijderd of is niet beschikbaar."],"Form Settings":["Formulierinstellingen"],"Show Form Title on this Page":["Toon formulier titel op deze pagina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Opmerking: Voor het bewerken van SureForms, raadpleeg de SureForms Editor -"],"Field preview":["Veldvoorbeeld"],"General":["Algemeen"],"Style":["Stijl"],"Advanced":["Geavanceerd"],"No tags available":["Geen tags beschikbaar"],"Device":["Apparaat"],"Select Shortcodes":["Selecteer shortcodes"],"Page Break Label":["Pagina-einde label"],"Next":["Volgende"],"Back":["Terug"],"Reset":["Resetten"],"Generic tags":["Algemene tags"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecteer eenheden"],"%s units":["%s eenheden"],"Margin":["Marge"],"Attributes":["Kenmerken"],"Input Pattern":["Invoermuster"],"None":["Geen"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Aangepast"],"Custom Mask":["Aangepast masker"],"Please check the documentation to manage custom input pattern ":["Controleer de documentatie om het aangepaste invoerpatroon te beheren"],"here":["hier"],"Default Value":["Standaardwaarde"],"Error Message":["Foutmelding"],"Help Text":["Helptekst"],"Number Format":["Getalnotatie"],"US Style (Eg: 9,999.99)":["VS-stijl (Bijv: 9.999,99)"],"EU Style (Eg: 9.999,99)":["EU-stijl (Bijv: 9.999,99)"],"Minimum Value":["Minimumwaarde"],"Maximum Value":["Maximale waarde"],"Please check the Minimum and Maximum value":["Controleer de minimum- en maximumwaarde"],"Enable Email Confirmation":["E-mailbevestiging inschakelen"],"Checked by Default":["Standaard aangevinkt"],"Error message":["Foutmelding"],"Checked by default":["Standaard aangevinkt"],"Please add a option props to MultiButtonsControl":["Voeg alstublieft een optie-eigenschap toe aan MultiButtonsControl"],"Icon Library":["Iconenbibliotheek"],"Close":["Sluiten"],"All Icons":["Alle pictogrammen"],"Other":["Anders"],"No Icons Found":["Geen pictogrammen gevonden"],"Insert Icon":["Pictogram invoegen"],"Change Icon":["Pictogram wijzigen"],"Choose Icon":["Kies pictogram"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"Processing\u2026":["Bezig met verwerken\u2026"],"Select Video":["Selecteer video"],"Change Video":["Video wijzigen"],"Select Lottie Animation":["Selecteer Lottie-animatie"],"Change Lottie Animation":["Wijzig Lottie-animatie"],"Upload SVG":["SVG uploaden"],"Change SVG":["SVG wijzigen"],"Select Image":["Selecteer afbeelding"],"Change Image":["Afbeelding wijzigen"],"Upload SVG?":["SVG uploaden?"],"Upload SVG can be potentially risky. Are you sure?":["Het uploaden van SVG kan potentieel riskant zijn. Weet je het zeker?"],"Upload Anyway":["Toch uploaden"],"Bulk Add":["Bulk toevoegen"],"Bulk Add Options":["Bulkopties toevoegen"],"Enter each option on a new line.":["Voer elke optie op een nieuwe regel in."],"Insert Options":["Opties invoegen"],"Full Width":["Volledige breedte"],"Option Type":["Optietype"],"Edit Options":["Bewerk opties"],"Add New Option":["Nieuwe optie toevoegen"],"ADD":["TOEVOEGEN"],"Enable Auto Country Detection":["Automatische landdetectie inschakelen"],"%s Width":["%s Breedte"],"Upgrade":["Upgrade"],"Clear":["Duidelijk"],"Select Color":["Selecteer kleur"],"Primary Color":["Primaire kleur"],"Text Color":["Tekstkleur"],"Field Spacing":["Veldafstand"],"Small":["Klein"],"Large":["Groot"],"Left":["Links"],"Center":["Centrum"],"Right":["Rechts"],"Color":["Kleur"],"Background Color":["Achtergrondkleur"],"Auto":["Auto"],"Default":["Standaard"],"Normal":["Normaal"],"%":["%"],"Top":["Top"],"Bottom":["Onderkant"],"Width":["Breedte"],"Size":["Grootte"],"EM":["EM"],"Padding":["Opvulling"],"Color 1":["Kleur 1"],"Color 2":["Kleur 2"],"Type":["Type"],"Linear":["Lineair"],"Radial":["Radiaal"],"Location 1":["Locatie 1"],"Location 2":["Locatie 2"],"Angle":["Hoek"],"Classic":["Klassiek"],"Gradient":["Gradi\u00ebnt"],"Horizontal":["Horizontaal"],"Vertical":["Verticaal"],"Background":["Achtergrond"],"Cover":["Omslag"],"Contain":["Bevatten"],"Layout":["Indeling"],"Overlay":["Overlay"],"No Repeat":["Geen herhaling"],"Overlay Opacity":["Overlay-opaciteit"],"Conditional Logic":["Conditionele logica"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Upgrade naar het SureForms Starter Plan om dynamische formulieren te maken die zich aanpassen op basis van gebruikersinvoer, en zo een gepersonaliseerde en effici\u00ebnte formulierervaring bieden."],"Enable Conditional Logic":["Voorwaardelijke logica inschakelen"],"this field if":["dit veld indien"],"Configure Conditions":["Voorwaarden configureren"],"Premium":["Premium"],"Overlay Type":["Overlaytype"],"Image Overlay Color":["Afbeelding Overlay Kleur"],"Image Position":["Afbeeldingspositie"],"Attachment":["Bijlage"],"Fixed":["Vast"],"Blend Mode":["Overvloeimodus"],"Multiply":["Vermenigvuldigen"],"Screen":["Scherm"],"Darken":["Verduisteren"],"Lighten":["Verlichten"],"Color Dodge":["Kleur Dodge"],"Saturation":["Verzadiging"],"Repeat-x":["Herhaal-x"],"Repeat-y":["Herhaal-y"],"PX":["PX"],"Button":["Knop"],"Prefix Label":["Voorvoegsel Label"],"Suffix Label":["Achtervoegsel Label"],"Border Radius":["Randstraal"],"Form Theme":["Formulier Thema"],"Select Gradient":["Selecteer verloop"],"Unlock Conditional Logic Editor":["Ontgrendel de voorwaardelijke logica-editor"],"Rich Text Editor":["Rich Text Editor"],"Read Only":["Alleen lezen"],"Select Country":["Selecteer land"],"Default Country":["Standaardland"],"Subscription":["Abonnement"],"One Time":["E\u00e9n keer"],"Unique Entry":["Unieke invoer"],"Maximum Characters":["Maximale tekens"],"Textarea Height":["Hoogte van tekstvak"],"Minimum Selections":["Minimale selecties"],"Maximum Selections":["Maximale selecties"],"Add Numeric Values to Options":["Numerieke waarden aan opties toevoegen"],"Single Choice Only":["Enkel \u00e9\u00e9n keuze"],"Enable Dropdown Search":["Dropdown zoeken inschakelen"],"Allow Multiple":["Meerdere toestaan"],"%1$s fields are required. Please configure these fields in the block settings.":["%1$s velden zijn verplicht. Configureer deze velden in de blokinstellingen."],"%1$s field is required. Please configure this field in the block settings.":["%1$s veld is verplicht. Configureer dit veld in de blokinstellingen."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["U moet een betaalrekening configureren om betalingen van dit formulier te innen. Configureer uw betalingsprovider om door te gaan."],"Configure Payment Account":["Betaalrekening configureren"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Dit is een tijdelijke aanduiding voor het betalingsblok. De daadwerkelijke betalingsvelden voor uw geconfigureerde betalingsprovider(s) verschijnen alleen wanneer u het formulier bekijkt of publiceert."],"2 Payments":["2 Betalingen"],"3 Payments":["3 Betalingen"],"4 Payments":["4 Betalingen"],"5 Payments":["5 Betalingen"],"Never":["Nooit"],"Stop Subscription After":["Abonnement Stoppen Na"],"Choose when to automatically stop the subscription":["Kies wanneer het abonnement automatisch moet worden stopgezet"],"Number of Payments":["Aantal betalingen"],"Enter a number between 1 to 100":["Voer een getal in tussen 1 en 100"],"Form Field":["Formulier Veld"],"Payment Type":["Betalingstype"],"Subscription Plan Name":["Abonnementsplan Naam"],"Billing Interval":["Factureringsinterval"],"Daily":["Dagelijks"],"Weekly":["Wekelijks"],"Monthly":["Maandelijks"],"Quarterly":["Per kwartaal"],"Yearly":["Jaarlijks"],"Amount Type":["Bedragstype"],"Fixed Amount":["Vast Bedrag"],"Dynamic Amount":["Dynamisch Bedrag"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Kies of u een vast bedrag wilt rekenen of het bedrag wilt berekenen op basis van gebruikersinvoer in andere formuliervelden."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Stel het exacte bedrag in dat u wilt berekenen. Gebruikers kunnen het niet wijzigen"],"Choose Amount Field":["Kies bedragveld"],"Select a field\u2026":["Selecteer een veld\u2026"],"Minimum Amount":["Minimumbedrag"],"Set the minimum amount users can enter (0 for no minimum)":["Stel het minimale bedrag in dat gebruikers kunnen invoeren (0 voor geen minimum)"],"Customer Name Field (Required)":["Klantnaamveld (Verplicht)"],"Customer Name Field (Optional)":["Klantnaamveld (Optioneel)"],"Select the input field that contains the customer name (Required for subscriptions)":["Selecteer het invoerveld dat de klantnaam bevat (Vereist voor abonnementen)"],"Select the input field that contains the customer name":["Selecteer het invoerveld dat de klantnaam bevat"],"Customer Email Field (Required)":["Klant e-mailveld (verplicht)"],"Select the email field that contains the customer email":["Selecteer het e-mailveld dat het e-mailadres van de klant bevat"],"Payment":["Betaling"],"%s - Order ID":["%s - Bestel-ID"],"%s - Amount":["%s - Bedrag"],"%s - Customer Email":["%s - Klant e-mail"],"%s - Customer Name":["%s - Klantnaam"],"%s - Status":["%s - Status"],"Button Alignment":["Knopuitlijning"],"Placeholder":["Placeholder"],"Preselect this option":["Selecteer deze optie vooraf"],"Restrict Country Codes":["Beperk landcodes"],"Restriction Type":["Beperkingstype"],"Allow":["Toestaan"],"Block":["Blok"],"Select Allowed Countries":["Selecteer Toegestane Landen"],"Choose countries\u2026":["Kies landen\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Kies welke landcodes gebruikers kunnen selecteren in het telefoonnummer veld. Laat leeg om alle landcodes toe te staan."],"Select Blocked Countries":["Selecteer geblokkeerde landen"],"These countries will be hidden from the dropdown.":["Deze landen worden verborgen in de dropdown."],"Bulk Edit":["Bulk bewerken"],"Select Layout":["Selecteer indeling"],"Number of Columns":["Aantal kolommen"],"Validation Message for Duplicate":["Validatiebericht voor duplicaat"],"Click here to insert a form":["Klik hier om een formulier in te voegen"],"Inherit Form's Original Style":["De oorspronkelijke stijl van het formulier overnemen"],"Text on Primary":["Tekst op primair"],"%s - Description":["%s - Beschrijving"],"Upgrade to Unlock":["Upgrade om te ontgrendelen"],"Custom (Premium)":["Aangepast (Premium)"],"Select a theme style for this form embed.":["Selecteer een themastijl voor deze formulierinsluiting."],"Colors":["Kleuren"],"Advanced Styling":["Geavanceerde styling"],"Unlock Custom Styling":["Aangepaste styling ontgrendelen"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Schakel over naar Aangepaste Modus om volledige controle te krijgen over het ontwerp en de ruimte van uw formulier."],"Full color control (buttons, fields, text)":["Volledige kleurcontrole (knoppen, velden, tekst)"],"Row and column gap control":["Regel de rij- en kolomafstand"],"Field spacing and layout precision":["Veldafstand en lay-outprecisie"],"Complete button styling":["Voltooi knopstijl"],"Payment Description":["Betalingsomschrijving"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Weergegeven op betalingsbewijzen en in uw betalingsdashboard (Stripe en PayPal). Laat leeg om de standaard te gebruiken."],"Slug":["Naaktslak"],"Auto-generated on save":["Automatisch gegenereerd bij opslaan"],"This slug is already used by another field. It will revert to the previous value.":["Deze slug wordt al gebruikt door een ander veld. Het zal terugkeren naar de vorige waarde."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Het wijzigen van de slug kan ervoor zorgen dat formulierinzendingen, voorwaardelijke logica, integraties of andere functies die momenteel naar deze slug verwijzen, niet meer werken. U moet al deze verwijzingen handmatig bijwerken."],"Field Slug":["Veld Slug"],"Location Services":["Locatiediensten"],"Unlock Address Autocomplete":["Adres automatisch aanvullen ontgrendelen"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Upgrade om Google Address Autocomplete met interactieve kaartvoorvertoning in te schakelen, waardoor het invoeren van adressen sneller en nauwkeuriger wordt voor uw gebruikers."],"Enable Google Autocomplete":["Google Autocomplete inschakelen"],"Show Interactive Map":["Interactieve kaart weergeven"],"Payments Per Page":["Betalingen Per Pagina"],"Show Subscriptions Section":["Abonnementssectie weergeven"],"Show a dedicated subscriptions section above payment history.":["Toon een speciale abonnementssectie boven de betalingsgeschiedenis."],"Payment Dashboard":["Betalingsdashboard"],"View your payments and manage subscriptions in a single dashboard.":["Bekijk uw betalingen en beheer abonnementen in \u00e9\u00e9n dashboard."],"Dynamic Default Value":["Dynamische Standaardwaarde"],"Minimum Characters":["Minimale tekens"],"Minimum characters cannot exceed Maximum characters.":["Minimumtekens kunnen niet groter zijn dan maximumtekens."],"Both":["Beide"],"One-Time Label":["Eenmalig label"],"Label shown to users for the one-time payment option.":["Label getoond aan gebruikers voor de eenmalige betalingsoptie."],"Subscription Label":["Abonnementslabel"],"Label shown to users for the subscription option.":["Label getoond aan gebruikers voor de abonnementsoptie."],"Default Selection":["Standaardselectie"],"Which option is pre-selected when the form loads.":["Welke optie is vooraf geselecteerd wanneer het formulier wordt geladen."],"One-Time Amount Type":["Eenmalig Bedragstype"],"Set how the one-time payment amount is determined.":["Stel in hoe het bedrag van de eenmalige betaling wordt bepaald."],"One-Time Fixed Amount":["Eenmalig vast bedrag"],"Amount charged for a one-time payment.":["Bedrag in rekening gebracht voor een eenmalige betaling."],"One-Time Amount Field":["Eenmalig Bedrag Veld"],"Pick a form field whose value determines the one-time payment amount.":["Kies een formulier veld waarvan de waarde het eenmalige betalingsbedrag bepaalt."],"One-Time Minimum Amount":["Eenmalig Minimum Bedrag"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Minimumbedrag dat gebruikers kunnen invoeren voor een eenmalige betaling (0 voor geen minimum)."],"Subscription Amount Type":["Type abonnementsbedrag"],"Set how the subscription amount is determined.":["Stel in hoe het abonnementsbedrag wordt bepaald."],"Subscription Fixed Amount":["Vast bedrag voor abonnement"],"Recurring amount charged per billing interval.":["Terugkerend bedrag dat per factureringsinterval in rekening wordt gebracht."],"Subscription Amount Field":["Veld Abonnementsbedrag"],"Pick a form field whose value determines the subscription amount.":["Kies een formulier veld waarvan de waarde het abonnementsbedrag bepaalt."],"Subscription Minimum Amount":["Minimumbedrag voor abonnement"],"Minimum amount users can enter for subscription (0 for no minimum).":["Minimumbedrag dat gebruikers kunnen invoeren voor abonnement (0 voor geen minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Kies een veld uit uw formulier, zoals een nummer, dropdown, meerkeuze of verborgen veld, waarvan de waarde het betalingsbedrag moet bepalen."],"Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.":["Gebruik een slimme tag zoals {get_input:country}. De eerste optie waarvan de titel overeenkomt met de opgeloste waarde, wordt vooraf geselecteerd."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.":["Gebruik een slimme tag zoals {get_input:colors} en geef pijp-gescheiden waarden door in de URL (bijvoorbeeld ?colors=Red|Blue). Elke optie waarvan de titel overeenkomt met een waarde, wordt aangevinkt. Je kunt ook meerdere slimme tags aan elkaar koppelen, gescheiden door pijpen."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.":["Gebruik een slimme tag zoals {get_input:colors} en geef pijp-gescheiden waarden door in de URL (bijvoorbeeld ?colors=Red|Blue). Elke optie waarvan het label overeenkomt met een waarde, wordt vooraf geselecteerd. Je kunt ook meerdere slimme tags aan elkaar koppelen, gescheiden door pijpen."],"Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.":["Gebruik een slimme tag zoals {get_input:country}. De eerste optie waarvan het label overeenkomt met de opgeloste waarde, wordt vooraf geselecteerd."]}}} \ No newline at end of file diff --git a/languages/sureforms-nl_NL-51635fe6489fc8288d603fe596c755ca.json b/languages/sureforms-nl_NL-51635fe6489fc8288d603fe596c755ca.json index 1fc23baba..6aa1fb92e 100644 --- a/languages/sureforms-nl_NL-51635fe6489fc8288d603fe596c755ca.json +++ b/languages/sureforms-nl_NL-51635fe6489fc8288d603fe596c755ca.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Dashboard"],"Settings":["Instellingen"],"Entries":["Inzendingen"],"Activated":["Geactiveerd"],"Activate":["Activeren"],"Monday":["Maandag"],"Forms":["Formulieren"],"GitHub":["GitHub"],"General":["Algemeen"],"Other":["Anders"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"Install":["Installeren"],"Plugin Installation failed, Please try again later.":["Installatie van de plugin mislukt, probeer het later opnieuw."],"Plugin activation failed, Please try again later.":["Plug-in activering mislukt, probeer het later opnieuw."],"Integrations":["Integraties"],"What's New?":["Wat is er nieuw?"],"Core":["Kern"],"Unlicensed":["Ongeautoriseerd"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installeren & Activeren"],"Send Email To":["E-mail verzenden naar"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Onzichtbaar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validaties"],"Spam Protection":["Spam Bescherming"],"If this option is turned on, the user's IP address will be saved with the form data":["Als deze optie is ingeschakeld, wordt het IP-adres van de gebruiker samen met de formuliergegevens opgeslagen"],"Enable Honeypot Security":["Honeypot-beveiliging inschakelen"],"Enable Honeypot Security for better spam protection":["Schakel Honeypot-beveiliging in voor betere spambeveiliging"],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s vertegenwoordigt het minimum aantal selecties dat nodig is. Bijvoorbeeld: \"Minimaal 2 selecties zijn vereist.\""],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s vertegenwoordigt het maximale aantal toegestane selecties. Bijvoorbeeld: \"Maximaal 4 selecties zijn toegestaan.\""],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s vertegenwoordigt de minimale keuzes die nodig zijn. Bijvoorbeeld: \"Minimaal 1 selectie is vereist.\""],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s vertegenwoordigt het maximale aantal toegestane keuzes. Bijvoorbeeld: \"Maximaal 3 selecties zijn toegestaan.\""]," Error Message":["Foutmelding"],"Email Summaries":["E-mailoverzichten"],"Tuesday":["Dinsdag"],"Wednesday":["Woensdag"],"Thursday":["Donderdag"],"Friday":["Vrijdag"],"Saturday":["Zaterdag"],"Sunday":["Zondag"],"Schedule Reports":["Rapporten plannen"],"Auto":["Auto"],"Light":["Licht"],"Dark":["Donker"],"Turnstile":["Draaikruis"],"Get Keys":["Verkrijg sleutels"],"Documentation":["Documentatie"],"Site Key":["Sitecode"],"Secret Key":["Geheime Sleutel"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Weergavemodus"],"This field cannot be left blank.":["Dit veld mag niet leeg worden gelaten."],"Test Email":["Test e-mail"],"IP Logging":["IP-logboek"],"Honeypot":["Honeypot"],"Confirmation Email Mismatch Message":["Bevestigingsmail komt niet overeen bericht"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s vertegenwoordigt de minimale invoerwaarde. Bijvoorbeeld: \"Minimale waarde is 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s vertegenwoordigt de maximale invoerwaarde. Bijvoorbeeld: \"Maximale waarde is 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Verbind met OttoKit"],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Klaar om verder te gaan dan het gratis plan?"],"Upgrade now":["Nu upgraden"],"and unlock the full power of SureForms!":["en ontgrendel de volledige kracht van SureForms!"],"Upgrade SureForms":["Upgrade SureForms"],"Upgrade Now":["Nu upgraden"],"Form Validation":["Formuliercontrole"],"Required Error Messages":["Vereiste foutmeldingen"],"Other Error Messages":["Andere foutmeldingen"],"Input Field Unique":["Uniek invoerveld"],"Email Field Unique":["E-mailveld uniek"],"Invalid URL":["Ongeldige URL"],"Phone Field Unique":["Telefoonveld Uniek"],"Invalid Field Number Block":["Ongeldige Veldnummer Blok"],"Invalid Email":["Ongeldig e-mailadres"],"Number Minimum Value":["Nummer Minimumwaarde"],"Number Maximum Value":["Maximale waarde van het nummer"],"Dropdown Minimum Selections":["Minimale selecties in dropdown"],"Dropdown Maximum Selections":["Maximale selecties in dropdown"],"Multiple Choice Minimum Selections":["Meerdere keuzes minimumselecties"],"Multiple Choice Maximum Selections":["Meerdere Keuzes Maximale Selecties"],"Input Field":["Invoerveld"],"Email Field":["E-mailveld"],"URL Field":["URL-veld"],"Phone Field":["Telefoonveld"],"Textarea Field":["Tekstvakveld"],"Checkbox Field":["Selectievakjeveld"],"Dropdown Field":["Keuzelijstveld"],"Multiple Choice Field":["Meerkeuzeveld"],"Address Field":["Adresveld"],"Number Field":["Nummer veld"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Om de reCAPTCHA-functie op uw SureForms in te schakelen, schakelt u de reCAPTCHA-optie in uw blokinstellingen in en selecteert u de versie. Voeg hier de Google reCAPTCHA-secret en site key toe. reCAPTCHA wordt aan uw pagina toegevoegd aan de voorkant."],"Enter your %s here":["Voer hier uw %s in"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Om hCAPTCHA in te schakelen, voeg uw site-sleutel en geheime sleutel toe. Configureer deze instellingen binnen het individuele formulier."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Om Cloudflare Turnstile in te schakelen, voeg uw site-sleutel en geheime sleutel toe. Configureer deze instellingen binnen het individuele formulier."],"Save":["Opslaan"],"Anonymous Analytics":["Anonieme Analytics"],"Learn More":["Meer informatie"],"Admin Notification":["Beheerdersmelding"],"Enable Admin Notification":["Beheerdermelding inschakelen"],"Admin notifications keep you informed about new form entries since your last visit.":["Beheerdersmeldingen houden je op de hoogte van nieuwe formulierinzendingen sinds je laatste bezoek."],"Continue":["Doorgaan"],"Get Started":["Beginnen"],"Integration":["Integratie"],"Connect Native Integrations with SureForms":["Verbind native integraties met SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Ontgrendel krachtige integraties in het Premium-plan om je workflows te automatiseren en SureForms direct te verbinden met je favoriete tools."],"Send form submissions straight to CRMs, email, and marketing platforms":["Stuur formulierinzendingen rechtstreeks naar CRM's, e-mail en marketingplatforms"],"Automate repetitive tasks with seamless data syncing":["Automatiseer repetitieve taken met naadloze gegevenssynchronisatie"],"Access exclusive native integrations for faster workflows":["Toegang tot exclusieve native integraties voor snellere workflows"],"Payments":["Betalingen"],"Stripe account disconnected successfully.":["Stripe-account succesvol losgekoppeld."],"Failed to create webhook.":["Het is niet gelukt om de webhook te maken."],"Failed to connect to Stripe.":["Verbinding met Stripe mislukt."],"Webhook":["Webhook"],"Knowledge Base":["Kennisbank"],"What\u2019s New":["Wat is er nieuw"],"delete":["verwijderen"],"Please type \"%s\" in the input box":["Typ alstublieft \"%s\" in het invoerveld"],"To confirm, type \"%s\" in the box below:":["Om te bevestigen, typ \"%s\" in het vak hieronder:"],"Type \"%s\"":["Typ \"%s\""],"Go to OttoKit Settings":["Ga naar OttoKit-instellingen"],"USD - US Dollar":["USD - Amerikaanse dollar"],"Payment Mode":["Betaalwijze"],"Test Mode":["Testmodus"],"Live Mode":["Live-modus"],"General Settings":["Algemene instellingen"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Stel e-mailsamenvattingen, beheerderswaarschuwingen en gegevensvoorkeuren in om uw formulieren eenvoudig te beheren."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Pas standaardfoutmeldingen aan die worden weergegeven wanneer gebruikers ongeldige of onvolledige formulierinvoer indienen."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Schakel spambeveiliging voor uw formulieren in met behulp van CAPTCHA-diensten of honeypot-beveiliging."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Verbind en beheer uw betalingsgateways om veilig transacties via uw formulieren te accepteren."],"1% transaction and payment gateway fees apply.":["1% transactiekosten en kosten voor de betalingsgateway zijn van toepassing."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["2,9% transactiekosten en kosten voor de betalingsgateway zijn van toepassing. Activeer de licentie om de transactiekosten te verlagen."],"2.9% transaction and payment gateway fees apply.":["Er zijn 2,9% transactiekosten en kosten voor de betalingsgateway van toepassing."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Bezoek %1$s, verwijder een ongebruikte webhook en klik vervolgens hieronder om het opnieuw te proberen."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms kon geen webhook maken omdat je Stripe-account geen gratis slots meer heeft. Webhooks zijn nodig om updates over betalingen te ontvangen."],"Stripe Dashboard":["Stripe-dashboard"],"Creating\u2026":["Aan het cre\u00ebren\u2026"],"Create Webhook":["Webhook maken"],"Successfully connected to Stripe!":["Succesvol verbonden met Stripe!"],"Invalid response from server. Please try again.":["Ongeldig antwoord van de server. Probeer het alstublieft opnieuw."],"Failed to disconnect Stripe account.":["Het is niet gelukt om de Stripe-account los te koppelen."],"Webhook created successfully!":["Webhook succesvol aangemaakt!"],"Select Currency":["Selecteer valuta"],"Select the default currency for payment forms.":["Selecteer de standaardvaluta voor betalingsformulieren."],"Connection Status":["Verbindingsstatus"],"Disconnect Stripe Account":["Stripe-account loskoppelen"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Weet u zeker dat u uw Stripe-account wilt loskoppelen? Dit zal alle actieve betalingen, abonnementen en formuliertransacties die aan dit account zijn gekoppeld, stoppen."],"Disconnect":["Verbreken"],"Disconnecting\u2026":["Verbinding verbreken\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook succesvol verbonden, alle Stripe-evenementen worden gevolgd."],"Connect your Stripe account to start accepting payments through your forms.":["Verbind uw Stripe-account om betalingen via uw formulieren te accepteren."],"Connect to Stripe":["Verbinden met Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Maak veilig verbinding met Stripe met slechts een paar klikken om betalingen te accepteren!"],"Payment Methods":["Betaalmethoden"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Met de testmodus kunt u betalingen verwerken zonder echte kosten. Schakel over naar de Live-modus voor daadwerkelijke transacties."],"General Payment Settings":["Algemene betalingsinstellingen"],"These settings apply to all payment gateways.":["Deze instellingen zijn van toepassing op alle betalingsgateways."],"Stripe Settings":["Stripe-instellingen"],"Left ($100)":["Links ($100)"],"Right (100$)":["Rechts (100$)"],"Left Space ($ 100)":["Linker ruimte ($ 100)"],"Right Space (100 $)":["Rechterruimte (100 $)"],"Currency Sign Position":["Positie van het valutateken"],"Select the position of the currency symbol relative to the amount.":["Selecteer de positie van het valutasymbool ten opzichte van het bedrag."],"Learn":["Leren"],"Enable email summaries":["E-mailoverzichten inschakelen"],"Enable IP logging":["IP-logboek inschakelen"],"Turn on Admin Notification from here.":["Zet hier de beheerdersmelding aan."],"Send entries to 100+ popular apps.":["Verzend inzendingen naar meer dan 100 populaire apps."],"Build automated workflows that run instantly.":["Bouw geautomatiseerde workflows die direct worden uitgevoerd."],"Create custom app integrations using our Custom App feature.":["Maak aangepaste app-integraties met behulp van onze functie Aangepaste App."],"Keep your tools in sync automatically.":["Houd je gereedschap automatisch gesynchroniseerd."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Hiermee wordt OttoKit op je WordPress-site ge\u00efnstalleerd en geactiveerd om automatiseringsfuncties mogelijk te maken."],"Automate Your Forms with OttoKit":["Automatiseer uw formulieren met OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Elke formulierinzending zou iets moeten activeren \u2014 een Slack-melding, een CRM-lead, een opvolg-e-mail of een nieuwe rij in Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configureer AI-clientmachtigingen en MCP-serverinstellingen."],"View documentation":["Documentatie bekijken"],"Copy to clipboard":["Kopi\u00ebren naar klembord"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) of %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Claude Code"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (project) of ~\/.claude.json (globaal)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (project) of settings.json > mcp.servers (globaal)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml of config.json"],"Your client's MCP configuration file":["Het MCP-configuratiebestand van uw klant"],"Connect Your AI Client":["Verbind uw AI-client"],"AI Client":["AI-client"],"Create an Application Password \u2014 ":["Maak een applicatiewachtwoord aan \u2014"],"Open Application Passwords":["Open toepassingswachtwoorden"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Of gebruik deze CLI-opdracht om de server snel toe te voegen (je moet nog steeds de omgevingsvariabelen instellen):"],"Copy the JSON config below into: ":["Kopieer de JSON-configuratie hieronder naar:"],"Replace \"your-application-password\" with the password from Step 1.":["Vervang \"your-application-password\" door het wachtwoord uit Stap 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 het MCP-eindpunt van je site. WP_API_USERNAME \u2014 je WordPress-gebruikersnaam. WP_API_PASSWORD \u2014 het applicatiewachtwoord dat je hebt gegenereerd."],"View setup docs":["Bekijk de installatiehandleidingen"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["De MCP Adapter-plugin is ge\u00efnstalleerd maar niet actief. Activeer het om MCP-instellingen te configureren."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["De MCP Adapter-plugin is vereist om AI-clients met uw formulieren te verbinden. Download en installeer het vanaf GitHub en activeer het vervolgens."],"Download the latest release from":["Download de nieuwste release van"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installeer de plugin via Plugins > Nieuwe plugin toevoegen > Plugin uploaden."],"Activate the MCP Adapter plugin.":["Activeer de MCP Adapter-plugin."],"Activating\u2026":["Activeren\u2026"],"Activate MCP Adapter":["Activeer MCP-adapter"],"Download MCP Adapter":["Download MCP Adapter"],"Experimental":["Experimenteel"],"Enable Abilities":["Vermogen inschakelen"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registreer SureForms-mogelijkheden bij de WordPress Abilities API. Wanneer ingeschakeld, kunnen AI-clients uw formulieren en inzendingen opsommen, lezen, maken, bewerken en verwijderen. Wanneer uitgeschakeld, worden er geen mogelijkheden geregistreerd en kunnen AI-clients geen acties uitvoeren op uw formulieren."],"Abilities API \u2014 Edit":["Vaardigheden-API \u2014 Bewerken"],"Enable Edit Abilities":["Bewerkingsmogelijkheden inschakelen"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Wanneer ingeschakeld, kunnen AI-clients nieuwe formulieren maken, formuliertitels, velden en instellingen bijwerken, formulieren dupliceren en de status van inzendingen wijzigen. Wanneer uitgeschakeld, worden deze mogelijkheden uitgeschakeld en kunnen AI-clients alleen uw gegevens lezen."],"Abilities API \u2014 Delete":["Vaardigheden API \u2014 Verwijderen"],"Enable Delete Abilities":["Verwijdermogelijkheden inschakelen"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Wanneer ingeschakeld, kunnen AI-clients formulieren en invoer permanent verwijderen. Verwijderde gegevens kunnen niet worden hersteld. Wanneer uitgeschakeld, worden verwijdermogelijkheden uitgeschakeld en kunnen AI-clients geen gegevens verwijderen."],"MCP Server":["MCP-server"],"Enable MCP Server":["MCP-server inschakelen"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Maakt een speciale SureForms MCP-eindpunt aan waarmee AI-clients zoals Claude verbinding kunnen maken. Wanneer deze is uitgeschakeld, wordt het eindpunt verwijderd en kunnen externe AI-clients geen SureForms-mogelijkheden ontdekken of oproepen."],"Learn more":["Meer informatie"],"MCP Adapter Required":["MCP-adapter vereist"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configureer de Google Maps API-sleutel voor adres-autocompletie en kaartvoorbeeld."],"Help shape the future of SureForms":["Help de toekomst van SureForms vormgeven"],"Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ":["Deel hoe je de plugin gebruikt, zodat we functies kunnen ontwikkelen die ertoe doen, problemen sneller kunnen oplossen en slimmere beslissingen kunnen nemen."],"Enable Google Address Autocomplete":["Google-adres automatisch aanvullen inschakelen"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Upgrade naar het SureForms Business Plan om Google-aangedreven adres-autocompletie met interactieve kaartvoorvertoning aan uw formulieren toe te voegen."],"Auto-suggest addresses as users type for faster, error-free submissions":["Stel automatisch adressen voor terwijl gebruikers typen voor snellere, foutloze inzendingen"],"Show an interactive map preview with draggable pin for precise locations":["Toon een interactieve kaartvoorvertoning met een sleepbare pin voor precieze locaties"],"Automatically populate address fields like city, state, and postal code":["Automatisch adresvelden zoals stad, staat en postcode invullen"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Dashboard"],"Settings":["Instellingen"],"Entries":["Inzendingen"],"Activated":["Geactiveerd"],"Activate":["Activeren"],"Monday":["Maandag"],"Forms":["Formulieren"],"New Form Submission - %s":["Nieuwe formulierinzending - %s"],"GitHub":["GitHub"],"(no title)":["(geen titel)"],"General":["Algemeen"],"No tags available":["Geen tags beschikbaar"],"Generic tags":["Algemene tags"],"Other":["Anders"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"Install":["Installeren"],"Plugin Installation failed, Please try again later.":["Installatie van de plugin mislukt, probeer het later opnieuw."],"Plugin activation failed, Please try again later.":["Plug-in activering mislukt, probeer het later opnieuw."],"Integrations":["Integraties"],"What's New?":["Wat is er nieuw?"],"Core":["Kern"],"Unlicensed":["Ongeautoriseerd"],"Connecting\u2026":["Verbinden\u2026"],"Install & Activate":["Installeren & Activeren"],"Compliance Settings":["Instellingen voor naleving"],"Enable GDPR Compliance":["Schakel GDPR-naleving in"],"Never store entry data after form submission":["Sla nooit invoergegevens op na het indienen van het formulier"],"When enabled this form will never store Entries.":["Wanneer ingeschakeld, zal dit formulier nooit inzendingen opslaan."],"Automatically delete entries":["Automatisch items verwijderen"],"When enabled this form will automatically delete entries after a certain period of time.":["Wanneer ingeschakeld, zal dit formulier automatisch inzendingen na een bepaalde periode verwijderen."],"Entries older than the days set will be deleted automatically.":["Inzendingen ouder dan de ingestelde dagen worden automatisch verwijderd."],"Visual":["Visueel"],"HTML":["HTML"],"All Data":["Alle gegevens"],"Add Shortcode":["Voeg shortcode toe"],"Form input tags":["Formulierveldlabels"],"Comma separated values are also accepted.":["Door komma's gescheiden waarden worden ook geaccepteerd."],"Email Notification":["E-mailmelding"],"Name":["Naam"],"Send Email To":["E-mail verzenden naar"],"Subject":["Onderwerp"],"CC":["CC"],"BCC":["BCC"],"Reply To":["Antwoord aan"],"Add Key":["Sleutel toevoegen"],"Add Value":["Waarde toevoegen"],"Add":["Toevoegen"],"Confirmation Message":["Bevestigingsbericht"],"After Form Submission":["Na het indienen van het formulier"],"Hide Form":["Formulier verbergen"],"Reset Form":["Formulier opnieuw instellen"],"Custom URL":["Aangepaste URL"],"Add Query Parameters":["Queryparameters toevoegen"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Selecteer of u sleutel-waardeparen wilt toevoegen voor formuliervelden om op te nemen in queryparameters"],"Query Parameters":["Queryparameters"],"Success Message":["Succesbericht"],"Redirect":["Doorsturen"],"Redirect to":["Doorsturen naar"],"Page":["Pagina"],"Form Confirmation":["Formulierbevestiging"],"Confirmation Type":["Bevestigingstype"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Onzichtbaar"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Validaties"],"Spam Protection":["Spam Bescherming"],"If this option is turned on, the user's IP address will be saved with the form data":["Als deze optie is ingeschakeld, wordt het IP-adres van de gebruiker samen met de formuliergegevens opgeslagen"],"Enable Honeypot Security":["Honeypot-beveiliging inschakelen"],"Enable Honeypot Security for better spam protection":["Schakel Honeypot-beveiliging in voor betere spambeveiliging"],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s vertegenwoordigt het minimum aantal selecties dat nodig is. Bijvoorbeeld: \"Minimaal 2 selecties zijn vereist.\""],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s vertegenwoordigt het maximale aantal toegestane selecties. Bijvoorbeeld: \"Maximaal 4 selecties zijn toegestaan.\""],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s vertegenwoordigt de minimale keuzes die nodig zijn. Bijvoorbeeld: \"Minimaal 1 selectie is vereist.\""],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s vertegenwoordigt het maximale aantal toegestane keuzes. Bijvoorbeeld: \"Maximaal 3 selecties zijn toegestaan.\""]," Error Message":["Foutmelding"],"Email Summaries":["E-mailoverzichten"],"Tuesday":["Dinsdag"],"Wednesday":["Woensdag"],"Thursday":["Donderdag"],"Friday":["Vrijdag"],"Saturday":["Zaterdag"],"Sunday":["Zondag"],"Schedule Reports":["Rapporten plannen"],"Auto":["Auto"],"Light":["Licht"],"Dark":["Donker"],"Turnstile":["Draaikruis"],"Get Keys":["Verkrijg sleutels"],"Documentation":["Documentatie"],"Site Key":["Sitecode"],"Secret Key":["Geheime Sleutel"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Weergavemodus"],"Test Email":["Test e-mail"],"IP Logging":["IP-logboek"],"Honeypot":["Honeypot"],"Confirmation Email Mismatch Message":["Bevestigingsmail komt niet overeen bericht"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s vertegenwoordigt de minimale invoerwaarde. Bijvoorbeeld: \"Minimale waarde is 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s vertegenwoordigt de maximale invoerwaarde. Bijvoorbeeld: \"Maximale waarde is 100.\""],"OttoKit":["OttoKit"],"Connect with OttoKit":["Verbind met OttoKit"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd."],"We strongly recommend that you install the free ":["We raden ten zeerste aan dat u de gratis installeert"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! De Setup Wizard maakt het gemakkelijk om je e-mails te repareren."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Probeer afwisselend een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Voer een geldig e-mailadres in. Uw meldingen worden niet verzonden als het veld niet correct is ingevuld."],"From Name":["Van Naam"],"From Email":["Van e-mail"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website domein (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd."],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Klaar om verder te gaan dan het gratis plan?"],"Upgrade now":["Nu upgraden"],"and unlock the full power of SureForms!":["en ontgrendel de volledige kracht van SureForms!"],"Upgrade SureForms":["Upgrade SureForms"],"Upgrade Now":["Nu upgraden"],"Entries older than the selected days will be deleted.":["Inzendingen ouder dan de geselecteerde dagen worden verwijderd."],"Entries Time Period":["Invoerperiode"],"Notifications can use only one From Email so please enter a single address.":["Meldingen kunnen slechts \u00e9\u00e9n Van E-mailadres gebruiken, dus voer alstublieft \u00e9\u00e9n enkel adres in."],"Select Page to redirect":["Selecteer pagina om te omleiden"],"Search for a page":["Zoek naar een pagina"],"Select a page":["Selecteer een pagina"],"Form Validation":["Formuliercontrole"],"Required Error Messages":["Vereiste foutmeldingen"],"Other Error Messages":["Andere foutmeldingen"],"Input Field Unique":["Uniek invoerveld"],"Email Field Unique":["E-mailveld uniek"],"Invalid URL":["Ongeldige URL"],"Phone Field Unique":["Telefoonveld Uniek"],"Invalid Field Number Block":["Ongeldige Veldnummer Blok"],"Invalid Email":["Ongeldig e-mailadres"],"Number Minimum Value":["Nummer Minimumwaarde"],"Number Maximum Value":["Maximale waarde van het nummer"],"Dropdown Minimum Selections":["Minimale selecties in dropdown"],"Dropdown Maximum Selections":["Maximale selecties in dropdown"],"Multiple Choice Minimum Selections":["Meerdere keuzes minimumselecties"],"Multiple Choice Maximum Selections":["Meerdere Keuzes Maximale Selecties"],"Input Field":["Invoerveld"],"Email Field":["E-mailveld"],"URL Field":["URL-veld"],"Phone Field":["Telefoonveld"],"Textarea Field":["Tekstvakveld"],"Checkbox Field":["Selectievakjeveld"],"Dropdown Field":["Keuzelijstveld"],"Multiple Choice Field":["Meerkeuzeveld"],"Address Field":["Adresveld"],"Number Field":["Nummer veld"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Om de reCAPTCHA-functie op uw SureForms in te schakelen, schakelt u de reCAPTCHA-optie in uw blokinstellingen in en selecteert u de versie. Voeg hier de Google reCAPTCHA-secret en site key toe. reCAPTCHA wordt aan uw pagina toegevoegd aan de voorkant."],"Enter your %s here":["Voer hier uw %s in"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Om hCAPTCHA in te schakelen, voeg uw site-sleutel en geheime sleutel toe. Configureer deze instellingen binnen het individuele formulier."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Om Cloudflare Turnstile in te schakelen, voeg uw site-sleutel en geheime sleutel toe. Configureer deze instellingen binnen het individuele formulier."],"Save":["Opslaan"],"Anonymous Analytics":["Anonieme Analytics"],"Learn More":["Meer informatie"],"Admin Notification":["Beheerdersmelding"],"Enable Admin Notification":["Beheerdermelding inschakelen"],"Admin notifications keep you informed about new form entries since your last visit.":["Beheerdersmeldingen houden je op de hoogte van nieuwe formulierinzendingen sinds je laatste bezoek."],"Continue":["Doorgaan"],"Maximum Number of Entries":["Maximaal aantal vermeldingen"],"Maximum Entries":["Maximale invoer"],"Response Description After Maximum Entries":["Beschrijving van de reactie na maximale invoer"],"Get Started":["Beginnen"],"Integration":["Integratie"],"Connect Native Integrations with SureForms":["Verbind native integraties met SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Ontgrendel krachtige integraties in het Premium-plan om je workflows te automatiseren en SureForms direct te verbinden met je favoriete tools."],"Send form submissions straight to CRMs, email, and marketing platforms":["Stuur formulierinzendingen rechtstreeks naar CRM's, e-mail en marketingplatforms"],"Automate repetitive tasks with seamless data syncing":["Automatiseer repetitieve taken met naadloze gegevenssynchronisatie"],"Access exclusive native integrations for faster workflows":["Toegang tot exclusieve native integraties voor snellere workflows"],"Expected format for emails - email@sureforms.com or John Doe ":["Verwacht formaat voor e-mails - email@sureforms.com of John Doe "],"Payments":["Betalingen"],"Stripe account disconnected successfully.":["Stripe-account succesvol losgekoppeld."],"Failed to create webhook.":["Het is niet gelukt om de webhook te maken."],"Failed to connect to Stripe.":["Verbinding met Stripe mislukt."],"Webhook":["Webhook"],"Knowledge Base":["Kennisbank"],"What\u2019s New":["Wat is er nieuw"],"delete":["verwijderen"],"Please type \"%s\" in the input box":["Typ alstublieft \"%s\" in het invoerveld"],"To confirm, type \"%s\" in the box below:":["Om te bevestigen, typ \"%s\" in het vak hieronder:"],"Type \"%s\"":["Typ \"%s\""],"Go to OttoKit Settings":["Ga naar OttoKit-instellingen"],"USD - US Dollar":["USD - Amerikaanse dollar"],"Payment Mode":["Betaalwijze"],"Test Mode":["Testmodus"],"Live Mode":["Live-modus"],"General Settings":["Algemene instellingen"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Stel e-mailsamenvattingen, beheerderswaarschuwingen en gegevensvoorkeuren in om uw formulieren eenvoudig te beheren."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Pas standaardfoutmeldingen aan die worden weergegeven wanneer gebruikers ongeldige of onvolledige formulierinvoer indienen."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Schakel spambeveiliging voor uw formulieren in met behulp van CAPTCHA-diensten of honeypot-beveiliging."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Verbind en beheer uw betalingsgateways om veilig transacties via uw formulieren te accepteren."],"1% transaction and payment gateway fees apply.":["1% transactiekosten en kosten voor de betalingsgateway zijn van toepassing."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["2,9% transactiekosten en kosten voor de betalingsgateway zijn van toepassing. Activeer de licentie om de transactiekosten te verlagen."],"2.9% transaction and payment gateway fees apply.":["Er zijn 2,9% transactiekosten en kosten voor de betalingsgateway van toepassing."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Bezoek %1$s, verwijder een ongebruikte webhook en klik vervolgens hieronder om het opnieuw te proberen."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms kon geen webhook maken omdat je Stripe-account geen gratis slots meer heeft. Webhooks zijn nodig om updates over betalingen te ontvangen."],"Stripe Dashboard":["Stripe-dashboard"],"Creating\u2026":["Aan het cre\u00ebren\u2026"],"Create Webhook":["Webhook maken"],"Successfully connected to Stripe!":["Succesvol verbonden met Stripe!"],"Invalid response from server. Please try again.":["Ongeldig antwoord van de server. Probeer het alstublieft opnieuw."],"Failed to disconnect Stripe account.":["Het is niet gelukt om de Stripe-account los te koppelen."],"Webhook created successfully!":["Webhook succesvol aangemaakt!"],"Select Currency":["Selecteer valuta"],"Select the default currency for payment forms.":["Selecteer de standaardvaluta voor betalingsformulieren."],"Connection Status":["Verbindingsstatus"],"Disconnect Stripe Account":["Stripe-account loskoppelen"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Weet u zeker dat u uw Stripe-account wilt loskoppelen? Dit zal alle actieve betalingen, abonnementen en formuliertransacties die aan dit account zijn gekoppeld, stoppen."],"Disconnect":["Verbreken"],"Disconnecting\u2026":["Verbinding verbreken\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook succesvol verbonden, alle Stripe-evenementen worden gevolgd."],"Connect your Stripe account to start accepting payments through your forms.":["Verbind uw Stripe-account om betalingen via uw formulieren te accepteren."],"Connect to Stripe":["Verbinden met Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Maak veilig verbinding met Stripe met slechts een paar klikken om betalingen te accepteren!"],"Set the total number of submissions allowed for this form.":["Stel het totale aantal toegestane inzendingen voor dit formulier in."],"Payment Methods":["Betaalmethoden"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Met de testmodus kunt u betalingen verwerken zonder echte kosten. Schakel over naar de Live-modus voor daadwerkelijke transacties."],"General Payment Settings":["Algemene betalingsinstellingen"],"These settings apply to all payment gateways.":["Deze instellingen zijn van toepassing op alle betalingsgateways."],"Stripe Settings":["Stripe-instellingen"],"Left ($100)":["Links ($100)"],"Right (100$)":["Rechts (100$)"],"Left Space ($ 100)":["Linker ruimte ($ 100)"],"Right Space (100 $)":["Rechterruimte (100 $)"],"Currency Sign Position":["Positie van het valutateken"],"Select the position of the currency symbol relative to the amount.":["Selecteer de positie van het valutasymbool ten opzichte van het bedrag."],"Learn":["Leren"],"Enable email summaries":["E-mailoverzichten inschakelen"],"Enable IP logging":["IP-logboek inschakelen"],"Turn on Admin Notification from here.":["Zet hier de beheerdersmelding aan."],"Send entries to 100+ popular apps.":["Verzend inzendingen naar meer dan 100 populaire apps."],"Build automated workflows that run instantly.":["Bouw geautomatiseerde workflows die direct worden uitgevoerd."],"Create custom app integrations using our Custom App feature.":["Maak aangepaste app-integraties met behulp van onze functie Aangepaste App."],"Keep your tools in sync automatically.":["Houd je gereedschap automatisch gesynchroniseerd."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Hiermee wordt OttoKit op je WordPress-site ge\u00efnstalleerd en geactiveerd om automatiseringsfuncties mogelijk te maken."],"Automate Your Forms with OttoKit":["Automatiseer uw formulieren met OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Elke formulierinzending zou iets moeten activeren \u2014 een Slack-melding, een CRM-lead, een opvolg-e-mail of een nieuwe rij in Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configureer AI-clientmachtigingen en MCP-serverinstellingen."],"View documentation":["Documentatie bekijken"],"Copy to clipboard":["Kopi\u00ebren naar klembord"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) of %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Claude Code"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (project) of ~\/.claude.json (globaal)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (project) of settings.json > mcp.servers (globaal)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml of config.json"],"Your client's MCP configuration file":["Het MCP-configuratiebestand van uw klant"],"Connect Your AI Client":["Verbind uw AI-client"],"AI Client":["AI-client"],"Create an Application Password \u2014 ":["Maak een applicatiewachtwoord aan \u2014"],"Open Application Passwords":["Open toepassingswachtwoorden"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Of gebruik deze CLI-opdracht om de server snel toe te voegen (je moet nog steeds de omgevingsvariabelen instellen):"],"Copy the JSON config below into: ":["Kopieer de JSON-configuratie hieronder naar:"],"Replace \"your-application-password\" with the password from Step 1.":["Vervang \"your-application-password\" door het wachtwoord uit Stap 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 het MCP-eindpunt van je site. WP_API_USERNAME \u2014 je WordPress-gebruikersnaam. WP_API_PASSWORD \u2014 het applicatiewachtwoord dat je hebt gegenereerd."],"View setup docs":["Bekijk de installatiehandleidingen"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["De MCP Adapter-plugin is ge\u00efnstalleerd maar niet actief. Activeer het om MCP-instellingen te configureren."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["De MCP Adapter-plugin is vereist om AI-clients met uw formulieren te verbinden. Download en installeer het vanaf GitHub en activeer het vervolgens."],"Download the latest release from":["Download de nieuwste release van"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Installeer de plugin via Plugins > Nieuwe plugin toevoegen > Plugin uploaden."],"Activate the MCP Adapter plugin.":["Activeer de MCP Adapter-plugin."],"Activating\u2026":["Activeren\u2026"],"Activate MCP Adapter":["Activeer MCP-adapter"],"Download MCP Adapter":["Download MCP Adapter"],"Experimental":["Experimenteel"],"Enable Abilities":["Vermogen inschakelen"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registreer SureForms-mogelijkheden bij de WordPress Abilities API. Wanneer ingeschakeld, kunnen AI-clients uw formulieren en inzendingen opsommen, lezen, maken, bewerken en verwijderen. Wanneer uitgeschakeld, worden er geen mogelijkheden geregistreerd en kunnen AI-clients geen acties uitvoeren op uw formulieren."],"Abilities API \u2014 Edit":["Vaardigheden-API \u2014 Bewerken"],"Enable Edit Abilities":["Bewerkingsmogelijkheden inschakelen"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Wanneer ingeschakeld, kunnen AI-clients nieuwe formulieren maken, formuliertitels, velden en instellingen bijwerken, formulieren dupliceren en de status van inzendingen wijzigen. Wanneer uitgeschakeld, worden deze mogelijkheden uitgeschakeld en kunnen AI-clients alleen uw gegevens lezen."],"Abilities API \u2014 Delete":["Vaardigheden API \u2014 Verwijderen"],"Enable Delete Abilities":["Verwijdermogelijkheden inschakelen"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Wanneer ingeschakeld, kunnen AI-clients formulieren en invoer permanent verwijderen. Verwijderde gegevens kunnen niet worden hersteld. Wanneer uitgeschakeld, worden verwijdermogelijkheden uitgeschakeld en kunnen AI-clients geen gegevens verwijderen."],"MCP Server":["MCP-server"],"Enable MCP Server":["MCP-server inschakelen"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Maakt een speciale SureForms MCP-eindpunt aan waarmee AI-clients zoals Claude verbinding kunnen maken. Wanneer deze is uitgeschakeld, wordt het eindpunt verwijderd en kunnen externe AI-clients geen SureForms-mogelijkheden ontdekken of oproepen."],"Learn more":["Meer informatie"],"MCP Adapter Required":["MCP-adapter vereist"],"Heading 1":["Kop 1"],"Heading 2":["Kop 2"],"Heading 3":["Kop 3"],"Heading 4":["Kop 4"],"Heading 5":["Kop 5"],"Heading 6":["Kop 6"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configureer de Google Maps API-sleutel voor adres-autocompletie en kaartvoorbeeld."],"Help shape the future of SureForms":["Help de toekomst van SureForms vormgeven"],"Enable Google Address Autocomplete":["Google-adres automatisch aanvullen inschakelen"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Upgrade naar het SureForms Business Plan om Google-aangedreven adres-autocompletie met interactieve kaartvoorvertoning aan uw formulieren toe te voegen."],"Auto-suggest addresses as users type for faster, error-free submissions":["Stel automatisch adressen voor terwijl gebruikers typen voor snellere, foutloze inzendingen"],"Show an interactive map preview with draggable pin for precise locations":["Toon een interactieve kaartvoorvertoning met een sleepbare pin voor precieze locaties"],"Automatically populate address fields like city, state, and postal code":["Automatisch adresvelden zoals stad, staat en postcode invullen"],"This form is now closed as we've received all the entries.":["Dit formulier is nu gesloten omdat we alle inzendingen hebben ontvangen."],"Thank you for contacting us! We will be in touch with you shortly.":["Bedankt dat u contact met ons heeft opgenomen! We nemen binnenkort contact met u op."],"Saving\u2026":["Opslaan\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Wanneer ingeschakeld, zal dit formulier het IP-adres van de gebruiker, de naam van de browser en de naam van het apparaat niet opslaan in de inzendingen."],"Form data":["Formuliergegevens"],"Unsaved changes":["Niet-opgeslagen wijzigingen"],"Keep editing":["Blijf bewerken"],"Global Defaults":["Globale Standaarden"],"Form Restrictions":["Formulierbeperkingen"],"Configure default settings that apply to newly created forms.":["Stel de standaardinstellingen in die van toepassing zijn op nieuw aangemaakte formulieren."],"Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ":["Verzamel niet-gevoelige informatie van uw website, zoals de gebruikte PHP-versie en functies, om ons te helpen bugs sneller op te lossen, slimmere beslissingen te nemen en functies te bouwen die echt belangrijk voor u zijn. "],"Failed to load pages. Please refresh and try again.":["Het laden van pagina's is mislukt. Vernieuw de pagina en probeer het opnieuw."],"Failed to load settings. Please refresh and try again.":["Het laden van de instellingen is mislukt. Vernieuw de pagina en probeer het opnieuw."],"Form Validation fields cannot be left blank.":["Formulier validatievelden mogen niet leeg worden gelaten."],"Recipient email is required when email summaries are enabled.":["Ontvanger e-mail is vereist wanneer e-mailoverzichten zijn ingeschakeld."],"Please enter a valid recipient email.":["Voer een geldig e-mailadres van de ontvanger in."],"Settings saved.":["Instellingen opgeslagen."],"Failed to save settings.":["Opslaan van instellingen mislukt."],"Some settings failed to save. Please retry.":["Sommige instellingen konden niet worden opgeslagen. Probeer het opnieuw."],"Some fields have unsaved changes. Discard them to continue, or stay to save your edits.":["Sommige velden hebben niet-opgeslagen wijzigingen. Verwijder ze om door te gaan, of blijf om je wijzigingen op te slaan."],"Discard & switch":["Weggooien & overschakelen"],"Quill heading picker: default paragraph style\u0004Normal":["Normaal"]}}} \ No newline at end of file diff --git a/languages/sureforms-nl_NL-8cf77722f0a349f4f2e7f56437f288f9.json b/languages/sureforms-nl_NL-8cf77722f0a349f4f2e7f56437f288f9.json index d3b0c2de4..6b5986c7a 100644 --- a/languages/sureforms-nl_NL-8cf77722f0a349f4f2e7f56437f288f9.json +++ b/languages/sureforms-nl_NL-8cf77722f0a349f4f2e7f56437f288f9.json @@ -1 +1 @@ -{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Dashboard"],"Settings":["Instellingen"],"Entries":["Inzendingen"],"Move to Trash":["Verplaatsen naar prullenbak"],"Export":["Exporteren"],"Trash":["Afval"],"Published":["Gepubliceerd"],"Restore":["Herstellen"],"Delete Permanently":["Permanent verwijderen"],"Activated":["Geactiveerd"],"Edit":["Bewerken"],"Import Form":["Importformulier"],"Add New Form":["Nieuw formulier toevoegen"],"View Form":["Formulier bekijken"],"Forms":["Formulieren"],"Shortcode":["Kortingscode"],"(no title)":["(geen titel)"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"What's New?":["Wat is er nieuw?"],"Core":["Kern"],"Unlicensed":["Ongeautoriseerd"],"Page":["Pagina"],"Clear Filter":["Filter wissen"],"No Date":["Geen datum"],"Invalid Date":["Ongeldige datum"],"Ready to go beyond free plan?":["Klaar om verder te gaan dan het gratis plan?"],"Upgrade now":["Nu upgraden"],"and unlock the full power of SureForms!":["en ontgrendel de volledige kracht van SureForms!"],"Upgrade SureForms":["Upgrade SureForms"],"Clear Filters":["Filters wissen"],"Select Date Range":["Selecteer datumbereik"],"Actions":["Acties"],"Duplicate":["Duplicaat"],"All Forms":["Alle formulieren"],"Date & Time":["Datum & Tijd"],"Payments":["Betalingen"],"Knowledge Base":["Kennisbank"],"What\u2019s New":["Wat is er nieuw"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/jjjj - dd\/mm\/jjjj"],"out of":["uit"],"No entries found":["Geen items gevonden"],"delete":["verwijderen"],"Please type \"%s\" in the input box":["Typ alstublieft \"%s\" in het invoerveld"],"To confirm, type \"%s\" in the box below:":["Om te bevestigen, typ \"%s\" in het vak hieronder:"],"Type \"%s\"":["Typ \"%s\""],"No results found":["Geen resultaten gevonden"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["We konden geen records vinden die overeenkomen met uw filters. Probeer de filters aan te passen of ze opnieuw in te stellen om alle resultaten te zien."],"Please select a file to import.":["Selecteer een bestand om te importeren."],"Invalid JSON file format.":["Ongeldig JSON-bestandsformaat."],"Failed to read file.":["Kan bestand niet lezen."],"Import failed.":["Importeren mislukt."],"An error occurred during import.":["Er is een fout opgetreden tijdens het importeren."],"Import Forms":["Formulieren importeren"],"Please select a valid JSON file.":["Selecteer een geldig JSON-bestand."],"Drag and drop or browse files":["Slepen en neerzetten of bestanden bladeren"],"Importing\u2026":["Importeren\u2026"],"Drafts":["Concepten"],"Search forms\u2026":["Zoekformulieren\u2026"],"No forms found":["Geen formulieren gevonden"],"Title":["Titel"],"Copied!":["Gekopieerd!"],"Copy Shortcode":["Kopieer shortcode"],"No Forms":["Geen formulieren"],"Hi there, let's get you started":["Hoi daar, laten we je op weg helpen"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Het lijkt erop dat je nog geen formulieren hebt gemaakt. Begin met bouwen met SureForms en lanceer krachtige formulieren in slechts een paar klikken."],"Design forms with our Gutenberg-native builder.":["Ontwerp formulieren met onze Gutenberg-native bouwer."],"Use AI to generate forms instantly from a simple prompt.":["Gebruik AI om formulieren direct te genereren vanuit een eenvoudige prompt."],"Build engaging conversational, calculation, and multi-step forms.":["Bouw boeiende conversatie-, berekenings- en meerstapsformulieren."],"Create Form":["Formulier maken"],"An error occurred while fetching forms.":["Er is een fout opgetreden bij het ophalen van formulieren."],"%d form moved to trash.":["%d formulier verplaatst naar de prullenbak."],"%d form restored.":["%d formulier hersteld."],"%d form permanently deleted.":["%d formulier permanent verwijderd."],"An error occurred while performing the action.":["Er is een fout opgetreden tijdens het uitvoeren van de actie."],"%d form imported successfully.":["%d formulier succesvol ge\u00efmporteerd."],"%d form will be moved to trash and can be restored later.":["%d formulier wordt naar de prullenbak verplaatst en kan later worden hersteld."],"Delete Form":["Formulier verwijderen"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Weet u zeker dat u %d formulier permanent wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt."],"Restore Form":["Formulier herstellen"],"%d form will be restored from trash.":["%d formulier zal worden hersteld uit de prullenbak."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Weet u zeker dat u dit formulier permanent wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt."],"This form will be moved to trash and can be restored later.":["Dit formulier wordt naar de prullenbak verplaatst en kan later worden hersteld."],"An error occurred while duplicating the form.":["Er is een fout opgetreden bij het dupliceren van het formulier."],"This will create a copy of \"%s\" with all its settings.":["Dit zal een kopie maken van \"%s\" met al zijn instellingen."],"Learn":["Leren"],"Export failed: no data received.":["Export mislukt: geen gegevens ontvangen."],"Select a SureForms export file (.json) to import.":["Selecteer een SureForms-exportbestand (.json) om te importeren."],"Drop a form file (.json) here":["Laat hier een formulierbestand (.json) vallen"],"(Draft)":["(Ontwerp)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Bouw direct formulieren en deel ze met een link\u2014insluiten is niet nodig."],"Form \"%s\" duplicated successfully.":["Formulier \"%s\" is succesvol gedupliceerd."],"Error loading forms":["Fout bij het laden van formulieren"],"Move form to trash?":["Formulier naar prullenbak verplaatsen?"],"Delete form?":["Formulier verwijderen?"],"Duplicate form?":["Formulier dupliceren?"]}}} \ No newline at end of file +{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Dashboard"],"Settings":["Instellingen"],"Entries":["Inzendingen"],"Move to Trash":["Verplaatsen naar prullenbak"],"Export":["Exporteren"],"Trash":["Afval"],"Published":["Gepubliceerd"],"Restore":["Herstellen"],"Delete Permanently":["Permanent verwijderen"],"Activated":["Geactiveerd"],"Edit":["Bewerken"],"Import Form":["Importformulier"],"Add New Form":["Nieuw formulier toevoegen"],"View Form":["Formulier bekijken"],"Forms":["Formulieren"],"Shortcode":["Kortingscode"],"(no title)":["(geen titel)"],"Confirm":["Bevestigen"],"Cancel":["Annuleren"],"What's New?":["Wat is er nieuw?"],"Core":["Kern"],"Unlicensed":["Ongeautoriseerd"],"Page":["Pagina"],"Clear Filter":["Filter wissen"],"No Date":["Geen datum"],"Invalid Date":["Ongeldige datum"],"Ready to go beyond free plan?":["Klaar om verder te gaan dan het gratis plan?"],"Upgrade now":["Nu upgraden"],"and unlock the full power of SureForms!":["en ontgrendel de volledige kracht van SureForms!"],"Upgrade SureForms":["Upgrade SureForms"],"Clear Filters":["Filters wissen"],"Select Date Range":["Selecteer datumbereik"],"Actions":["Acties"],"Duplicate":["Duplicaat"],"All Forms":["Alle formulieren"],"Date & Time":["Datum & Tijd"],"Payments":["Betalingen"],"Knowledge Base":["Kennisbank"],"What\u2019s New":["Wat is er nieuw"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/jjjj - dd\/mm\/jjjj"],"out of":["uit"],"No entries found":["Geen items gevonden"],"delete":["verwijderen"],"Please type \"%s\" in the input box":["Typ alstublieft \"%s\" in het invoerveld"],"To confirm, type \"%s\" in the box below:":["Om te bevestigen, typ \"%s\" in het vak hieronder:"],"Type \"%s\"":["Typ \"%s\""],"No results found":["Geen resultaten gevonden"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["We konden geen records vinden die overeenkomen met uw filters. Probeer de filters aan te passen of ze opnieuw in te stellen om alle resultaten te zien."],"Please select a file to import.":["Selecteer een bestand om te importeren."],"Invalid JSON file format.":["Ongeldig JSON-bestandsformaat."],"Failed to read file.":["Kan bestand niet lezen."],"Import failed.":["Importeren mislukt."],"An error occurred during import.":["Er is een fout opgetreden tijdens het importeren."],"Import Forms":["Formulieren importeren"],"Please select a valid JSON file.":["Selecteer een geldig JSON-bestand."],"Drag and drop or browse files":["Slepen en neerzetten of bestanden bladeren"],"Importing\u2026":["Importeren\u2026"],"Drafts":["Concepten"],"Search forms\u2026":["Zoekformulieren\u2026"],"No forms found":["Geen formulieren gevonden"],"Title":["Titel"],"Copied!":["Gekopieerd!"],"Copy Shortcode":["Kopieer shortcode"],"No Forms":["Geen formulieren"],"Hi there, let's get you started":["Hoi daar, laten we je op weg helpen"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Het lijkt erop dat je nog geen formulieren hebt gemaakt. Begin met bouwen met SureForms en lanceer krachtige formulieren in slechts een paar klikken."],"Design forms with our Gutenberg-native builder.":["Ontwerp formulieren met onze Gutenberg-native bouwer."],"Use AI to generate forms instantly from a simple prompt.":["Gebruik AI om formulieren direct te genereren vanuit een eenvoudige prompt."],"Build engaging conversational, calculation, and multi-step forms.":["Bouw boeiende conversatie-, berekenings- en meerstapsformulieren."],"Create Form":["Formulier maken"],"An error occurred while fetching forms.":["Er is een fout opgetreden bij het ophalen van formulieren."],"%d form moved to trash.":["%d formulier verplaatst naar de prullenbak."],"%d form restored.":["%d formulier hersteld."],"%d form permanently deleted.":["%d formulier permanent verwijderd."],"An error occurred while performing the action.":["Er is een fout opgetreden tijdens het uitvoeren van de actie."],"%d form imported successfully.":["%d formulier succesvol ge\u00efmporteerd."],"%d form will be moved to trash and can be restored later.":["%d formulier wordt naar de prullenbak verplaatst en kan later worden hersteld."],"Delete Form":["Formulier verwijderen"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Weet u zeker dat u %d formulier permanent wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt."],"Restore Form":["Formulier herstellen"],"%d form will be restored from trash.":["%d formulier zal worden hersteld uit de prullenbak."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Weet u zeker dat u dit formulier permanent wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt."],"This form will be moved to trash and can be restored later.":["Dit formulier wordt naar de prullenbak verplaatst en kan later worden hersteld."],"An error occurred while duplicating the form.":["Er is een fout opgetreden bij het dupliceren van het formulier."],"This will create a copy of \"%s\" with all its settings.":["Dit zal een kopie maken van \"%s\" met al zijn instellingen."],"Learn":["Leren"],"Export failed: no data received.":["Export mislukt: geen gegevens ontvangen."],"Select a SureForms export file (.json) to import.":["Selecteer een SureForms-exportbestand (.json) om te importeren."],"Drop a form file (.json) here":["Laat hier een formulierbestand (.json) vallen"],"(Draft)":["(Ontwerp)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Bouw direct formulieren en deel ze met een link\u2014insluiten is niet nodig."],"Form \"%s\" duplicated successfully.":["Formulier \"%s\" is succesvol gedupliceerd."],"Error loading forms":["Fout bij het laden van formulieren"],"Move form to trash?":["Formulier naar prullenbak verplaatsen?"],"Delete form?":["Formulier verwijderen?"],"Duplicate form?":["Formulier dupliceren?"],"Switch to Draft":["Overschakelen naar concept"],"%d form switched to draft.":["%d formulier omgezet naar concept."],"Switch form to draft?":["Formulier naar concept schakelen?"],"%d form will be switched to draft and will no longer be publicly accessible.":["%d formulier wordt omgezet naar concept en zal niet langer openbaar toegankelijk zijn."],"This form will be switched to draft and will no longer be publicly accessible.":["Dit formulier wordt omgezet naar concept en zal niet langer openbaar toegankelijk zijn."]}}} \ No newline at end of file diff --git a/languages/sureforms-nl_NL-e2cfcb2408d95abf73e3ead4a0965656.json b/languages/sureforms-nl_NL-e2cfcb2408d95abf73e3ead4a0965656.json new file mode 100644 index 000000000..a67647e69 --- /dev/null +++ b/languages/sureforms-nl_NL-e2cfcb2408d95abf73e3ead4a0965656.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-12-13T12:33:48+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/partialEntriesEmptyState.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Dashboard"],"Settings":["Instellingen"],"Entries":["Inzendingen"],"Activated":["Geactiveerd"],"Forms":["Formulieren"],"What's New?":["Wat is er nieuw?"],"Core":["Kern"],"Unlicensed":["Ongeautoriseerd"],"Ready to go beyond free plan?":["Klaar om verder te gaan dan het gratis plan?"],"Upgrade now":["Nu upgraden"],"and unlock the full power of SureForms!":["en ontgrendel de volledige kracht van SureForms!"],"Upgrade SureForms":["Upgrade SureForms"],"Payments":["Betalingen"],"Knowledge Base":["Kennisbank"],"What\u2019s New":["Wat is er nieuw"],"Learn":["Leren"],"Upgrade to SureForms":["Upgrade naar SureForms"],"Partial Entries Placeholder":["Placeholder voor gedeeltelijke invoer"],"Capture in-progress form data the moment visitors stop typing \u2014 no submit required":["Leg in-progress formuliergegevens vast op het moment dat bezoekers stoppen met typen \u2014 geen verzending vereist"],"Recover abandoned submissions and follow up with prospects you would otherwise lose":["Herstel verlaten inzendingen en volg potenti\u00eble klanten op die je anders zou verliezen"],"Let visitors pick up where they left off with secure, shareable resume links":["Laat bezoekers verdergaan waar ze gebleven waren met veilige, deelbare hervattingslinks"],"Stop Losing Leads to Abandoned Forms":["Stop met het verliezen van leads door verlaten formulieren"],"See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:":["Zie wat bezoekers hebben getypt voordat ze wegliepen. Upgrade naar SureForms Premium om Gedeeltelijke Inzendingen te ontgrendelen:"]}}} \ No newline at end of file diff --git a/languages/sureforms-nl_NL.mo b/languages/sureforms-nl_NL.mo index 6f444983f..42f89a57c 100644 Binary files a/languages/sureforms-nl_NL.mo and b/languages/sureforms-nl_NL.mo differ diff --git a/languages/sureforms-nl_NL.po b/languages/sureforms-nl_NL.po index 23c6f139c..b0eb8f897 100644 --- a/languages/sureforms-nl_NL.po +++ b/languages/sureforms-nl_NL.po @@ -14,9 +14,9 @@ msgstr "" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -43,13 +43,14 @@ msgstr "Een eenvoudige maar krachtige manier om moderne formulieren voor uw webs msgid "https://sureforms.com/" msgstr "https://sureforms.com/" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -58,15 +59,16 @@ msgstr "https://sureforms.com/" msgid "Dashboard" msgstr "Dashboard" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -74,21 +76,22 @@ msgstr "Dashboard" msgid "Settings" msgstr "Instellingen" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "Nieuw formulier" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -97,7 +100,7 @@ msgid "Entries" msgstr "Inzendingen" #. Translators: Post Title. -#: admin/admin.php:843 +#: admin/admin.php:869 #, php-format msgid "Edit %1$s" msgstr "Bewerk %1$s" @@ -111,19 +114,19 @@ msgstr "Bewerk %1$s" #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "Verificatie van nonce mislukt." #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 +#: admin/admin.php:1504 #, php-format msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "Gelieve %1$suw exemplaar van %3$s te activeren%2$s om nieuwe functies te krijgen, toegang tot ondersteuning, update-meldingen te ontvangen en meer." -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 @@ -191,7 +194,7 @@ msgstr "Afval" msgid "Published" msgstr "Gepubliceerd" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "Bekijken" @@ -275,17 +278,18 @@ msgstr "Geen plugin opgegeven" msgid "Plugin Successfully Activated" msgstr "Plugin succesvol geactiveerd" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "Activeren..." -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -294,17 +298,17 @@ msgstr "Activeren..." msgid "Activated" msgstr "Geactiveerd" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "Activeren" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "Installeren..." -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "Geïnstalleerd" @@ -312,14 +316,14 @@ msgstr "Geïnstalleerd" msgid "You do not have permission to access this page." msgstr "U heeft geen toestemming om deze pagina te openen." -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "Ongeldige nonce." @@ -328,7 +332,7 @@ msgid "Form ID is required." msgstr "Formulier-ID is vereist." #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1001 msgid "Invalid form ID." msgstr "Ongeldige formulier-ID." @@ -580,28 +584,23 @@ msgstr "Er is een fout opgetreden bij het indienen van uw formulier. Probeer het msgid "Test Email Sent Successfully." msgstr "Test-e-mail succesvol verzonden." -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "Geen formulieren gevonden." #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "Maandag" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" -msgstr "Fout bij het opslaan van instellingen!" - -#: inc/global-settings/global-settings.php:122 #: assets/build/formEditor.js:172 msgid "Global Settings" msgstr "Globale instellingen" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "Instellingen succesvol opgeslagen." @@ -615,7 +614,6 @@ msgid "Advanced Fields" msgstr "Geavanceerde velden" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "Dit veld is verplicht." @@ -670,7 +668,7 @@ msgstr "Verbergen" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "Formulier bewerken" @@ -694,37 +692,38 @@ msgstr "Maken" msgid "Import Form" msgstr "Importformulier" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "Nieuw formulier toevoegen" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "Geen records gevonden" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "Hier verschijnen uw formulierinvoeren" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "Formulier bekijken" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "Formulieren bekijken" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -732,32 +731,37 @@ msgstr "Formulieren bekijken" msgid "Forms" msgstr "Formulieren" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "Zoekformulieren" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "Ouderformulieren:" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "Geen formulieren gevonden in de prullenbak." -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "Formulier gepubliceerd." -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "Formulier bijgewerkt." -#: inc/post-types.php:977 +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 msgid "Admin Notification Email" msgstr "Beheerdersmelding E-mail" #. translators: %s: Form title smart tag -#: inc/post-types.php:984 +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 #, php-format msgid "New Form Submission - %s" msgstr "Nieuwe formulierinzending - %s" @@ -8221,7 +8225,7 @@ msgstr "Sociaal" msgid "Travel" msgstr "Reizen" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "Leeg formulier" @@ -8251,6 +8255,7 @@ msgstr "Gemaakt met ♡ %s" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "(geen titel)" @@ -8277,7 +8282,7 @@ msgstr "Formulier wijzigen" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "Dit formulier is verwijderd of is niet beschikbaar." @@ -8323,6 +8328,7 @@ msgstr "Geavanceerd" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "Geen tags beschikbaar" @@ -8367,6 +8373,7 @@ msgstr "Resetten" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "Algemene tags" @@ -8746,6 +8753,7 @@ msgstr "Integraties" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8758,6 +8766,7 @@ msgstr "Wat is er nieuw?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8770,6 +8779,7 @@ msgstr "Kern" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8778,52 +8788,52 @@ msgid "Unlicensed" msgstr "Ongeautoriseerd" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 #, js-format msgid "%s Removed from Quick Action Bar." msgstr "%s verwijderd van de snelle actiebalk." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "Toevoegen aan de Snelle Actiebalk" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 #, js-format msgid "%s Added to Quick Action Bar." msgstr "%s toegevoegd aan de Snelle Actiebalk." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "Al aanwezig in de snelle actiebalk" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "Geen resultaten gevonden." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "gegevensobject is leeg" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "Blokken toevoegen aan de Snelle Actiebalk" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "Blok herschikken in de Snelle Actiebalk" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -8849,30 +8859,37 @@ msgid "Install & Activate" msgstr "Installeren & Activeren" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Compliance Settings" msgstr "Instellingen voor naleving" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "Schakel GDPR-naleving in" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "Sla nooit invoergegevens op na het indienen van het formulier" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "Wanneer ingeschakeld, zal dit formulier nooit inzendingen opslaan." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "Automatisch items verwijderen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "Wanneer ingeschakeld, zal dit formulier automatisch inzendingen na een bepaalde periode verwijderen." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "Inzendingen ouder dan de ingestelde dagen worden automatisch verwijderd." @@ -8885,34 +8902,42 @@ msgid "The following CSS styles added below will only apply to this form contain msgstr "De volgende CSS-stijlen die hieronder worden toegevoegd, zijn alleen van toepassing op deze formuliercontainer." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "Visueel" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "HTML" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "Alle gegevens" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "Voeg shortcode toe" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "Formulierveldlabels" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Comma separated values are also accepted." msgstr "Door komma's gescheiden waarden worden ook geaccepteerd." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "E-mailmelding" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Name" msgstr "Naam" @@ -8922,18 +8947,22 @@ msgid "Send Email To" msgstr "E-mail verzenden naar" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Subject" msgstr "Onderwerp" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "CC" msgstr "CC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "BCC" msgstr "BCC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reply To" msgstr "Antwoord aan" @@ -8942,54 +8971,57 @@ msgid "Add Notification" msgstr "Melding toevoegen" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." -msgstr "E-mailmelding succesvol uitgeschakeld." - -#: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." -msgstr "E-mailmelding succesvol ingeschakeld." - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "Sleutel toevoegen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "Waarde toevoegen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "Toevoegen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "Bevestigingsbericht" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "Na het indienen van het formulier" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "Formulier verbergen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "Formulier opnieuw instellen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "Aangepaste URL" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "Queryparameters toevoegen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "Selecteer of u sleutel-waardeparen wilt toevoegen voor formuliervelden om op te nemen in queryparameters" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "Queryparameters" @@ -9002,14 +9034,17 @@ msgid "Suggestion: URL should use HTTPS" msgstr "Suggestie: URL moet HTTPS gebruiken" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Success Message" msgstr "Succesbericht" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect" msgstr "Doorsturen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect to" msgstr "Doorsturen naar" @@ -9017,14 +9052,17 @@ msgstr "Doorsturen naar" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "Pagina" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form Confirmation" msgstr "Formulierbevestiging" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "Bevestigingstype" @@ -9166,7 +9204,7 @@ msgstr "Centrum" msgid "Right" msgstr "Rechts" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1178 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" @@ -9176,7 +9214,7 @@ msgstr "Google reCAPTCHA" msgid "CloudFlare Turnstile" msgstr "CloudFlare Turnstile" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1182 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" @@ -9235,7 +9273,8 @@ msgstr "Pagina-einde" msgid "Previous" msgstr "Vorige" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 #: assets/build/formEditor.js:172 msgid "Thank you" msgstr "Dank je" @@ -9450,7 +9489,7 @@ msgstr "Sitecode" msgid "Secret Key" msgstr "Geheime Sleutel" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1186 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "Cloudflare Turnstile" @@ -9459,10 +9498,6 @@ msgstr "Cloudflare Turnstile" msgid "Appearance Mode" msgstr "Weergavemodus" -#: assets/build/settings.js:172 -msgid "This field cannot be left blank." -msgstr "Dit veld mag niet leeg worden gelaten." - #: assets/build/templatePicker.js:172 msgid "Connect Now" msgstr "Nu verbinden" @@ -10403,7 +10438,7 @@ msgid "icon" msgstr "icoon" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 +#: admin/admin.php:1522 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "SureForms %1$s vereist minimaal %2$s %3$s om goed te functioneren. Werk alstublieft bij naar de nieuwste versie van %4$shier%5$s." @@ -10425,7 +10460,7 @@ msgstr "IP-logboek" msgid "Honeypot" msgstr "Honeypot" -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "Beoordeel SureForms" @@ -10481,18 +10516,18 @@ msgstr "Ontgrendel Notitie Toevoegen" msgid "With the SureForms Starter plan, enhance your submitted form entries by adding personalized notes for better clarity and tracking." msgstr "Met het SureForms Starter-plan kunt u uw ingediende formulierinzendingen verbeteren door gepersonaliseerde notities toe te voegen voor meer duidelijkheid en betere tracking." -#: inc/form-submit.php:823 +#: inc/form-submit.php:852 msgid "Email notification passed to the sending server" msgstr "E-mailmelding doorgestuurd naar de verzendserver" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 +#: inc/form-submit.php:925 #, php-format msgid "Email notification recipient: %s" msgstr "E-mail notificatie ontvanger: %s" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 +#: inc/form-submit.php:942 #, php-format msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "E-mailserver kon de e-mailmelding niet verzenden. Ontvanger: %1$s. Reden: %2$s" @@ -10535,7 +10570,7 @@ msgstr "Ontgrendel Gespreksformulieren" msgid "With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience." msgstr "Met het SureForms Pro Plan kun je je formulieren omzetten in boeiende, conversatiegerichte lay-outs voor een naadloze gebruikerservaring." -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "Verkrijg SureForms Pro" @@ -10631,7 +10666,7 @@ msgstr "PX" msgid "Button" msgstr "Knop" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" @@ -10663,46 +10698,56 @@ msgid "SUREFORMS PREMIUM FIELDS" msgstr "SUREFORMS PREMIUM VELDEN" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "Het huidige 'Van E-mailadres' komt niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "We strongly recommend that you install the free " msgstr "We raden ten zeerste aan dat u de gratis installeert" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "plugin! De Setup Wizard maakt het gemakkelijk om je e-mails te repareren." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "Probeer afwisselend een Van-adres te gebruiken dat overeenkomt met uw website-domein (admin@%s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "Voer een geldig e-mailadres in. Uw meldingen worden niet verzonden als het veld niet correct is ingevuld." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Name" msgstr "Van Naam" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Email" msgstr "Van e-mail" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%1$s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd. Probeer in plaats daarvan een Van-adres te gebruiken dat overeenkomt met uw website domein (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "Het huidige 'Van E-mailadres' komt mogelijk niet overeen met de domeinnaam van uw website (%s). Dit kan ervoor zorgen dat uw notificatie-e-mails worden geblokkeerd of als spam worden gemarkeerd." @@ -10736,24 +10781,24 @@ msgstr "Selecteer verloop" msgid "reCAPTCHA" msgstr "reCAPTCHA" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1122 msgid "Captcha validation failed. No error code provided." msgstr "Captcha-validatie mislukt. Geen foutcode opgegeven." -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1123 msgid "Captcha validation failed." msgstr "Captcha-validatie mislukt." -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1190 msgid "Unknown Captcha" msgstr "Onbekende Captcha" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1191 msgid "Invalid captcha type." msgstr "Ongeldig captcha-type." #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 +#: inc/form-submit.php:1204 #, php-format msgid "%s verification failed. Please contact your site administrator." msgstr "%s verificatie mislukt. Neem contact op met uw sitebeheerder." @@ -10776,11 +10821,11 @@ msgstr "HCaptcha sitekey-verificatie mislukt. Neem contact op met uw sitebeheerd msgid "%s sitekey is missing. Please contact your site administrator." msgstr "%s sitekey ontbreekt. Neem contact op met uw sitebeheerder." -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "SureMail" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "Starter Sjablonen" @@ -10821,6 +10866,7 @@ msgstr "Ongeldige datum" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10833,6 +10879,7 @@ msgstr "Klaar om verder te gaan dan het gratis plan?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10845,6 +10892,7 @@ msgstr "Nu upgraden" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10857,6 +10905,7 @@ msgstr "en ontgrendel de volledige kracht van SureForms!" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10947,10 +10996,12 @@ msgid "Free" msgstr "Gratis" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "Inzendingen ouder dan de geselecteerde dagen worden verwijderd." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "Invoerperiode" @@ -10959,6 +11010,7 @@ msgid "Custom CSS Panel" msgstr "Aangepast CSS-paneel" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "Meldingen kunnen slechts één Van E-mailadres gebruiken, dus voer alstublieft één enkel adres in." @@ -10986,14 +11038,17 @@ msgid "Delete" msgstr "Verwijderen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "Selecteer pagina om te omleiden" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "Zoek naar een pagina" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "Selecteer een pagina" @@ -11119,6 +11174,7 @@ msgstr "Om hCAPTCHA in te schakelen, voeg uw site-sleutel en geheime sleutel toe msgid "To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form." msgstr "Om Cloudflare Turnstile in te schakelen, voeg uw site-sleutel en geheime sleutel toe. Configureer deze instellingen binnen het individuele formulier." +#: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Save" msgstr "Opslaan" @@ -11139,8 +11195,8 @@ msgstr "Beschrijf het formulier dat je wilt maken" msgid "We are building your form…" msgstr "We zijn uw formulier aan het maken…" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "SMTP" @@ -11270,28 +11326,28 @@ msgstr "Beheerdermelding inschakelen" msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "Beheerdersmeldingen houden je op de hoogte van nieuwe formulierinzendingen sinds je laatste bezoek." -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "Ongeautoriseerde gebruiker." #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 +#: admin/admin.php:1774 #, php-format msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "%1$sBegin met %2$shet bouwen van je eerste formulier%3$s.%4$s%5$sErvaar de kracht van onze intuïtieve AI Form Builder%6$s" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "SureForms wacht op je!" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "Bouw Mijn Eerste Formulier" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "Afwijzen" @@ -11311,51 +11367,51 @@ msgstr "Inloggen" msgid "Register" msgstr "Registreren" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "Recente items" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "( Laatste 7 dagen )" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "Gebruik voorwaardelijke logica om alleen te tonen wat ertoe doet" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "Verdeel uw formulier in stappen om het eenvoudig te houden" -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "Laat mensen bestanden direct naar uw formulier uploaden" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "Zet reacties automatisch om in downloadbare PDF's" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "Laat gebruikers ondertekenen met een eenvoudig handtekeningveld" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "Verbind uw formulier met andere tools via webhooks" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "Gebruik Conversational Forms voor een chat-achtige ervaring" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "Laat gebruikers zich registreren of inloggen via uw formulier" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "Bouw formulieren die WordPress-gebruikersaccounts aanmaken" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "Berekeningen toevoegen om scores of prijzen automatisch op te tellen" @@ -11585,21 +11641,21 @@ msgstr "Laatste details die het verschil maken:" msgid "Build Your First Form" msgstr "Bouw je eerste formulier" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "Ongeldige nonce-actie of naam." -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "Ongeldig beveiligingstoken." -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "Ongeldig verzoektype." -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "U heeft geen toestemming om deze actie uit te voeren." @@ -11677,10 +11733,12 @@ msgid "Form Restriction" msgstr "Formulierbeperking" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "Maximaal aantal vermeldingen" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "Maximale invoer" @@ -11698,6 +11756,7 @@ msgid "Click here" msgstr "Klik hier" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "Beschrijving van de reactie na maximale invoer" @@ -11711,7 +11770,7 @@ msgstr "Hoi daar," msgid "Email Summary of your last week - %1$s to %2$s" msgstr "E-mailoverzicht van uw afgelopen week - %1$s tot %2$s" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "Ultieme Add-ons voor Elementor" @@ -11773,7 +11832,7 @@ msgstr "Verken SureDash" msgid "Something went wrong. We have logged the error for further investigation" msgstr "Er is iets misgegaan. We hebben de fout geregistreerd voor verder onderzoek." -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "Veld is niet geldig." @@ -11837,16 +11896,18 @@ msgid "SureForms Video Thumbnail" msgstr "SureForms Video Miniatuur" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Expected format for emails - email@sureforms.com or John Doe " msgstr "Verwacht formaat voor e-mails - email@sureforms.com of John Doe " -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -12010,47 +12071,47 @@ msgstr "Testmodus is ingeschakeld:" msgid "Click here to enable live mode and accept payment" msgstr "Klik hier om de live modus in te schakelen en betaling te accepteren" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "Verhoog direct de bezorgbaarheid van uw e-mails!" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "Toegang tot een krachtige, gebruiksvriendelijke e-mailbezorgservice die ervoor zorgt dat uw e-mails in inboxen terechtkomen, niet in spamfolders. Automatiseer uw WordPress e-mailworkflows met vertrouwen met SureMail." -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "Automatiseer moeiteloos je WordPress-werkstromen." -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "Verbind je WordPress-plugins en favoriete apps, automatiseer taken en synchroniseer gegevens moeiteloos met behulp van OttoKit's overzichtelijke, visuele workflowbouwer — geen codering of complexe installatie vereist." -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "Start prachtige websites in enkele minuten!" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "Kies uit professioneel ontworpen sjablonen, importeer met één klik en pas moeiteloos aan om bij uw merk te passen." -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "Geef Elementor een boost om sneller verbluffende websites te bouwen!" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "Verbeter Elementor met krachtige widgets en sjablonen. Bouw verbluffende, hoog presterende websites sneller met creatieve designelementen en naadloze aanpassing." -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "SureRank" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "Verhoog uw SEO en klim moeiteloos in de zoekresultaten!" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "Verhoog de zichtbaarheid van je website met slimme SEO-automatisering. Optimaliseer content, volg de prestaties van zoekwoorden en krijg bruikbare inzichten, allemaal binnen WordPress." @@ -12175,49 +12236,49 @@ msgstr "%1$d betaling(en) succesvol verwijderd. %2$d mislukt." msgid "Failed to delete payments. Please try again." msgstr "Verwijderen van betalingen mislukt. Probeer het opnieuw." -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "Onbekend formulier" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "N.v.t." #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "Subscription" msgstr "Abonnement" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "Vernieuwing" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "Eén keer" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "Onbekend" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -12233,7 +12294,7 @@ msgstr "Een geldig klant-e-mailadres is vereist voor betalingen." #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -12312,7 +12373,7 @@ msgstr "Onverwachte fout: %s" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "Abonnement-ID niet gevonden." @@ -12375,9 +12436,9 @@ msgstr "Abonnementsverificatie" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 +#: inc/payments/stripe/stripe-webhook.php:1120 #, php-format msgid "Subscription ID: %s" msgstr "Abonnement-ID: %s" @@ -12392,13 +12453,13 @@ msgstr "Abonnement-ID: %s" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 #, php-format msgid "Payment Gateway: %s" msgstr "Betalingsgateway: %s" @@ -12411,7 +12472,7 @@ msgstr "Betalingsintentie-ID: %s" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 +#: inc/payments/stripe/stripe-webhook.php:1050 #, php-format msgid "Charge ID: %s" msgstr "Betaal-ID: %s" @@ -12421,14 +12482,14 @@ msgstr "Betaal-ID: %s" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 +#: inc/payments/stripe/admin-stripe-handler.php:516 #, php-format msgid "Subscription Status: %s" msgstr "Abonnementsstatus: %s" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 +#: inc/payments/stripe/stripe-webhook.php:1124 #, php-format msgid "Customer ID: %s" msgstr "Klant-ID: %s" @@ -12437,8 +12498,8 @@ msgstr "Klant-ID: %s" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 #, php-format msgid "Amount: %1$s %2$s" msgstr "Bedrag: %1$s %2$s" @@ -12473,7 +12534,7 @@ msgstr "Betalingsverificatie" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 +#: inc/payments/stripe/stripe-webhook.php:1112 #, php-format msgid "Transaction ID: %s" msgstr "Transactie-ID: %s" @@ -12482,7 +12543,7 @@ msgstr "Transactie-ID: %s" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 #, php-format msgid "Status: %s" msgstr "Status: %s" @@ -12850,23 +12911,23 @@ msgid "Unknown error" msgstr "Onbekende fout" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "Ontbrekend betalings-ID." -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "Je mag deze actie niet uitvoeren." #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "Betaling niet gevonden in de database." #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "Dit is geen abonnementsbetaling." @@ -12876,7 +12937,7 @@ msgid "Subscription cancellation failed." msgstr "Annulering van abonnement mislukt." #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "Het is niet gelukt om de abonnementsstatus in de database bij te werken." @@ -12885,58 +12946,58 @@ msgstr "Het is niet gelukt om de abonnementsstatus in de database bij te werken. msgid "Invalid payment data." msgstr "Ongeldige betalingsgegevens." -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "Alleen geslaagde of gedeeltelijk terugbetaalde betalingen kunnen worden terugbetaald." -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "Transactie-ID komt niet overeen." -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "Ongeldig transactie-ID-formaat voor terugbetaling." -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "Het is niet gelukt om de terugbetaling via de Stripe API te verwerken." -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "Het is niet gelukt om het betalingsrecord bij te werken na de terugbetaling." #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "Betaling succesvol terugbetaald." #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "Het verwerken van de terugbetaling is mislukt. Probeer het alstublieft opnieuw." -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "Het pauzeren van het abonnement is mislukt." -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "Vol" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "Gedeeltelijk" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 #, php-format msgid "Refund ID: %s" msgstr "Terugbetalings-ID: %s" @@ -12944,9 +13005,9 @@ msgstr "Terugbetalings-ID: %s" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 #, php-format msgid "Refund Amount: %1$s %2$s" msgstr "Terugbetalingsbedrag: %1$s %2$s" @@ -12954,9 +13015,9 @@ msgstr "Terugbetalingsbedrag: %1$s %2$s" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 #, php-format msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "Totaal terugbetaald: %1$s %2$s van %3$s %4$s" @@ -12964,9 +13025,9 @@ msgstr "Totaal terugbetaald: %1$s %2$s van %3$s %4$s" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 #, php-format msgid "Refund Status: %s" msgstr "Terugbetalingsstatus: %s" @@ -12975,10 +13036,10 @@ msgstr "Terugbetalingsstatus: %s" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 #, php-format msgid "Payment Status: %s" msgstr "Betalingsstatus: %s" @@ -12986,132 +13047,132 @@ msgstr "Betalingsstatus: %s" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 #, php-format msgid "Refunded by: %s" msgstr "Terugbetaald door: %s" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 #, php-format msgid "Refund Notes: %s" msgstr "Terugbetalingsnotities: %s" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 #, php-format msgid "%s Payment Refund" msgstr "%s Terugbetaling van betaling" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 #, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "Webhooks houden SureForms gesynchroniseerd met Stripe door automatisch betalings- en abonnementsgegevens bij te werken. Gelieve %1$s Webhook." -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "configureren" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "Ongeldige terugbetalingsparameters verstrekt." -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "Deze betaling is niet gerelateerd aan een abonnement." -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "Alleen actieve, geslaagde of gedeeltelijk terugbetaalde abonnementsbetalingen kunnen worden terugbetaald." -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "Het aanmaken van een Stripe-terugbetaling is mislukt. Controleer uw Stripe-dashboard voor meer details." -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "Terugbetaling is verwerkt door Stripe, maar het bijwerken van lokale records is mislukt. Controleer uw betalingsgegevens handmatig." -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "Abonnementbetaling succesvol terugbetaald." #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 +#: inc/payments/stripe/admin-stripe-handler.php:977 #, php-format msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "Terugbetalingsbedrag overschrijdt het beschikbare bedrag. Maximale terugbetaling: %1$s %2$s" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "Het restitutiebedrag moet groter zijn dan nul." -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "Het restitutiebedrag moet minimaal $0,50 zijn." -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "Kan de juiste terugbetalingsmethode voor deze abonnementsbetaling niet bepalen." #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 +#: inc/payments/stripe/admin-stripe-handler.php:1256 #, php-format msgid "%s Subscription Payment Refund" msgstr "%s Terugbetaling van abonnementsgeld" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "Deze betaling is al volledig terugbetaald." -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "De betaling kon niet worden gevonden in Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "Het restitutiebedrag overschrijdt het beschikbare restitueerbare bedrag." -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "De betaling voor dit abonnement kon niet worden gevonden." -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "Het abonnement kon niet worden gevonden in Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "Dit abonnement heeft geen succesvolle betalingen om terug te betalen." -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "De betaalmethode voor dit abonnement is ongeldig." -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "Onvoldoende rechten om terugbetalingen te verwerken." -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "Te veel verzoeken. Probeer het over een moment opnieuw." -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "Netwerkfout. Controleer uw verbinding en probeer het opnieuw." #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 +#: inc/payments/stripe/admin-stripe-handler.php:1308 #, php-format msgid "Subscription refund failed: %s" msgstr "Terugbetaling van abonnement mislukt: %s" @@ -13261,7 +13322,7 @@ msgstr "Geannuleerd op: %s" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 +#: inc/payments/stripe/stripe-webhook.php:892 #, php-format msgid "Cancellation Reason: %s" msgstr "Annuleringsreden: %s" @@ -13280,24 +13341,24 @@ msgstr "Abonnement geannuleerd" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "Webhook" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "Terugbetaling geannuleerd" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:882 #, php-format msgid "Canceled Refund Amount: %1$s %2$s" msgstr "Geannuleerd terugbetalingsbedrag: %1$s %2$s" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 +#: inc/payments/stripe/stripe-webhook.php:885 #, php-format msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "Resterend terugbetaald: %1$s %2$s van %3$s %4$s" @@ -13306,52 +13367,52 @@ msgstr "Resterend terugbetaald: %1$s %2$s van %3$s %4$s" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:896 #, php-format msgid "Canceled by: %s" msgstr "Geannuleerd door: %s" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "Eerste abonnementsbetaling geslaagd" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 #, php-format msgid "Invoice ID: %s" msgstr "Factuurnummer: %s" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "Betalingsstatus: Geslaagd" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "Abonnementsstatus: Actief" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "Betaling van abonnementskosten" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "Geslaagd" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 +#: inc/payments/stripe/stripe-webhook.php:1126 #, php-format msgid "Customer Email: %s" msgstr "Klant e-mail: %s" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 +#: inc/payments/stripe/stripe-webhook.php:1128 #, php-format msgid "Customer Name: %s" msgstr "Klantnaam: %s" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "Aangemaakt via abonnementsfactureringscyclus" @@ -13359,19 +13420,20 @@ msgstr "Aangemaakt via abonnementsfactureringscyclus" msgid "Edit this form" msgstr "Bewerk dit formulier" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." msgstr "Uw formulier is succesvol ingediend. We zullen uw gegevens bekijken en nemen binnenkort contact met u op." #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "Invoer-ID is vereist." #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "Invoer niet gevonden." @@ -13571,6 +13633,7 @@ msgstr "Selecteer het e-mailveld dat het e-mailadres van de klant bevat" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13583,6 +13646,7 @@ msgstr "Kennisbank" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13664,6 +13728,7 @@ msgid "Go to Forms" msgstr "Ga naar Formulieren" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13671,6 +13736,7 @@ msgid "delete" msgstr "verwijderen" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13679,6 +13745,7 @@ msgid "Please type \"%s\" in the input box" msgstr "Typ alstublieft \"%s\" in het invoerveld" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13687,6 +13754,7 @@ msgid "To confirm, type \"%s\" in the box below:" msgstr "Om te bevestigen, typ \"%s\" in het vak hieronder:" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14113,7 +14181,7 @@ msgstr "Gebruik AI om formulieren direct te genereren vanuit een eenvoudige prom msgid "Build engaging conversational, calculation, and multi-step forms." msgstr "Bouw boeiende conversatie-, berekenings- en meerstapsformulieren." -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "Formulier maken" @@ -14897,22 +14965,22 @@ msgstr "Opmerking: Het abonnement is permanent geannuleerd. De klant zal niet la #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "Gepauzeerd" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 +#: inc/payments/stripe/admin-stripe-handler.php:521 #, php-format msgid "Paused by: %s" msgstr "Gepauzeerd door: %s" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "Opmerking: De facturering van het abonnement is gepauzeerd. Er zullen geen kosten in rekening worden gebracht totdat het abonnement wordt hervat." -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "Abonnement Gepauzeerd" @@ -14921,6 +14989,7 @@ msgid "This entry will be moved to trash and can be restored later." msgstr "Dit item wordt naar de prullenbak verplaatst en kan later worden hersteld." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "Stel het totale aantal toegestane inzendingen voor dit formulier in." @@ -15048,7 +15117,7 @@ msgstr "Waarde van het variabele bedrag veld is vereist." msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "Betalingsbedrag onder het minimum. Minimum: %1$s, ontvangen %2$s." -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "(Kopie)" @@ -15109,12 +15178,14 @@ msgstr "Dit zal een kopie maken van \"%s\" met al zijn instellingen." msgid "Pay with credit or debit card" msgstr "Betalen met creditcard of betaalpas" +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 msgid "This form is not yet available. Please check back after the scheduled start time." msgstr "Dit formulier is nog niet beschikbaar. Kom na de geplande starttijd terug." #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "Dit formulier accepteert geen inzendingen meer. De inzendperiode is afgelopen." @@ -15133,7 +15204,7 @@ msgstr "Terugbetalingsverwerking wordt niet ondersteund voor %s-gateway." msgid "Number field configuration not found." msgstr "Configuratie van het nummer veld niet gevonden." -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "Ongeldige terugbetalingsparameters." @@ -15248,24 +15319,24 @@ msgid "Stripe Settings" msgstr "Stripe-instellingen" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 +#: admin/admin.php:1439 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "SureForms %1$s vereist minimaal %2$s %3$s om goed te functioneren. Werk alstublieft bij naar de nieuwste versie." -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "Nu bijwerken" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "SureContact" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "Zet e-mails om in inkomsten met een CRM die is gebouwd voor uw website!" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "Verstuur nieuwsbrieven, voer campagnes uit, stel automatiseringen in, beheer contacten en zie precies hoeveel omzet je e-mails genereren, allemaal op één plek." @@ -15301,13 +15372,14 @@ msgstr "Positie van het valutateken" msgid "Select the position of the currency symbol relative to the amount." msgstr "Selecteer de positie van het valutasymbool ten opzichte van het bedrag." -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -15315,40 +15387,40 @@ msgstr "Selecteer de positie van het valutasymbool ten opzichte van het bedrag." msgid "Learn" msgstr "Leren" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "Geweldig! SureForms ondersteunt je formulieren en inzendingen - laten we samen blijven groeien!" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "Als SureForms nuttig is geweest, zou u dan een moment willen nemen om een 5-sterrenbeoordeling achter te laten op WordPress.org?" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "Misschien later" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "Ik heb het al gedaan" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "SureForms is klaar om uw formulieren van stroom te voorzien — ontdek wat er mogelijk is!" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "Beheer uw formulieren, volg inzendingen en ontdek functies zoals AI Form Builder, betalingsintegraties en meer vanaf het SureForms-dashboard." -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "Ga naar Dashboard" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "Ik weet het al" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "Ongeldige parameters." @@ -15510,7 +15582,7 @@ msgstr "Er is ten minste één formulier veld vereist." msgid "Failed to generate form fields from the provided data." msgstr "Kan geen formuliervelden genereren uit de verstrekte gegevens." -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "Het is niet gelukt om het formulier te maken." @@ -15730,15 +15802,16 @@ msgstr "Tekstveld" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "Dit formulier is nog niet beschikbaar. Kom terug na de geplande starttijd." +#: inc/admin/html-form-detector.php:268 #: inc/form-submit.php:99 #: inc/form-submit.php:400 #: inc/form-submit.php:445 -#: inc/form-submit.php:968 +#: inc/form-submit.php:997 #: inc/payments/front-end.php:78 #: inc/payments/front-end.php:263 #: inc/rest-api.php:98 @@ -15752,9 +15825,10 @@ msgstr "Dit formulier is nog niet beschikbaar. Kom terug na de geplande starttij #: inc/rest-api.php:667 #: inc/rest-api.php:716 #: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 msgid "Security verification failed. Please refresh the page and try again." msgstr "Beveiligingsverificatie mislukt. Vernieuw de pagina en probeer het opnieuw." @@ -15787,19 +15861,19 @@ msgstr "Controleer het formulier op fouten." msgid "Your submission was flagged as spam. Please try again." msgstr "Je inzending is gemarkeerd als spam. Probeer het opnieuw." -#: inc/form-submit.php:651 +#: inc/form-submit.php:680 msgid "Unable to submit form. Please try again." msgstr "Kan formulier niet verzenden. Probeer het opnieuw." -#: inc/form-submit.php:903 +#: inc/form-submit.php:932 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "Er is geen SMTP-plug-in gedetecteerd. Configureer een SMTP-plug-in om het verzenden van e-mails mogelijk te maken." -#: inc/form-submit.php:904 +#: inc/form-submit.php:933 msgid "Email sending failed for an unknown reason." msgstr "E-mail verzenden mislukt om een onbekende reden." -#: inc/form-submit.php:943 +#: inc/form-submit.php:972 msgid "No emails were sent." msgstr "Er zijn geen e-mails verzonden." @@ -15984,7 +16058,7 @@ msgstr "Betaling kan niet worden aangemaakt. Neem contact op met de ondersteunin msgid "Subscription canceled successfully!" msgstr "Abonnement succesvol geannuleerd!" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "Abonnement succesvol gepauzeerd!" @@ -16016,8 +16090,8 @@ msgstr "Kan webhook niet verwijderen." msgid "Unable to connect to Stripe." msgstr "Kan geen verbinding maken met Stripe." -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "Dit formulier is gesloten. De indieningsperiode is afgelopen." @@ -16056,28 +16130,28 @@ msgstr "Ongeldige actie. Gebruik \"gelezen\" of \"ongelezen\"." msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "Ongeldige actie. Gebruik \"prullenbak\" of \"herstellen\"." -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "Selecteer ten minste één formulier en specificeer een actie." -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "Formulier niet gevonden of is geen geldig formulier type." -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "Dit formulier bevindt zich al in de prullenbak." -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "Dit formulier bevindt zich niet in de prullenbak." -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "Ongeldige actie." #. translators: %s: action name -#: inc/rest-api.php:1100 +#: inc/rest-api.php:1124 #, php-format msgid "Failed to %s this form. Please try again." msgstr "Het is niet gelukt om dit formulier te %s. Probeer het alstublieft opnieuw." @@ -16220,10 +16294,6 @@ msgstr "Invoerinformatie" msgid "Resend Email Notification" msgstr "E-mailmelding opnieuw verzenden" -#: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." -msgstr "Wanneer ingeschakeld, zal dit formulier geen gebruikers-IP, browsernaam of apparaatsnaam opslaan in inzendingen." - #: assets/build/formEditor.js:172 msgid "Select a spam protection service. Configure API keys in Global Settings before enabling." msgstr "Selecteer een spambeveiligingsdienst. Configureer API-sleutels in de globale instellingen voordat u deze inschakelt." @@ -16691,26 +16761,27 @@ msgstr "Webhook-geheim niet geconfigureerd." msgid "Invalid webhook signature." msgstr "Ongeldige webhook-handtekening." -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "Quizzen" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "Quizinzendingen" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "Nieuw" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1006 msgid "Invalid form." msgstr "Ongeldig formulier." -#: inc/form-submit.php:982 +#: inc/form-submit.php:1011 msgid "Too many requests. Please try again shortly." msgstr "Te veel verzoeken. Probeer het binnenkort opnieuw." @@ -16922,10 +16993,6 @@ msgstr "Privacybeleid" msgid "Finish" msgstr "Voltooien" -#: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." -msgstr "Kies een spambeveiligingsmethode voor dit formulier om ongewenste inzendingen te voorkomen." - #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Send entries to 100+ popular apps." @@ -17005,6 +17072,7 @@ msgstr "Maak boeiende quizzen met SureForms" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "Verander je formulieren in krachtige quizzen. Upgrade naar SureForms om quizmogelijkheden te ontgrendelen:" +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/surveyEmptyState.js:172 msgid "Upgrade to SureForms" @@ -17222,39 +17290,45 @@ msgstr "Perfect voor educatie, training en leuke trivia" msgid "Select this to create a quiz with scored questions and graded results." msgstr "Selecteer dit om een quiz te maken met gescoorde vragen en beoordeelde resultaten." -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "Onderzoeksrapporten" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "Kop 1" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "Kop 2" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "Kop 3" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "Kop 4" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "Kop 5" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "Kop 6" @@ -17271,7 +17345,7 @@ msgid "Cancellation not supported for this gateway." msgstr "Annulering wordt niet ondersteund voor deze gateway." #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "Abonnement succesvol geannuleerd." @@ -17488,10 +17562,6 @@ msgstr "Configureer de Google Maps API-sleutel voor adres-autocompletie en kaart msgid "Help shape the future of SureForms" msgstr "Help de toekomst van SureForms vormgeven" -#: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " -msgstr "Deel hoe je de plugin gebruikt, zodat we functies kunnen ontwikkelen die ertoe doen, problemen sneller kunnen oplossen en slimmere beslissingen kunnen nemen." - #: assets/build/settings.js:172 msgid "Enable Google Address Autocomplete" msgstr "Google-adres automatisch aanvullen inschakelen" @@ -17576,16 +17646,16 @@ msgstr "Poolse Złoty" msgid "Dynamic Default Value" msgstr "Dynamische Standaardwaarde" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "Hey! Het lijkt erop dat je een formulier aan het maken bent. Bouw een gebruiksklaar formulier in minder dan 30 seconden met SureForms AI, zonder extra installatie vereist." -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "Ongeldige post." -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "Je kunt dit bericht niet bewerken." @@ -17624,7 +17694,7 @@ msgid "Error creating SureForms Form." msgstr "Fout bij het maken van SureForms-formulier." #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 #, php-format msgid "Please enter at least %s characters." @@ -17782,22 +17852,374 @@ msgstr "De AI-reactie was leeg. Gelieve uw prompt te verfijnen en het opnieuw te msgid "Unable to build form fields from the AI response." msgstr "Kan formuliervelden niet opbouwen vanuit de AI-reactie." -#: inc/post-types.php:205 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "Gedeeltelijke invoer" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." +msgstr "Dit formulier is nu gesloten omdat we alle inzendingen hebben ontvangen." + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." +msgstr "Ongeldig instellingen tabblad." + +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "Bedankt dat u contact met ons heeft opgenomen! We nemen binnenkort contact met u op." + +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "Gebruik de herstelactie om een verwijderde formulier te herstellen voordat u het naar concept schakelt." + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "Dit formulier is al een concept." + +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "U heeft geen toestemming om dit formulier te bewerken." + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "Ongeldige formulier-id." + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "Formulierinstellingen opgeslagen." + +#: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "De invoerlimiet is afhankelijk van opgeslagen invoeren om inzendingen te tellen. Als in de nalevingsinstellingen \"Nooit invoergegevens opslaan na formulierinzending\" is ingeschakeld, wordt deze limiet niet afgedwongen. Schakel die optie uit, of verwijder de invoerlimiet, om deze functie te gebruiken." + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "Placeholder voor gedeeltelijke invoer" + +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "Placeholdertekst weergegeven in het lege invoerveld/tekstvak of als de lege eerste optie in een dropdown." + +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "Array van velden geproduceerd door de parser aan de editorzijde." + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "Ruwe HTML van de bron . Vereist wanneer het vertrouwen van de parser laag is, zodat we de opmaak aan de AI-middleware kunnen overhandigen." + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "Beste poging tot stylingdescriptor (hex-kleuren) geëxtraheerd uit inline stijlen op het bron." + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "Je mag HTML-formulieren niet converteren." + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "Omgezette vorm" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "Het HTML-formulier is te groot om te converteren. Vereenvoudig de opmaak of bouw het formulier handmatig." + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "Er konden geen velden worden afgeleid van het verstrekte formulier." + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "De SureForms AI-service kon dit formulier niet verwerken. Probeer het opnieuw of maak het formulier handmatig." + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "De SureForms AI-service gaf een onbruikbaar antwoord. Probeer het opnieuw of maak het formulier handmatig." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "Gebruik een slimme tag zoals {get_input:country}. De eerste optie waarvan de titel overeenkomt met de opgeloste waarde, wordt vooraf geselecteerd." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "Gebruik een slimme tag zoals {get_input:colors} en geef pijp-gescheiden waarden door in de URL (bijvoorbeeld ?colors=Red|Blue). Elke optie waarvan de titel overeenkomt met een waarde, wordt aangevinkt. Je kunt ook meerdere slimme tags aan elkaar koppelen, gescheiden door pijpen." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "Gebruik een slimme tag zoals {get_input:colors} en geef pijp-gescheiden waarden door in de URL (bijvoorbeeld ?colors=Red|Blue). Elke optie waarvan het label overeenkomt met een waarde, wordt vooraf geselecteerd. Je kunt ook meerdere slimme tags aan elkaar koppelen, gescheiden door pijpen." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "Gebruik een slimme tag zoals {get_input:country}. De eerste optie waarvan het label overeenkomt met de opgeloste waarde, wordt vooraf geselecteerd." + +#: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "Instellingen opgeslagen, maar postattributen (wachtwoord / titel / inhoud) konden niet worden bijgewerkt. Probeer opnieuw om ze te behouden." + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "Opslaan van formulierinstellingen mislukt." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "Opslaan…" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." +msgstr "Wanneer ingeschakeld, zal dit formulier het IP-adres van de gebruiker, de naam van de browser en de naam van het apparaat niet opslaan in de inzendingen." + +#: assets/build/formEditor.js:172 +msgid "Failed to save. Please try again." +msgstr "Opslaan mislukt. Probeer het opnieuw." + +#: assets/build/formEditor.js:172 +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "reCAPTCHA API-sleutels voor de geselecteerde versie zijn niet geconfigureerd. Stel ze in bij de Globale Instellingen." + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "Selecteer een reCAPTCHA-versie. " + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "hCaptcha API-sleutels zijn niet geconfigureerd. Stel ze in bij de Algemene Instellingen." + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." +msgstr "Cloudflare Turnstile API-sleutels zijn niet geconfigureerd. Stel ze in bij de Globale Instellingen." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "Formuliergegevens" + +#: assets/build/formEditor.js:172 +msgid "Some fields need attention" +msgstr "Sommige velden hebben aandacht nodig" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Unsaved changes" +msgstr "Niet-opgeslagen wijzigingen" + +#: assets/build/formEditor.js:172 +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "Een e-mailadres van de ontvanger en een onderwerpregel zijn vereist voordat deze melding kan worden opgeslagen. Corrigeer de gemarkeerde velden of verwijder uw wijzigingen om terug te gaan." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "Je hebt niet-opgeslagen wijzigingen voor deze melding. Verwijder ze om terug te gaan, of blijf om ze op te slaan." + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "Verwijderen & teruggaan" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "Blijf & repareer" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" +msgstr "Blijf bewerken" + +#: assets/build/formEditor.js:172 +msgid "Please provide a recipient email address." +msgstr "Geef alstublieft een e-mailadres van de ontvanger op." + +#: assets/build/formEditor.js:172 +msgid "Please provide a subject line." +msgstr "Geef alstublieft een onderwerpregel op." + +#: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "Geef een aangepaste URL op." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "Je hebt niet-opgeslagen wijzigingen. Verwijder ze om door te gaan, of blijf om je wijzigingen op te slaan." + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "Weggooien & doorgaan" + +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "Overschakelen naar concept" + +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "%d formulier omgezet naar concept." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "Formulier naar concept schakelen?" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "%d formulier wordt omgezet naar concept en zal niet langer openbaar toegankelijk zijn." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "Dit formulier wordt omgezet naar concept en zal niet langer openbaar toegankelijk zijn." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "SureForms kon dit verzoek niet verifiëren. Herlaad de editor en probeer het opnieuw." + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "%s — Omgezette vorm" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "Formulier omgezet naar SureForms met behulp van AI. Bekijk het nieuwe formulier voor eventuele aanpassingen." + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "Formulier omgezet naar SureForms." + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "U heeft geen toestemming om dit formulier te converteren." + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "Dit formulier is te groot om te converteren. Probeer de opmaak te vereenvoudigen of het formulier handmatig te maken." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "SureForms kon geen velden uit dit formulier afleiden." + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "De SureForms AI-service kon dit formulier niet verwerken. Probeer het opnieuw of bouw het formulier handmatig." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "SureForms ontving een onverwachte reactie. Probeer het alstublieft opnieuw." + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "Kon dit formulier niet omzetten naar SureForms. Probeer het alstublieft opnieuw." + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "Bezig met converteren…" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "Converteren naar SureForms" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "Leg in-progress formuliergegevens vast op het moment dat bezoekers stoppen met typen — geen verzending vereist" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "Herstel verlaten inzendingen en volg potentiële klanten op die je anders zou verliezen" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "Laat bezoekers verdergaan waar ze gebleven waren met veilige, deelbare hervattingslinks" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "Stop met het verliezen van leads door verlaten formulieren" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "Zie wat bezoekers hebben getypt voordat ze wegliepen. Upgrade naar SureForms Premium om Gedeeltelijke Inzendingen te ontgrendelen:" + +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "Globale Standaarden" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "Formulierbeperkingen" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "Stel de standaardinstellingen in die van toepassing zijn op nieuw aangemaakte formulieren." + +#: assets/build/settings.js:172 +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " +msgstr "Verzamel niet-gevoelige informatie van uw website, zoals de gebruikte PHP-versie en functies, om ons te helpen bugs sneller op te lossen, slimmere beslissingen te nemen en functies te bouwen die echt belangrijk voor u zijn. " + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." +msgstr "Het laden van pagina's is mislukt. Vernieuw de pagina en probeer het opnieuw." + +#: assets/build/settings.js:172 +msgid "Failed to load settings. Please refresh and try again." +msgstr "Het laden van de instellingen is mislukt. Vernieuw de pagina en probeer het opnieuw." + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "Formulier validatievelden mogen niet leeg worden gelaten." + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "Ontvanger e-mail is vereist wanneer e-mailoverzichten zijn ingeschakeld." + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "Voer een geldig e-mailadres van de ontvanger in." + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "Instellingen opgeslagen." + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "Opslaan van instellingen mislukt." + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "Sommige instellingen konden niet worden opgeslagen. Probeer het opnieuw." + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." +msgstr "Sommige velden hebben niet-opgeslagen wijzigingen. Verwijder ze om door te gaan, of blijf om je wijzigingen op te slaan." + +#: assets/build/settings.js:172 +msgid "Discard & switch" +msgstr "Weggooien & overschakelen" + +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "Formulieren" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "Formulier" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "Formulieren" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "Nieuw toevoegen" @@ -18209,6 +18631,7 @@ msgstr "account" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "Normaal" diff --git a/languages/sureforms-pl_PL-1cb9ecd067cd971ff5d9db0b4dae2891.json b/languages/sureforms-pl_PL-1cb9ecd067cd971ff5d9db0b4dae2891.json index e6e750f5b..e910a40c3 100644 --- a/languages/sureforms-pl_PL-1cb9ecd067cd971ff5d9db0b4dae2891.json +++ b/languages/sureforms-pl_PL-1cb9ecd067cd971ff5d9db0b4dae2891.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formularz"],"Fields":["Pola"],"Image":["Obraz"],"Activated":["Aktywowany"],"Activate":["Aktywuj"],"Submit":["Prze\u015blij"],"Global Settings":["Ustawienia globalne"],"This field is required.":["To pole jest wymagane."],"Form Title":["Tytu\u0142 formularza"],"Edit":["Edytuj"],"Please enter a valid URL.":["Prosz\u0119 wprowadzi\u0107 prawid\u0142owy adres URL."],"Desktop":["Pulpit"],"Medium":["\u015aredni"],"Mobile":["Telefon kom\u00f3rkowy"],"Repeat":["Powt\u00f3rz"],"Scroll":["Przewi\u0144"],"Signature":["Podpis"],"Tablet":["Tablet"],"Upload":["Prze\u015blij"],"Basic":["Podstawowy"],"Form Settings":["Ustawienia formularza"],"General":["Og\u00f3lny"],"Style":["Styl"],"Advanced":["Zaawansowany"],"No tags available":["Brak dost\u0119pnych tag\u00f3w"],"Device":["Urz\u0105dzenie"],"Select Shortcodes":["Wybierz skr\u00f3ty"],"Page Break Label":["Etykieta podzia\u0142u strony"],"Next":["Dalej"],"Back":["Wstecz"],"Reset":["Resetuj"],"Generic tags":["Og\u00f3lne tagi"],"Pixel":["Piksel"],"Em":["Em"],"Select Units":["Wybierz jednostki"],"%s units":["%s jednostki"],"Margin":["Margines"],"None":["Brak"],"Custom":["Niestandardowy"],"Please add a option props to MultiButtonsControl":["Prosz\u0119 doda\u0107 opcj\u0119 props do MultiButtonsControl"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"Processing\u2026":["Przetwarzanie\u2026"],"Select Video":["Wybierz wideo"],"Change Video":["Zmie\u0144 wideo"],"Select Lottie Animation":["Wybierz animacj\u0119 Lottie"],"Change Lottie Animation":["Zmie\u0144 animacj\u0119 Lottie"],"Upload SVG":["Prze\u015blij SVG"],"Change SVG":["Zmie\u0144 SVG"],"Select Image":["Wybierz obraz"],"Change Image":["Zmie\u0144 obraz"],"Upload SVG?":["Przes\u0142a\u0107 SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Przesy\u0142anie plik\u00f3w SVG mo\u017ce by\u0107 potencjalnie ryzykowne. Czy jeste\u015b pewien?"],"Upload Anyway":["Prze\u015blij mimo to"],"Full Width":["Pe\u0142na szeroko\u015b\u0107"],"Install":["Zainstaluj"],"Plugin Installation failed, Please try again later.":["Instalacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Plugin activation failed, Please try again later.":["Aktywacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Integrations":["Integracje"],"%s Removed from Quick Action Bar.":["%s usuni\u0119to z paska szybkich akcji."],"Add to Quick Action Bar":["Dodaj do paska szybkich akcji"],"%s Added to Quick Action Bar.":["%s dodano do paska szybkich akcji."],"Already Present in Quick Action Bar":["Ju\u017c obecne na pasku szybkich akcji"],"No results found.":["Nie znaleziono wynik\u00f3w."],"data object is empty":["obiekt danych jest pusty"],"Add blocks to Quick Action Bar":["Dodaj bloki do paska szybkich akcji"],"Re-arrange block inside Quick Action Bar":["Przestaw blok wewn\u0105trz paska szybkich akcji"],"Upgrade":["Aktualizacja"],"Connecting\u2026":["\u0141\u0105czenie\u2026"],"Install & Activate":["Zainstaluj i aktywuj"],"Compliance Settings":["Ustawienia zgodno\u015bci"],"Enable GDPR Compliance":["W\u0142\u0105cz zgodno\u015b\u0107 z RODO"],"Never store entry data after form submission":["Nigdy nie przechowuj danych wej\u015bciowych po przes\u0142aniu formularza"],"When enabled this form will never store Entries.":["Gdy jest w\u0142\u0105czony, ten formularz nigdy nie b\u0119dzie przechowywa\u0142 wpis\u00f3w."],"Automatically delete entries":["Automatycznie usu\u0144 wpisy"],"When enabled this form will automatically delete entries after a certain period of time.":["Po w\u0142\u0105czeniu ten formularz automatycznie usunie wpisy po okre\u015blonym czasie."],"Entries older than the days set will be deleted automatically.":["Wpisy starsze ni\u017c ustawione dni zostan\u0105 usuni\u0119te automatycznie."],"Custom CSS":["Niestandardowy CSS"],"The following CSS styles added below will only apply to this form container.":["Nast\u0119puj\u0105ce style CSS dodane poni\u017cej b\u0119d\u0105 dotyczy\u0107 tylko tego kontenera formularza."],"Visual":["Wizualny"],"HTML":["HTML"],"All Data":["Wszystkie dane"],"Add Shortcode":["Dodaj shortcode"],"Form input tags":["Tagi wej\u015bciowe formularza"],"Comma separated values are also accepted.":["Warto\u015bci oddzielone przecinkami s\u0105 r\u00f3wnie\u017c akceptowane."],"Email Notification":["Powiadomienie e-mail"],"Name":["Imi\u0119"],"Send Email To":["Wy\u015blij e-mail do"],"Subject":["Temat"],"CC":["DW"],"BCC":["UDW"],"Reply To":["Odpowiedz do"],"Add Notification":["Dodaj powiadomienie"],"Email Notification disabled successfully.":["Powiadomienie e-mail zosta\u0142o pomy\u015blnie wy\u0142\u0105czone."],"Email Notification enabled successfully.":["Powiadomienie e-mail zosta\u0142o pomy\u015blnie w\u0142\u0105czone."],"Add Key":["Dodaj klucz"],"Add Value":["Dodaj warto\u015b\u0107"],"Add":["Dodaj"],"Confirmation Message":["Wiadomo\u015b\u0107 potwierdzaj\u0105ca"],"After Form Submission":["Po przes\u0142aniu formularza"],"Hide Form":["Ukryj formularz"],"Reset Form":["Zresetuj formularz"],"Custom URL":["Niestandardowy URL"],"Add Query Parameters":["Dodaj parametry zapytania"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Wybierz, je\u015bli chcesz doda\u0107 pary klucz-warto\u015b\u0107 dla p\u00f3l formularza do uwzgl\u0119dnienia w parametrach zapytania"],"Query Parameters":["Parametry zapytania"],"Please select a page.":["Prosz\u0119 wybra\u0107 stron\u0119."],"Suggestion: URL should use HTTPS":["Sugestia: URL powinien u\u017cywa\u0107 HTTPS"],"Success Message":["Komunikat o sukcesie"],"Redirect":["Przekieruj"],"Redirect to":["Przekieruj do"],"Page":["Strona"],"Form Confirmation":["Potwierdzenie formularza"],"Confirmation Type":["Typ potwierdzenia"],"Use Labels as Placeholders":["U\u017cyj etykiet jako symboli zast\u0119pczych"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Powy\u017csze ustawienie umie\u015bci etykiety wewn\u0105trz p\u00f3l jako podpowiedzi (tam, gdzie to mo\u017cliwe). To ustawienie dzia\u0142a tylko na \u017cywej stronie, a nie w podgl\u0105dzie edytora."],"Page Break":["Podzia\u0142 strony"],"Show Labels":["Poka\u017c etykiety"],"First Page Label":["Etykieta pierwszej strony"],"Progress Indicator":["Wska\u017anik post\u0119pu"],"Progress Bar":["Pasek post\u0119pu"],"Connector":["Z\u0142\u0105cze"],"Steps":["Kroki"],"Next Button Text":["Tekst przycisku \"Dalej\""],"Back Button Text":["Tekst przycisku powrotu"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Czy na pewno chcesz zamkn\u0105\u0107? Twoje niezapisane zmiany zostan\u0105 utracone, poniewa\u017c masz pewne b\u0142\u0119dy walidacji."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Jest kilka niezapisanych zmian. Prosz\u0119 zapisa\u0107 zmiany, aby odzwierciedli\u0107 aktualizacje."],"Form Behavior":["Zachowanie formularza"],"Clear":["Wyczy\u015b\u0107"],"Select Color":["Wybierz kolor"],"Primary Color":["Kolor podstawowy"],"Text Color":["Kolor tekstu"],"Text Color on Primary":["Kolor tekstu na g\u0142\u00f3wnym"],"Field Spacing":["Odst\u0119py mi\u0119dzy polami"],"Small":["Ma\u0142y"],"Large":["Du\u017cy"],"Left":["Lewo"],"Center":["Centrum"],"Right":["Prawo"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Niewidoczna"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Wyb\u00f3r daty"],"Time Picker":["Wyb\u00f3r czasu"],"Hidden":["Ukryty"],"Slider":["Suwak"],"Rating":["Ocena"],"Upgrade to Unlock These Fields":["Zaktualizuj, aby odblokowa\u0107 te pola"],"Add Block":["Dodaj blok"],"Customize with SureForms":["Dostosuj za pomoc\u0105 SureForms"],"Page break":["Podzia\u0142 strony"],"Previous":["Poprzedni"],"Thank you":["Dzi\u0119kuj\u0119"],"Form submitted successfully!":["Formularz zosta\u0142 pomy\u015blnie przes\u0142any!"],"Instant Form":["Formularz natychmiastowy"],"Enable Instant Form":["W\u0142\u0105cz natychmiastowy formularz"],"Enable Preview":["W\u0142\u0105cz podgl\u0105d"],"Show Title":["Tytu\u0142 Pokazu"],"Site Logo":["Logo strony"],"Banner Background":["T\u0142o banera"],"Color":["Kolor"],"Upload Image":["Prze\u015blij obraz"],"Background Color":["Kolor t\u0142a"],"Use banner as page background":["U\u017cyj baneru jako t\u0142a strony"],"Form Width":["Szeroko\u015b\u0107 formularza"],"URL":["URL"],"URL Slug":["Slug URL"],"The last part of the URL.":["Ostatnia cz\u0119\u015b\u0107 adresu URL."],"Learn more.":["Dowiedz si\u0119 wi\u0119cej."],"SureForms Description":["Opis SureForms"],"Form Options":["Opcje formularza"],"Form Shortcode":["Kod skr\u00f3tu formularza"],"Paste this shortcode on the page or post to render this form.":["Wklej ten kr\u00f3tki kod na stron\u0119 lub post, aby wy\u015bwietli\u0107 ten formularz."],"Spam Protection":["Ochrona przed spamem"],"Auto":["Samoch\u00f3d"],"Normal":["Normalny"],"%":["%"],"Top":["G\u00f3ra"],"Bottom":["D\u00f3\u0142"],"Solid":["Solidny"],"Width":["Szeroko\u015b\u0107"],"Size":["Rozmiar"],"EM":["EM"],"Padding":["Wype\u0142nienie"],"Color 1":["Kolor 1"],"Color 2":["Kolor 2"],"Type":["Rodzaj"],"Linear":["Liniowy"],"Radial":["Promieniowy"],"Location 1":["Lokalizacja 1"],"Location 2":["Lokalizacja 2"],"Angle":["K\u0105t"],"Classic":["Klasyczny"],"Gradient":["Gradient"],"Background":["T\u0142o"],"Cover":["Ok\u0142adka"],"Contain":["Zawiera\u0107"],"Overlay":["Nak\u0142adka"],"No Repeat":["Bez powt\u00f3rki"],"Overlay Opacity":["Przezroczysto\u015b\u0107 nak\u0142adki"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Nazwy klas powinny by\u0107 oddzielone spacjami. Ka\u017cda nazwa klasy nie mo\u017ce zaczyna\u0107 si\u0119 od cyfry, my\u015blnika ani podkre\u015blenia. Mog\u0105 zawiera\u0107 tylko litery (w tym znaki Unicode), cyfry, my\u015blniki i podkre\u015blenia."],"Conversational Layout":["Uk\u0142ad konwersacyjny"],"Unlock Conversational Forms":["Odblokuj formularze konwersacyjne"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Dzi\u0119ki planowi SureForms Pro mo\u017cesz przekszta\u0142ci\u0107 swoje formularze w anga\u017cuj\u0105ce, konwersacyjne uk\u0142ady, zapewniaj\u0105c p\u0142ynne do\u015bwiadczenie u\u017cytkownika."],"Premium":["Premium"],"Overlay Type":["Typ nak\u0142adki"],"Image Overlay Color":["Kolor nak\u0142adki obrazu"],"Image Position":["Pozycja obrazu"],"Attachment":["Za\u0142\u0105cznik"],"Fixed":["Naprawione"],"Blend Mode":["Tryb mieszania"],"Multiply":["Mno\u017cenie"],"Screen":["Ekran"],"Darken":["Przyciemnij"],"Lighten":["Rozja\u015bnij"],"Color Dodge":["Rozja\u015bnianie koloru"],"Saturation":["Nasycenie"],"Repeat-x":["Powt\u00f3rz-x"],"Repeat-y":["Powt\u00f3rz-y"],"PX":["PX"],"Button":["Przycisk"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Po\u0142\u0105cz si\u0119 z OttoKit"],"SUREFORMS PREMIUM FIELDS":["Pola premium SureForms"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Bie\u017c\u0105cy adres \u201eOd e-mail\u201d nie pasuje do nazwy domeny Twojej strony internetowej (%1$s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami b\u0119d\u0105 blokowane lub oznaczane jako spam. Alternatywnie, spr\u00f3buj u\u017cy\u0107 adresu Od, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Obecny adres \u201eOd e-mail\u201d nie pasuje do nazwy domeny Twojej strony internetowej (%s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam."],"We strongly recommend that you install the free ":["Zalecamy zdecydowanie zainstalowanie darmowego"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["wtyczka! Kreator konfiguracji u\u0142atwia napraw\u0119 Twoich e-maili."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternatywnie spr\u00f3buj u\u017cy\u0107 adresu nadawcy, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Prosz\u0119 wprowadzi\u0107 prawid\u0142owy adres e-mail. Powiadomienia nie b\u0119d\u0105 wysy\u0142ane, je\u015bli pole nie zostanie wype\u0142nione poprawnie."],"From Name":["Od Nazwa"],"From Email":["Z e-maila"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Bie\u017c\u0105cy adres \u201eOd e-mail\u201d mo\u017ce nie pasowa\u0107 do nazwy domeny Twojej strony internetowej (%1$s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam. Alternatywnie, spr\u00f3buj u\u017cy\u0107 adresu Od, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Obecny adres \u201eOd e-mail\u201d mo\u017ce nie pasowa\u0107 do nazwy domeny Twojej strony internetowej (%s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam."],"Border Radius":["Promie\u0144 obramowania"],"Form Theme":["Motyw formularza"],"Instant Form Padding":["Natychmiastowe wype\u0142nianie formularza"],"Instant Form Border Radius":["Natychmiastowy promie\u0144 obramowania formularza"],"Select Gradient":["Wybierz gradient"],"Upgrade Now":["Zaktualizuj teraz"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Wpisy starsze ni\u017c wybrane dni zostan\u0105 usuni\u0119te."],"Entries Time Period":["Okres czasu wpis\u00f3w"],"Custom CSS Panel":["Panel niestandardowego CSS"],"Notifications can use only one From Email so please enter a single address.":["Powiadomienia mog\u0105 u\u017cywa\u0107 tylko jednego adresu e-mail nadawcy, wi\u0119c prosz\u0119 poda\u0107 jeden adres."],"Email Notifications":["Powiadomienia e-mail"],"Actions":["Akcje"],"Duplicate":["Duplikat"],"Delete":["Usu\u0144"],"Select Page to redirect":["Wybierz stron\u0119 do przekierowania"],"Search for a page":["Wyszukaj stron\u0119"],"Select a page":["Wybierz stron\u0119"],"reCAPTCHA v2":["reCAPTCHA v2"],"Login":["Zaloguj si\u0119"],"Register":["Zarejestruj si\u0119"],"Date":["Data"],"Advanced Settings":["Ustawienia zaawansowane"],"Form Restriction":["Ograniczenie formularza"],"Maximum Number of Entries":["Maksymalna liczba wpis\u00f3w"],"Maximum Entries":["Maksymalna liczba wpis\u00f3w"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["Ustawienie Okresu Czasu dzia\u0142a zgodnie ze stref\u0105 czasow\u0105 Twojej strony WordPress. Kliknij tutaj<\/a>, aby otworzy\u0107 Ustawienia Og\u00f3lne WordPress, gdzie mo\u017cesz je sprawdzi\u0107 i zaktualizowa\u0107."],"Click here":["Kliknij tutaj"],"Response Description After Maximum Entries":["Opis odpowiedzi po maksymalnej liczbie wpis\u00f3w"],"All changes will be saved automatically when you press back.":["Wszystkie zmiany zostan\u0105 zapisane automatycznie po naci\u015bni\u0119ciu przycisku wstecz."],"Repeater":["Repeater"],"OttoKit Settings":["Ustawienia OttoKit"],"Get Started":["Rozpocznij"],"Connect Native Integrations with SureForms":["Po\u0142\u0105cz natywne integracje z SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Oczekiwany format dla e-maili - email@sureforms.com lub John Doe "],"Payment":["P\u0142atno\u015b\u0107"],"%s - Order ID":["%s - Identyfikator zam\u00f3wienia"],"%s - Amount":["%s - Kwota"],"%s - Customer Email":["%s - E-mail klienta"],"%s - Customer Name":["%s - Nazwa klienta"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["Dodaj niestandardowe regu\u0142y CSS, aby stylizowa\u0107 ten konkretny formularz niezale\u017cnie od styl\u00f3w globalnych."],"Spam Protection Type":["Typ ochrony przed spamem"],"Select Security Type":["Wybierz typ zabezpiecze\u0144"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Uwaga: U\u017cywanie r\u00f3\u017cnych wersji reCAPTCHA (V2 checkbox i V3) na tej samej stronie spowoduje konflikty mi\u0119dzy wersjami. Prosz\u0119 unika\u0107 u\u017cywania r\u00f3\u017cnych wersji na tej samej stronie."],"Select Version":["Wybierz wersj\u0119"],"Please configure the API keys correctly from the settings":["Prosz\u0119 poprawnie skonfigurowa\u0107 klucze API w ustawieniach"],"Control email alerts sent to admins or users after a form submission.":["Zarz\u0105dzaj powiadomieniami e-mail wysy\u0142anymi do administrator\u00f3w lub u\u017cytkownik\u00f3w po przes\u0142aniu formularza."],"Customize the confirmation message or redirect the users after submitting the form.":["Dostosuj wiadomo\u015b\u0107 potwierdzaj\u0105c\u0105 lub przekieruj u\u017cytkownik\u00f3w po przes\u0142aniu formularza."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Ustal limity dotycz\u0105ce liczby przes\u0142a\u0144 formularza i zarz\u0105dzaj opcjami zgodno\u015bci, w tym RODO i przechowywaniem danych."],"Go to OttoKit Settings":["Przejd\u017a do ustawie\u0144 OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Po\u0142\u0105cz SureForms z ulubionymi aplikacjami, aby zautomatyzowa\u0107 zadania i synchronizowa\u0107 dane bezproblemowo."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Odblokuj pot\u0119\u017cne integracje w planie Premium, aby zautomatyzowa\u0107 swoje przep\u0142ywy pracy i po\u0142\u0105czy\u0107 SureForms bezpo\u015brednio z ulubionymi narz\u0119dziami."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Wysy\u0142aj zg\u0142oszenia formularzy bezpo\u015brednio do CRM, e-maili i platform marketingowych."],"Automate repetitive tasks with seamless data syncing.":["Zautomatyzuj powtarzalne zadania dzi\u0119ki p\u0142ynnej synchronizacji danych."],"Access exclusive native integrations for faster workflows.":["Uzyskaj dost\u0119p do ekskluzywnych natywnych integracji dla szybszych przep\u0142yw\u00f3w pracy."],"PDF Generation":["Generowanie PDF"],"Generate and customize PDF copies of form submissions.":["Generuj i dostosowuj kopie PDF przes\u0142anych formularzy."],"Generate Submission PDFs":["Generuj pliki PDF zg\u0142osze\u0144"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Zamie\u0144 ka\u017cde wprowadzenie formularza na dopracowany plik PDF, czyni\u0105c go idealnym do raport\u00f3w, rejestr\u00f3w lub udost\u0119pniania."],"Automatically generate PDFs from your form submissions.":["Automatycznie generuj pliki PDF z przes\u0142anych formularzy."],"Customize PDF templates with your branding.":["Dostosuj szablony PDF do swojej marki."],"Download or email PDFs instantly.":["Pobierz lub wy\u015blij e-mailem pliki PDF natychmiast."],"User Registration":["Rejestracja u\u017cytkownika"],"Onboard new users or update existing accounts through beautiful looking forms.":["Wprowad\u017a nowych u\u017cytkownik\u00f3w lub zaktualizuj istniej\u0105ce konta za pomoc\u0105 pi\u0119knie wygl\u0105daj\u0105cych formularzy."],"Register Users with SureForms":["Zarejestruj u\u017cytkownik\u00f3w za pomoc\u0105 SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Usprawnij ca\u0142y proces wprowadzania u\u017cytkownik\u00f3w na swoje strony dzi\u0119ki bezproblemowym logowaniom i rejestracjom opartym na formularzach."],"Register new users directly via your form submissions.":["Zarejestruj nowych u\u017cytkownik\u00f3w bezpo\u015brednio poprzez przesy\u0142anie formularzy."],"Create or update existing accounts by mapping form data to user fields.":["Utw\u00f3rz lub zaktualizuj istniej\u0105ce konta, mapuj\u0105c dane formularza na pola u\u017cytkownika."],"Assign roles and control access automatically.":["Przypisuj role i automatycznie kontroluj dost\u0119p."],"Post Feed":["Kana\u0142 post\u00f3w"],"Transform your form submission into WordPress posts.":["Przekszta\u0142\u0107 swoje zg\u0142oszenie formularza w posty WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Automatycznie przekszta\u0142caj przes\u0142ane formularze w posty, strony lub niestandardowe typy post\u00f3w w WordPressie. Oszcz\u0119dzaj czas i pozw\u00f3l, aby Twoje formularze publikowa\u0142y tre\u015bci bezpo\u015brednio."],"Create posts, pages, or CPTs from your form entries.":["Tw\u00f3rz posty, strony lub CPT z wpis\u00f3w formularza."],"Map form fields to your post fields easily.":["\u0141atwo mapuj pola formularza do p\u00f3l posta."],"Automate the content publishing flow with few simple steps.":["Zautomatyzuj proces publikowania tre\u015bci w kilku prostych krokach."],"Automations":["Automatyzacje"],"Unlock Advanced Styling":["Odblokuj zaawansowane stylizacje"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Uzyskaj pe\u0142n\u0105 kontrol\u0119 nad wygl\u0105dem swojego formularza dzi\u0119ki niestandardowym kolorom, czcionkom i uk\u0142adom."],"Button Alignment":["Wyr\u00f3wnanie przycisku"],"Add Custom CSS Class(es)":["Dodaj niestandardow\u0105 klas\u0119 CSS"],"Set the total number of submissions allowed for this form.":["Ustaw ca\u0142kowit\u0105 liczb\u0119 dozwolonych zg\u0142osze\u0144 dla tego formularza."],"Save & Progress":["Zapisz i kontynuuj"],"Allow users to save their progress and continue form completion later.":["Pozw\u00f3l u\u017cytkownikom zapisa\u0107 post\u0119p i kontynuowa\u0107 wype\u0142nianie formularza p\u00f3\u017aniej."],"Save & Progress in SureForms":["Zapisz i kontynuuj w SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Daj swoim u\u017cytkownikom mo\u017cliwo\u015b\u0107 wype\u0142niania formularzy we w\u0142asnym tempie, pozwalaj\u0105c im zapisywa\u0107 post\u0119py i wraca\u0107 w dowolnym momencie."],"Let users pause long or multi-step forms and continue later.":["Pozw\u00f3l u\u017cytkownikom wstrzyma\u0107 d\u0142ugie lub wieloetapowe formularze i kontynuowa\u0107 p\u00f3\u017aniej."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Zmniejsz porzucanie formularzy dzi\u0119ki wygodnym linkom do wznowienia i uzyskaj dost\u0119p do ich post\u0119p\u00f3w z dowolnego miejsca."],"Improve user experience for lengthy, complex, or multi-page forms.":["Popraw do\u015bwiadczenie u\u017cytkownika dla d\u0142ugich, z\u0142o\u017conych lub wielostronicowych formularzy."],"This form is not yet available. Please check back after the scheduled start time.":["Ten formularz nie jest jeszcze dost\u0119pny. Prosz\u0119 sprawdzi\u0107 ponownie po zaplanowanym czasie rozpocz\u0119cia."],"This form is no longer accepting submissions. The submission period has ended.":["Formularz ten nie przyjmuje ju\u017c zg\u0142osze\u0144. Okres sk\u0142adania zg\u0142osze\u0144 dobieg\u0142 ko\u0144ca."],"The start date and time must be before the end date and time.":["Data i godzina rozpocz\u0119cia musz\u0105 by\u0107 przed dat\u0105 i godzin\u0105 zako\u0144czenia."],"Form Scheduling":["Planowanie formularza"],"Enable Form Scheduling":["W\u0142\u0105cz planowanie formularza"],"Set a time period during which this form will be available for submissions.":["Ustaw okres, w kt\u00f3rym ten formularz b\u0119dzie dost\u0119pny do sk\u0142adania zg\u0142osze\u0144."],"Start Date & Time":["Data i godzina rozpocz\u0119cia"],"End Date & Time":["Data i godzina zako\u0144czenia"],"Response Description Before Start Date":["Opis odpowiedzi przed dat\u0105 rozpocz\u0119cia"],"Response Description After End Date":["Opis odpowiedzi po dacie zako\u0144czenia"],"Conditional Confirmations":["Warunkowe potwierdzenia"],"Set up the message or redirect users will see after submitting the form.":["Ustaw wiadomo\u015b\u0107 lub przekierowanie, kt\u00f3re u\u017cytkownicy zobacz\u0105 po przes\u0142aniu formularza."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Wy\u015bwietl w\u0142a\u015bciw\u0105 wiadomo\u015b\u0107 w\u0142a\u015bciwemu u\u017cytkownikowi w zale\u017cno\u015bci od tego, jak odpowiadaj\u0105. Personalizuj potwierdzenia za pomoc\u0105 inteligentnych warunk\u00f3w i automatycznie kieruj u\u017cytkownik\u00f3w do kolejnego najlepszego kroku."],"Display different confirmation messages based on form responses.":["Wy\u015bwietlaj r\u00f3\u017cne wiadomo\u015bci potwierdzaj\u0105ce w zale\u017cno\u015bci od odpowiedzi w formularzu."],"Redirect users to specific pages or URLs conditionally.":["Przekieruj u\u017cytkownik\u00f3w na okre\u015blone strony lub adresy URL warunkowo."],"Create personalized thank-you messages without extra forms.":["Tw\u00f3rz spersonalizowane wiadomo\u015bci z podzi\u0119kowaniami bez dodatkowych formularzy."],"Lost Password":["Zapomniane has\u0142o"],"Reset Password":["Zresetuj has\u0142o"],"When enabled, this form will not store user IP, browser name, or device name in entries.":["Po w\u0142\u0105czeniu, ten formularz nie b\u0119dzie przechowywa\u0142 adresu IP u\u017cytkownika, nazwy przegl\u0105darki ani nazwy urz\u0105dzenia w wpisach."],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Wybierz us\u0142ug\u0119 ochrony przed spamem. Skonfiguruj klucze API w Ustawieniach Globalnych przed w\u0142\u0105czeniem."],"Send as Raw HTML":["Wy\u015blij jako surowy HTML"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Gdy jest w\u0142\u0105czone, tre\u015b\u0107 wiadomo\u015bci e-mail w formacie HTML zostanie zachowana dok\u0142adnie tak, jak zosta\u0142a napisana, i opakowana w profesjonalny szablon e-maila."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Inteligentne tagi, kt\u00f3re odnosz\u0105 si\u0119 do p\u00f3l wprowadzonych przez u\u017cytkownika, nie b\u0119d\u0105 przetwarzane w trybie surowego HTML. Unikaj bezpo\u015bredniego wstawiania niezweryfikowanych warto\u015bci p\u00f3l do tre\u015bci e-maila."],"Please provide a recipient email address and subject line.":["Prosz\u0119 poda\u0107 adres e-mail odbiorcy oraz temat wiadomo\u015bci."],"Email notification duplicated!":["Powiadomienie e-mail zduplikowane!"],"Are you sure you want to delete this email notification?":["Czy na pewno chcesz usun\u0105\u0107 to powiadomienie e-mail?"],"Email notification deleted!":["Powiadomienie e-mail zosta\u0142o usuni\u0119te!"],"URL is missing Top Level Domain (TLD).":["Brakuje domeny najwy\u017cszego poziomu (TLD) w adresie URL."],"This form is now closed as the maximum number of entries has been received.":["Formularz zosta\u0142 zamkni\u0119ty, poniewa\u017c osi\u0105gni\u0119to maksymaln\u0105 liczb\u0119 zg\u0142osze\u0144."],"Publish Your Form":["Opublikuj sw\u00f3j formularz"],"Enable This to Instantly Publish the Form":["W\u0142\u0105cz to, aby natychmiast opublikowa\u0107 formularz"],"Style Your Instant Form Page Here":["Stylizuj swoj\u0105 stron\u0119 formularza natychmiastowego tutaj"],"Quizzes":["Quizy"],"%s - Description":["%s - Opis"],"Choose a spam protection method for this form to prevent unwanted submissions.":["Wybierz metod\u0119 ochrony przed spamem dla tego formularza, aby zapobiec niechcianym zg\u0142oszeniom."],"Send entries to 100+ popular apps.":["Wy\u015blij wpisy do ponad 100 popularnych aplikacji."],"Build automated workflows that run instantly.":["Tw\u00f3rz zautomatyzowane przep\u0142ywy pracy, kt\u00f3re dzia\u0142aj\u0105 natychmiast."],"Create custom app integrations using our Custom App feature.":["Tw\u00f3rz niestandardowe integracje aplikacji za pomoc\u0105 funkcji Niestandardowa Aplikacja."],"Keep your tools in sync automatically.":["Utrzymuj swoje narz\u0119dzia w synchronizacji automatycznie."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["To zainstaluje i aktywuje OttoKit na Twojej stronie WordPress, aby w\u0142\u0105czy\u0107 funkcje automatyzacji."],"Automate Your Forms with OttoKit":["Zautomatyzuj swoje formularze za pomoc\u0105 OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ka\u017cde przes\u0142anie formularza powinno wywo\u0142a\u0107 jak\u0105\u015b akcj\u0119 \u2014 alert w Slacku, lead w CRM, e-mail z przypomnieniem lub nowy wiersz w Arkuszach Google."],"Create interactive quizzes to engage your audience and gather insights.":["Tw\u00f3rz interaktywne quizy, aby zaanga\u017cowa\u0107 swoj\u0105 publiczno\u015b\u0107 i zbiera\u0107 informacje."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Projektuj anga\u017cuj\u0105ce quizy z r\u00f3\u017cnymi typami pyta\u0144, spersonalizowanymi opiniami i automatycznym ocenianiem, aby przyci\u0105gn\u0105\u0107 swoj\u0105 publiczno\u015b\u0107 i uzyska\u0107 cenne informacje."],"Create interactive quizzes with multiple question types.":["Tw\u00f3rz interaktywne quizy z r\u00f3\u017cnymi typami pyta\u0144."],"Provide personalized feedback based on user responses.":["Zapewnij spersonalizowan\u0105 opini\u0119 na podstawie odpowiedzi u\u017cytkownika."],"Automate scoring and lead segmentation for better insights.":["Zautomatyzuj ocenianie i segmentacj\u0119 lead\u00f3w, aby uzyska\u0107 lepsze wgl\u0105dy."],"Heading 1":["Nag\u0142\u00f3wek 1"],"Heading 2":["Nag\u0142\u00f3wek 2"],"Heading 3":["Nag\u0142\u00f3wek 3"],"Heading 4":["Nag\u0142\u00f3wek 4"],"Heading 5":["Nag\u0142\u00f3wek 5"],"Heading 6":["Nag\u0142\u00f3wek 6"],"Quill heading picker: default paragraph style\u0004Normal":["Normalny"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formularz"],"Fields":["Pola"],"Image":["Obraz"],"Activated":["Aktywowany"],"Activate":["Aktywuj"],"Submit":["Prze\u015blij"],"Global Settings":["Ustawienia globalne"],"Form Title":["Tytu\u0142 formularza"],"Edit":["Edytuj"],"Please enter a valid URL.":["Prosz\u0119 wprowadzi\u0107 prawid\u0142owy adres URL."],"Desktop":["Pulpit"],"Medium":["\u015aredni"],"Mobile":["Telefon kom\u00f3rkowy"],"Repeat":["Powt\u00f3rz"],"Scroll":["Przewi\u0144"],"Signature":["Podpis"],"Tablet":["Tablet"],"Upload":["Prze\u015blij"],"Basic":["Podstawowy"],"Form Settings":["Ustawienia formularza"],"General":["Og\u00f3lny"],"Style":["Styl"],"Advanced":["Zaawansowany"],"No tags available":["Brak dost\u0119pnych tag\u00f3w"],"Device":["Urz\u0105dzenie"],"Select Shortcodes":["Wybierz skr\u00f3ty"],"Page Break Label":["Etykieta podzia\u0142u strony"],"Next":["Dalej"],"Back":["Wstecz"],"Reset":["Resetuj"],"Generic tags":["Og\u00f3lne tagi"],"Pixel":["Piksel"],"Em":["Em"],"Select Units":["Wybierz jednostki"],"%s units":["%s jednostki"],"Margin":["Margines"],"None":["Brak"],"Custom":["Niestandardowy"],"Please add a option props to MultiButtonsControl":["Prosz\u0119 doda\u0107 opcj\u0119 props do MultiButtonsControl"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"Processing\u2026":["Przetwarzanie\u2026"],"Select Video":["Wybierz wideo"],"Change Video":["Zmie\u0144 wideo"],"Select Lottie Animation":["Wybierz animacj\u0119 Lottie"],"Change Lottie Animation":["Zmie\u0144 animacj\u0119 Lottie"],"Upload SVG":["Prze\u015blij SVG"],"Change SVG":["Zmie\u0144 SVG"],"Select Image":["Wybierz obraz"],"Change Image":["Zmie\u0144 obraz"],"Upload SVG?":["Przes\u0142a\u0107 SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Przesy\u0142anie plik\u00f3w SVG mo\u017ce by\u0107 potencjalnie ryzykowne. Czy jeste\u015b pewien?"],"Upload Anyway":["Prze\u015blij mimo to"],"Full Width":["Pe\u0142na szeroko\u015b\u0107"],"Install":["Zainstaluj"],"Plugin Installation failed, Please try again later.":["Instalacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Plugin activation failed, Please try again later.":["Aktywacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Integrations":["Integracje"],"%s Removed from Quick Action Bar.":["%s usuni\u0119to z paska szybkich akcji."],"Add to Quick Action Bar":["Dodaj do paska szybkich akcji"],"%s Added to Quick Action Bar.":["%s dodano do paska szybkich akcji."],"Already Present in Quick Action Bar":["Ju\u017c obecne na pasku szybkich akcji"],"No results found.":["Nie znaleziono wynik\u00f3w."],"data object is empty":["obiekt danych jest pusty"],"Add blocks to Quick Action Bar":["Dodaj bloki do paska szybkich akcji"],"Re-arrange block inside Quick Action Bar":["Przestaw blok wewn\u0105trz paska szybkich akcji"],"Upgrade":["Aktualizacja"],"Connecting\u2026":["\u0141\u0105czenie\u2026"],"Install & Activate":["Zainstaluj i aktywuj"],"Compliance Settings":["Ustawienia zgodno\u015bci"],"Enable GDPR Compliance":["W\u0142\u0105cz zgodno\u015b\u0107 z RODO"],"Never store entry data after form submission":["Nigdy nie przechowuj danych wej\u015bciowych po przes\u0142aniu formularza"],"When enabled this form will never store Entries.":["Gdy jest w\u0142\u0105czony, ten formularz nigdy nie b\u0119dzie przechowywa\u0142 wpis\u00f3w."],"Automatically delete entries":["Automatycznie usu\u0144 wpisy"],"When enabled this form will automatically delete entries after a certain period of time.":["Po w\u0142\u0105czeniu ten formularz automatycznie usunie wpisy po okre\u015blonym czasie."],"Entries older than the days set will be deleted automatically.":["Wpisy starsze ni\u017c ustawione dni zostan\u0105 usuni\u0119te automatycznie."],"Custom CSS":["Niestandardowy CSS"],"The following CSS styles added below will only apply to this form container.":["Nast\u0119puj\u0105ce style CSS dodane poni\u017cej b\u0119d\u0105 dotyczy\u0107 tylko tego kontenera formularza."],"Visual":["Wizualny"],"HTML":["HTML"],"All Data":["Wszystkie dane"],"Add Shortcode":["Dodaj shortcode"],"Form input tags":["Tagi wej\u015bciowe formularza"],"Comma separated values are also accepted.":["Warto\u015bci oddzielone przecinkami s\u0105 r\u00f3wnie\u017c akceptowane."],"Email Notification":["Powiadomienie e-mail"],"Name":["Imi\u0119"],"Send Email To":["Wy\u015blij e-mail do"],"Subject":["Temat"],"CC":["DW"],"BCC":["UDW"],"Reply To":["Odpowiedz do"],"Add Notification":["Dodaj powiadomienie"],"Add Key":["Dodaj klucz"],"Add Value":["Dodaj warto\u015b\u0107"],"Add":["Dodaj"],"Confirmation Message":["Wiadomo\u015b\u0107 potwierdzaj\u0105ca"],"After Form Submission":["Po przes\u0142aniu formularza"],"Hide Form":["Ukryj formularz"],"Reset Form":["Zresetuj formularz"],"Custom URL":["Niestandardowy URL"],"Add Query Parameters":["Dodaj parametry zapytania"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Wybierz, je\u015bli chcesz doda\u0107 pary klucz-warto\u015b\u0107 dla p\u00f3l formularza do uwzgl\u0119dnienia w parametrach zapytania"],"Query Parameters":["Parametry zapytania"],"Please select a page.":["Prosz\u0119 wybra\u0107 stron\u0119."],"Suggestion: URL should use HTTPS":["Sugestia: URL powinien u\u017cywa\u0107 HTTPS"],"Success Message":["Komunikat o sukcesie"],"Redirect":["Przekieruj"],"Redirect to":["Przekieruj do"],"Page":["Strona"],"Form Confirmation":["Potwierdzenie formularza"],"Confirmation Type":["Typ potwierdzenia"],"Use Labels as Placeholders":["U\u017cyj etykiet jako symboli zast\u0119pczych"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["Powy\u017csze ustawienie umie\u015bci etykiety wewn\u0105trz p\u00f3l jako podpowiedzi (tam, gdzie to mo\u017cliwe). To ustawienie dzia\u0142a tylko na \u017cywej stronie, a nie w podgl\u0105dzie edytora."],"Page Break":["Podzia\u0142 strony"],"Show Labels":["Poka\u017c etykiety"],"First Page Label":["Etykieta pierwszej strony"],"Progress Indicator":["Wska\u017anik post\u0119pu"],"Progress Bar":["Pasek post\u0119pu"],"Connector":["Z\u0142\u0105cze"],"Steps":["Kroki"],"Next Button Text":["Tekst przycisku \"Dalej\""],"Back Button Text":["Tekst przycisku powrotu"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Czy na pewno chcesz zamkn\u0105\u0107? Twoje niezapisane zmiany zostan\u0105 utracone, poniewa\u017c masz pewne b\u0142\u0119dy walidacji."],"There are few unsaved changes. Please save your changes to reflect the updates.":["Jest kilka niezapisanych zmian. Prosz\u0119 zapisa\u0107 zmiany, aby odzwierciedli\u0107 aktualizacje."],"Form Behavior":["Zachowanie formularza"],"Clear":["Wyczy\u015b\u0107"],"Select Color":["Wybierz kolor"],"Primary Color":["Kolor podstawowy"],"Text Color":["Kolor tekstu"],"Text Color on Primary":["Kolor tekstu na g\u0142\u00f3wnym"],"Field Spacing":["Odst\u0119py mi\u0119dzy polami"],"Small":["Ma\u0142y"],"Large":["Du\u017cy"],"Left":["Lewo"],"Center":["Centrum"],"Right":["Prawo"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Niewidoczna"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Wyb\u00f3r daty"],"Time Picker":["Wyb\u00f3r czasu"],"Hidden":["Ukryty"],"Slider":["Suwak"],"Rating":["Ocena"],"Upgrade to Unlock These Fields":["Zaktualizuj, aby odblokowa\u0107 te pola"],"Add Block":["Dodaj blok"],"Customize with SureForms":["Dostosuj za pomoc\u0105 SureForms"],"Page break":["Podzia\u0142 strony"],"Previous":["Poprzedni"],"Thank you":["Dzi\u0119kuj\u0119"],"Form submitted successfully!":["Formularz zosta\u0142 pomy\u015blnie przes\u0142any!"],"Instant Form":["Formularz natychmiastowy"],"Enable Instant Form":["W\u0142\u0105cz natychmiastowy formularz"],"Enable Preview":["W\u0142\u0105cz podgl\u0105d"],"Show Title":["Tytu\u0142 Pokazu"],"Site Logo":["Logo strony"],"Banner Background":["T\u0142o banera"],"Color":["Kolor"],"Upload Image":["Prze\u015blij obraz"],"Background Color":["Kolor t\u0142a"],"Use banner as page background":["U\u017cyj baneru jako t\u0142a strony"],"Form Width":["Szeroko\u015b\u0107 formularza"],"URL":["URL"],"URL Slug":["Slug URL"],"The last part of the URL.":["Ostatnia cz\u0119\u015b\u0107 adresu URL."],"Learn more.":["Dowiedz si\u0119 wi\u0119cej."],"SureForms Description":["Opis SureForms"],"Form Options":["Opcje formularza"],"Form Shortcode":["Kod skr\u00f3tu formularza"],"Paste this shortcode on the page or post to render this form.":["Wklej ten kr\u00f3tki kod na stron\u0119 lub post, aby wy\u015bwietli\u0107 ten formularz."],"Spam Protection":["Ochrona przed spamem"],"Auto":["Samoch\u00f3d"],"Normal":["Normalny"],"%":["%"],"Top":["G\u00f3ra"],"Bottom":["D\u00f3\u0142"],"Solid":["Solidny"],"Width":["Szeroko\u015b\u0107"],"Size":["Rozmiar"],"EM":["EM"],"Padding":["Wype\u0142nienie"],"Color 1":["Kolor 1"],"Color 2":["Kolor 2"],"Type":["Rodzaj"],"Linear":["Liniowy"],"Radial":["Promieniowy"],"Location 1":["Lokalizacja 1"],"Location 2":["Lokalizacja 2"],"Angle":["K\u0105t"],"Classic":["Klasyczny"],"Gradient":["Gradient"],"Background":["T\u0142o"],"Cover":["Ok\u0142adka"],"Contain":["Zawiera\u0107"],"Overlay":["Nak\u0142adka"],"No Repeat":["Bez powt\u00f3rki"],"Overlay Opacity":["Przezroczysto\u015b\u0107 nak\u0142adki"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Nazwy klas powinny by\u0107 oddzielone spacjami. Ka\u017cda nazwa klasy nie mo\u017ce zaczyna\u0107 si\u0119 od cyfry, my\u015blnika ani podkre\u015blenia. Mog\u0105 zawiera\u0107 tylko litery (w tym znaki Unicode), cyfry, my\u015blniki i podkre\u015blenia."],"Conversational Layout":["Uk\u0142ad konwersacyjny"],"Unlock Conversational Forms":["Odblokuj formularze konwersacyjne"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Dzi\u0119ki planowi SureForms Pro mo\u017cesz przekszta\u0142ci\u0107 swoje formularze w anga\u017cuj\u0105ce, konwersacyjne uk\u0142ady, zapewniaj\u0105c p\u0142ynne do\u015bwiadczenie u\u017cytkownika."],"Premium":["Premium"],"Overlay Type":["Typ nak\u0142adki"],"Image Overlay Color":["Kolor nak\u0142adki obrazu"],"Image Position":["Pozycja obrazu"],"Attachment":["Za\u0142\u0105cznik"],"Fixed":["Naprawione"],"Blend Mode":["Tryb mieszania"],"Multiply":["Mno\u017cenie"],"Screen":["Ekran"],"Darken":["Przyciemnij"],"Lighten":["Rozja\u015bnij"],"Color Dodge":["Rozja\u015bnianie koloru"],"Saturation":["Nasycenie"],"Repeat-x":["Powt\u00f3rz-x"],"Repeat-y":["Powt\u00f3rz-y"],"PX":["PX"],"Button":["Przycisk"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Po\u0142\u0105cz si\u0119 z OttoKit"],"SUREFORMS PREMIUM FIELDS":["Pola premium SureForms"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Bie\u017c\u0105cy adres \u201eOd e-mail\u201d nie pasuje do nazwy domeny Twojej strony internetowej (%1$s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami b\u0119d\u0105 blokowane lub oznaczane jako spam. Alternatywnie, spr\u00f3buj u\u017cy\u0107 adresu Od, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Obecny adres \u201eOd e-mail\u201d nie pasuje do nazwy domeny Twojej strony internetowej (%s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam."],"We strongly recommend that you install the free ":["Zalecamy zdecydowanie zainstalowanie darmowego"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["wtyczka! Kreator konfiguracji u\u0142atwia napraw\u0119 Twoich e-maili."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternatywnie spr\u00f3buj u\u017cy\u0107 adresu nadawcy, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Prosz\u0119 wprowadzi\u0107 prawid\u0142owy adres e-mail. Powiadomienia nie b\u0119d\u0105 wysy\u0142ane, je\u015bli pole nie zostanie wype\u0142nione poprawnie."],"From Name":["Od Nazwa"],"From Email":["Z e-maila"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Bie\u017c\u0105cy adres \u201eOd e-mail\u201d mo\u017ce nie pasowa\u0107 do nazwy domeny Twojej strony internetowej (%1$s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam. Alternatywnie, spr\u00f3buj u\u017cy\u0107 adresu Od, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Obecny adres \u201eOd e-mail\u201d mo\u017ce nie pasowa\u0107 do nazwy domeny Twojej strony internetowej (%s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam."],"Border Radius":["Promie\u0144 obramowania"],"Form Theme":["Motyw formularza"],"Instant Form Padding":["Natychmiastowe wype\u0142nianie formularza"],"Instant Form Border Radius":["Natychmiastowy promie\u0144 obramowania formularza"],"Select Gradient":["Wybierz gradient"],"Upgrade Now":["Zaktualizuj teraz"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["Wpisy starsze ni\u017c wybrane dni zostan\u0105 usuni\u0119te."],"Entries Time Period":["Okres czasu wpis\u00f3w"],"Custom CSS Panel":["Panel niestandardowego CSS"],"Notifications can use only one From Email so please enter a single address.":["Powiadomienia mog\u0105 u\u017cywa\u0107 tylko jednego adresu e-mail nadawcy, wi\u0119c prosz\u0119 poda\u0107 jeden adres."],"Email Notifications":["Powiadomienia e-mail"],"Actions":["Akcje"],"Duplicate":["Duplikat"],"Delete":["Usu\u0144"],"Select Page to redirect":["Wybierz stron\u0119 do przekierowania"],"Search for a page":["Wyszukaj stron\u0119"],"Select a page":["Wybierz stron\u0119"],"reCAPTCHA v2":["reCAPTCHA v2"],"Save":["Zapisz"],"Login":["Zaloguj si\u0119"],"Register":["Zarejestruj si\u0119"],"Date":["Data"],"Advanced Settings":["Ustawienia zaawansowane"],"Form Restriction":["Ograniczenie formularza"],"Maximum Number of Entries":["Maksymalna liczba wpis\u00f3w"],"Maximum Entries":["Maksymalna liczba wpis\u00f3w"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["Ustawienie Okresu Czasu dzia\u0142a zgodnie ze stref\u0105 czasow\u0105 Twojej strony WordPress. Kliknij tutaj<\/a>, aby otworzy\u0107 Ustawienia Og\u00f3lne WordPress, gdzie mo\u017cesz je sprawdzi\u0107 i zaktualizowa\u0107."],"Click here":["Kliknij tutaj"],"Response Description After Maximum Entries":["Opis odpowiedzi po maksymalnej liczbie wpis\u00f3w"],"All changes will be saved automatically when you press back.":["Wszystkie zmiany zostan\u0105 zapisane automatycznie po naci\u015bni\u0119ciu przycisku wstecz."],"Repeater":["Repeater"],"OttoKit Settings":["Ustawienia OttoKit"],"Get Started":["Rozpocznij"],"Connect Native Integrations with SureForms":["Po\u0142\u0105cz natywne integracje z SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Oczekiwany format dla e-maili - email@sureforms.com lub John Doe "],"delete":["usu\u0144"],"Please type \"%s\" in the input box":["Prosz\u0119 wpisa\u0107 \"%s\" w polu wej\u015bciowym"],"To confirm, type \"%s\" in the box below:":["Aby potwierdzi\u0107, wpisz \"%s\" w polu poni\u017cej:"],"Type \"%s\"":["Wpisz \"%s\""],"Payment":["P\u0142atno\u015b\u0107"],"%s - Order ID":["%s - Identyfikator zam\u00f3wienia"],"%s - Amount":["%s - Kwota"],"%s - Customer Email":["%s - E-mail klienta"],"%s - Customer Name":["%s - Nazwa klienta"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["Dodaj niestandardowe regu\u0142y CSS, aby stylizowa\u0107 ten konkretny formularz niezale\u017cnie od styl\u00f3w globalnych."],"Spam Protection Type":["Typ ochrony przed spamem"],"Select Security Type":["Wybierz typ zabezpiecze\u0144"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Uwaga: U\u017cywanie r\u00f3\u017cnych wersji reCAPTCHA (V2 checkbox i V3) na tej samej stronie spowoduje konflikty mi\u0119dzy wersjami. Prosz\u0119 unika\u0107 u\u017cywania r\u00f3\u017cnych wersji na tej samej stronie."],"Select Version":["Wybierz wersj\u0119"],"Please configure the API keys correctly from the settings":["Prosz\u0119 poprawnie skonfigurowa\u0107 klucze API w ustawieniach"],"Control email alerts sent to admins or users after a form submission.":["Zarz\u0105dzaj powiadomieniami e-mail wysy\u0142anymi do administrator\u00f3w lub u\u017cytkownik\u00f3w po przes\u0142aniu formularza."],"Customize the confirmation message or redirect the users after submitting the form.":["Dostosuj wiadomo\u015b\u0107 potwierdzaj\u0105c\u0105 lub przekieruj u\u017cytkownik\u00f3w po przes\u0142aniu formularza."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Ustal limity dotycz\u0105ce liczby przes\u0142a\u0144 formularza i zarz\u0105dzaj opcjami zgodno\u015bci, w tym RODO i przechowywaniem danych."],"Go to OttoKit Settings":["Przejd\u017a do ustawie\u0144 OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Po\u0142\u0105cz SureForms z ulubionymi aplikacjami, aby zautomatyzowa\u0107 zadania i synchronizowa\u0107 dane bezproblemowo."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Odblokuj pot\u0119\u017cne integracje w planie Premium, aby zautomatyzowa\u0107 swoje przep\u0142ywy pracy i po\u0142\u0105czy\u0107 SureForms bezpo\u015brednio z ulubionymi narz\u0119dziami."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Wysy\u0142aj zg\u0142oszenia formularzy bezpo\u015brednio do CRM, e-maili i platform marketingowych."],"Automate repetitive tasks with seamless data syncing.":["Zautomatyzuj powtarzalne zadania dzi\u0119ki p\u0142ynnej synchronizacji danych."],"Access exclusive native integrations for faster workflows.":["Uzyskaj dost\u0119p do ekskluzywnych natywnych integracji dla szybszych przep\u0142yw\u00f3w pracy."],"PDF Generation":["Generowanie PDF"],"Generate and customize PDF copies of form submissions.":["Generuj i dostosowuj kopie PDF przes\u0142anych formularzy."],"Generate Submission PDFs":["Generuj pliki PDF zg\u0142osze\u0144"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Zamie\u0144 ka\u017cde wprowadzenie formularza na dopracowany plik PDF, czyni\u0105c go idealnym do raport\u00f3w, rejestr\u00f3w lub udost\u0119pniania."],"Automatically generate PDFs from your form submissions.":["Automatycznie generuj pliki PDF z przes\u0142anych formularzy."],"Customize PDF templates with your branding.":["Dostosuj szablony PDF do swojej marki."],"Download or email PDFs instantly.":["Pobierz lub wy\u015blij e-mailem pliki PDF natychmiast."],"User Registration":["Rejestracja u\u017cytkownika"],"Onboard new users or update existing accounts through beautiful looking forms.":["Wprowad\u017a nowych u\u017cytkownik\u00f3w lub zaktualizuj istniej\u0105ce konta za pomoc\u0105 pi\u0119knie wygl\u0105daj\u0105cych formularzy."],"Register Users with SureForms":["Zarejestruj u\u017cytkownik\u00f3w za pomoc\u0105 SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Usprawnij ca\u0142y proces wprowadzania u\u017cytkownik\u00f3w na swoje strony dzi\u0119ki bezproblemowym logowaniom i rejestracjom opartym na formularzach."],"Register new users directly via your form submissions.":["Zarejestruj nowych u\u017cytkownik\u00f3w bezpo\u015brednio poprzez przesy\u0142anie formularzy."],"Create or update existing accounts by mapping form data to user fields.":["Utw\u00f3rz lub zaktualizuj istniej\u0105ce konta, mapuj\u0105c dane formularza na pola u\u017cytkownika."],"Assign roles and control access automatically.":["Przypisuj role i automatycznie kontroluj dost\u0119p."],"Post Feed":["Kana\u0142 post\u00f3w"],"Transform your form submission into WordPress posts.":["Przekszta\u0142\u0107 swoje zg\u0142oszenie formularza w posty WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Automatycznie przekszta\u0142caj przes\u0142ane formularze w posty, strony lub niestandardowe typy post\u00f3w w WordPressie. Oszcz\u0119dzaj czas i pozw\u00f3l, aby Twoje formularze publikowa\u0142y tre\u015bci bezpo\u015brednio."],"Create posts, pages, or CPTs from your form entries.":["Tw\u00f3rz posty, strony lub CPT z wpis\u00f3w formularza."],"Map form fields to your post fields easily.":["\u0141atwo mapuj pola formularza do p\u00f3l posta."],"Automate the content publishing flow with few simple steps.":["Zautomatyzuj proces publikowania tre\u015bci w kilku prostych krokach."],"Automations":["Automatyzacje"],"Unlock Advanced Styling":["Odblokuj zaawansowane stylizacje"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Uzyskaj pe\u0142n\u0105 kontrol\u0119 nad wygl\u0105dem swojego formularza dzi\u0119ki niestandardowym kolorom, czcionkom i uk\u0142adom."],"Button Alignment":["Wyr\u00f3wnanie przycisku"],"Add Custom CSS Class(es)":["Dodaj niestandardow\u0105 klas\u0119 CSS"],"Set the total number of submissions allowed for this form.":["Ustaw ca\u0142kowit\u0105 liczb\u0119 dozwolonych zg\u0142osze\u0144 dla tego formularza."],"Save & Progress":["Zapisz i kontynuuj"],"Allow users to save their progress and continue form completion later.":["Pozw\u00f3l u\u017cytkownikom zapisa\u0107 post\u0119p i kontynuowa\u0107 wype\u0142nianie formularza p\u00f3\u017aniej."],"Save & Progress in SureForms":["Zapisz i kontynuuj w SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["Daj swoim u\u017cytkownikom mo\u017cliwo\u015b\u0107 wype\u0142niania formularzy we w\u0142asnym tempie, pozwalaj\u0105c im zapisywa\u0107 post\u0119py i wraca\u0107 w dowolnym momencie."],"Let users pause long or multi-step forms and continue later.":["Pozw\u00f3l u\u017cytkownikom wstrzyma\u0107 d\u0142ugie lub wieloetapowe formularze i kontynuowa\u0107 p\u00f3\u017aniej."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Zmniejsz porzucanie formularzy dzi\u0119ki wygodnym linkom do wznowienia i uzyskaj dost\u0119p do ich post\u0119p\u00f3w z dowolnego miejsca."],"Improve user experience for lengthy, complex, or multi-page forms.":["Popraw do\u015bwiadczenie u\u017cytkownika dla d\u0142ugich, z\u0142o\u017conych lub wielostronicowych formularzy."],"This form is not yet available. Please check back after the scheduled start time.":["Ten formularz nie jest jeszcze dost\u0119pny. Prosz\u0119 sprawdzi\u0107 ponownie po zaplanowanym czasie rozpocz\u0119cia."],"This form is no longer accepting submissions. The submission period has ended.":["Formularz ten nie przyjmuje ju\u017c zg\u0142osze\u0144. Okres sk\u0142adania zg\u0142osze\u0144 dobieg\u0142 ko\u0144ca."],"The start date and time must be before the end date and time.":["Data i godzina rozpocz\u0119cia musz\u0105 by\u0107 przed dat\u0105 i godzin\u0105 zako\u0144czenia."],"Form Scheduling":["Planowanie formularza"],"Enable Form Scheduling":["W\u0142\u0105cz planowanie formularza"],"Set a time period during which this form will be available for submissions.":["Ustaw okres, w kt\u00f3rym ten formularz b\u0119dzie dost\u0119pny do sk\u0142adania zg\u0142osze\u0144."],"Start Date & Time":["Data i godzina rozpocz\u0119cia"],"End Date & Time":["Data i godzina zako\u0144czenia"],"Response Description Before Start Date":["Opis odpowiedzi przed dat\u0105 rozpocz\u0119cia"],"Response Description After End Date":["Opis odpowiedzi po dacie zako\u0144czenia"],"Conditional Confirmations":["Warunkowe potwierdzenia"],"Set up the message or redirect users will see after submitting the form.":["Ustaw wiadomo\u015b\u0107 lub przekierowanie, kt\u00f3re u\u017cytkownicy zobacz\u0105 po przes\u0142aniu formularza."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Wy\u015bwietl w\u0142a\u015bciw\u0105 wiadomo\u015b\u0107 w\u0142a\u015bciwemu u\u017cytkownikowi w zale\u017cno\u015bci od tego, jak odpowiadaj\u0105. Personalizuj potwierdzenia za pomoc\u0105 inteligentnych warunk\u00f3w i automatycznie kieruj u\u017cytkownik\u00f3w do kolejnego najlepszego kroku."],"Display different confirmation messages based on form responses.":["Wy\u015bwietlaj r\u00f3\u017cne wiadomo\u015bci potwierdzaj\u0105ce w zale\u017cno\u015bci od odpowiedzi w formularzu."],"Redirect users to specific pages or URLs conditionally.":["Przekieruj u\u017cytkownik\u00f3w na okre\u015blone strony lub adresy URL warunkowo."],"Create personalized thank-you messages without extra forms.":["Tw\u00f3rz spersonalizowane wiadomo\u015bci z podzi\u0119kowaniami bez dodatkowych formularzy."],"Lost Password":["Zapomniane has\u0142o"],"Reset Password":["Zresetuj has\u0142o"],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Wybierz us\u0142ug\u0119 ochrony przed spamem. Skonfiguruj klucze API w Ustawieniach Globalnych przed w\u0142\u0105czeniem."],"Send as Raw HTML":["Wy\u015blij jako surowy HTML"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Gdy jest w\u0142\u0105czone, tre\u015b\u0107 wiadomo\u015bci e-mail w formacie HTML zostanie zachowana dok\u0142adnie tak, jak zosta\u0142a napisana, i opakowana w profesjonalny szablon e-maila."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["Inteligentne tagi, kt\u00f3re odnosz\u0105 si\u0119 do p\u00f3l wprowadzonych przez u\u017cytkownika, nie b\u0119d\u0105 przetwarzane w trybie surowego HTML. Unikaj bezpo\u015bredniego wstawiania niezweryfikowanych warto\u015bci p\u00f3l do tre\u015bci e-maila."],"Please provide a recipient email address and subject line.":["Prosz\u0119 poda\u0107 adres e-mail odbiorcy oraz temat wiadomo\u015bci."],"Email notification duplicated!":["Powiadomienie e-mail zduplikowane!"],"Are you sure you want to delete this email notification?":["Czy na pewno chcesz usun\u0105\u0107 to powiadomienie e-mail?"],"Email notification deleted!":["Powiadomienie e-mail zosta\u0142o usuni\u0119te!"],"URL is missing Top Level Domain (TLD).":["Brakuje domeny najwy\u017cszego poziomu (TLD) w adresie URL."],"This form is now closed as the maximum number of entries has been received.":["Formularz zosta\u0142 zamkni\u0119ty, poniewa\u017c osi\u0105gni\u0119to maksymaln\u0105 liczb\u0119 zg\u0142osze\u0144."],"Publish Your Form":["Opublikuj sw\u00f3j formularz"],"Enable This to Instantly Publish the Form":["W\u0142\u0105cz to, aby natychmiast opublikowa\u0107 formularz"],"Style Your Instant Form Page Here":["Stylizuj swoj\u0105 stron\u0119 formularza natychmiastowego tutaj"],"Quizzes":["Quizy"],"%s - Description":["%s - Opis"],"Send entries to 100+ popular apps.":["Wy\u015blij wpisy do ponad 100 popularnych aplikacji."],"Build automated workflows that run instantly.":["Tw\u00f3rz zautomatyzowane przep\u0142ywy pracy, kt\u00f3re dzia\u0142aj\u0105 natychmiast."],"Create custom app integrations using our Custom App feature.":["Tw\u00f3rz niestandardowe integracje aplikacji za pomoc\u0105 funkcji Niestandardowa Aplikacja."],"Keep your tools in sync automatically.":["Utrzymuj swoje narz\u0119dzia w synchronizacji automatycznie."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["To zainstaluje i aktywuje OttoKit na Twojej stronie WordPress, aby w\u0142\u0105czy\u0107 funkcje automatyzacji."],"Automate Your Forms with OttoKit":["Zautomatyzuj swoje formularze za pomoc\u0105 OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ka\u017cde przes\u0142anie formularza powinno wywo\u0142a\u0107 jak\u0105\u015b akcj\u0119 \u2014 alert w Slacku, lead w CRM, e-mail z przypomnieniem lub nowy wiersz w Arkuszach Google."],"Create interactive quizzes to engage your audience and gather insights.":["Tw\u00f3rz interaktywne quizy, aby zaanga\u017cowa\u0107 swoj\u0105 publiczno\u015b\u0107 i zbiera\u0107 informacje."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Projektuj anga\u017cuj\u0105ce quizy z r\u00f3\u017cnymi typami pyta\u0144, spersonalizowanymi opiniami i automatycznym ocenianiem, aby przyci\u0105gn\u0105\u0107 swoj\u0105 publiczno\u015b\u0107 i uzyska\u0107 cenne informacje."],"Create interactive quizzes with multiple question types.":["Tw\u00f3rz interaktywne quizy z r\u00f3\u017cnymi typami pyta\u0144."],"Provide personalized feedback based on user responses.":["Zapewnij spersonalizowan\u0105 opini\u0119 na podstawie odpowiedzi u\u017cytkownika."],"Automate scoring and lead segmentation for better insights.":["Zautomatyzuj ocenianie i segmentacj\u0119 lead\u00f3w, aby uzyska\u0107 lepsze wgl\u0105dy."],"Heading 1":["Nag\u0142\u00f3wek 1"],"Heading 2":["Nag\u0142\u00f3wek 2"],"Heading 3":["Nag\u0142\u00f3wek 3"],"Heading 4":["Nag\u0142\u00f3wek 4"],"Heading 5":["Nag\u0142\u00f3wek 5"],"Heading 6":["Nag\u0142\u00f3wek 6"],"Form settings saved.":["Ustawienia formularza zosta\u0142y zapisane."],"The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature.":["Limit wej\u015b\u0107 opiera si\u0119 na zapisanych wpisach do liczenia zg\u0142osze\u0144. Gdy w Ustawieniach Zgodno\u015bci jest w\u0142\u0105czona opcja \"Nigdy nie przechowuj danych wpisu po przes\u0142aniu formularza\", ten limit nie b\u0119dzie egzekwowany. Wy\u0142\u0105cz t\u0119 opcj\u0119 lub usu\u0144 limit wpis\u00f3w, aby skorzysta\u0107 z tej funkcji."],"Settings saved, but post attributes (password \/ title \/ content) failed to update. Retry to persist them.":["Ustawienia zosta\u0142y zapisane, ale atrybuty posta (has\u0142o \/ tytu\u0142 \/ tre\u015b\u0107) nie zosta\u0142y zaktualizowane. Spr\u00f3buj ponownie, aby je zachowa\u0107."],"Failed to save form settings.":["Nie uda\u0142o si\u0119 zapisa\u0107 ustawie\u0144 formularza."],"Saving\u2026":["Zapisywanie\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Po w\u0142\u0105czeniu tego formularza nie b\u0119d\u0105 przechowywane adres IP u\u017cytkownika, nazwa przegl\u0105darki i nazwa urz\u0105dzenia w wpisach."],"Failed to save. Please try again.":["Nie uda\u0142o si\u0119 zapisa\u0107. Prosz\u0119 spr\u00f3bowa\u0107 ponownie."],"reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.":["Klucze API reCAPTCHA dla wybranej wersji nie s\u0105 skonfigurowane. Ustaw je w Ustawieniach Globalnych."],"Please select a reCAPTCHA version.":["Prosz\u0119 wybra\u0107 wersj\u0119 reCAPTCHA."],"hCaptcha API keys are not configured. Set them in Global Settings.":["Klucze API hCaptcha nie s\u0105 skonfigurowane. Ustaw je w Ustawieniach Globalnych."],"Cloudflare Turnstile API keys are not configured. Set them in Global Settings.":["Klucze API Cloudflare Turnstile nie s\u0105 skonfigurowane. Ustaw je w Ustawieniach Globalnych."],"Form data":["Dane formularza"],"Some fields need attention":["Niekt\u00f3re pola wymagaj\u0105 uwagi"],"Unsaved changes":["Niezapisane zmiany"],"A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.":["Adres e-mail odbiorcy i temat s\u0105 wymagane przed zapisaniem tego powiadomienia. Popraw wyr\u00f3\u017cnione pola lub odrzu\u0107 zmiany, aby wr\u00f3ci\u0107."],"You have unsaved changes for this notification. Discard them to go back, or stay to save them.":["Masz niezapisane zmiany dla tego powiadomienia. Odrzu\u0107 je, aby wr\u00f3ci\u0107, lub zosta\u0144, aby je zapisa\u0107."],"Discard & go back":["Odrzu\u0107 i wr\u00f3\u0107"],"Stay & fix":["Zosta\u0144 i napraw"],"Keep editing":["Kontynuuj edytowanie"],"Please provide a recipient email address.":["Prosz\u0119 poda\u0107 adres e-mail odbiorcy."],"Please provide a subject line.":["Prosz\u0119 poda\u0107 temat."],"Please provide a custom URL.":["Prosz\u0119 poda\u0107 niestandardowy adres URL."],"You have unsaved changes. Discard them to continue, or stay to save your changes.":["Masz niezapisane zmiany. Odrzu\u0107 je, aby kontynuowa\u0107, lub zosta\u0144, aby zapisa\u0107 zmiany."],"Discard & continue":["Odrzu\u0107 i kontynuuj"],"Quill heading picker: default paragraph style\u0004Normal":["Normalny"]}}} \ No newline at end of file diff --git a/languages/sureforms-pl_PL-46b85b18ab0a35677f7beff46af30190.json b/languages/sureforms-pl_PL-46b85b18ab0a35677f7beff46af30190.json new file mode 100644 index 000000000..f483ca325 --- /dev/null +++ b/languages/sureforms-pl_PL-46b85b18ab0a35677f7beff46af30190.json @@ -0,0 +1 @@ +{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/htmlFormDetector.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Converted form":["Przekszta\u0142cona forma"],"SureForms could not authenticate this request. Please reload the editor and try again.":["SureForms nie m\u00f3g\u0142 uwierzytelni\u0107 tego \u017c\u0105dania. Prosz\u0119 prze\u0142adowa\u0107 edytor i spr\u00f3bowa\u0107 ponownie."],"%s \u2014 Converted form":["%s \u2014 Przekszta\u0142cona forma"],"Form converted to SureForms using AI. Review the new form for any tweaks.":["Formularz zosta\u0142 przekszta\u0142cony na SureForms za pomoc\u0105 AI. Przejrzyj nowy formularz pod k\u0105tem ewentualnych poprawek."],"Form converted to SureForms.":["Formularz zosta\u0142 przekszta\u0142cony na SureForms."],"You do not have permission to convert this form.":["Nie masz uprawnie\u0144 do konwersji tego formularza."],"This form is too large to convert. Try simplifying the markup or building the form manually.":["Ten formularz jest zbyt du\u017cy, aby go przekonwertowa\u0107. Spr\u00f3buj upro\u015bci\u0107 znacznik lub zbudowa\u0107 formularz r\u0119cznie."],"SureForms could not derive any fields from this form.":["SureForms nie m\u00f3g\u0142 wyprowadzi\u0107 \u017cadnych p\u00f3l z tego formularza."],"The SureForms AI service could not process this form. Please try again or build the form manually.":["Us\u0142uga SureForms AI nie mog\u0142a przetworzy\u0107 tego formularza. Prosz\u0119 spr\u00f3bowa\u0107 ponownie lub zbudowa\u0107 formularz r\u0119cznie."],"SureForms received an unexpected response. Please try again.":["SureForms otrzyma\u0142 nieoczekiwan\u0105 odpowied\u017a. Prosz\u0119 spr\u00f3bowa\u0107 ponownie."],"Could not convert this form to SureForms. Please try again.":["Nie mo\u017cna przekonwertowa\u0107 tego formularza na SureForms. Prosz\u0119 spr\u00f3bowa\u0107 ponownie."],"Converting\u2026":["Konwertowanie\u2026"],"Convert to SureForms":["Konwertuj na SureForms"]}}} \ No newline at end of file diff --git a/languages/sureforms-pl_PL-4b62e3f004dea2c587b5a3069263d994.json b/languages/sureforms-pl_PL-4b62e3f004dea2c587b5a3069263d994.json index f533819fe..33a21832c 100644 --- a/languages/sureforms-pl_PL-4b62e3f004dea2c587b5a3069263d994.json +++ b/languages/sureforms-pl_PL-4b62e3f004dea2c587b5a3069263d994.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Ustawienia"],"Search":["Szukaj"],"Fields":["Pola"],"Image":["Obraz"],"Submit":["Prze\u015blij"],"Required":["Wymagane"],"Form Title":["Tytu\u0142 formularza"],"Show":["Poka\u017c"],"Hide":["Ukryj"],"Edit Form":["Edytuj formularz"],"Icon":["Ikona"],"Desktop":["Pulpit"],"Medium":["\u015aredni"],"Mobile":["Telefon kom\u00f3rkowy"],"Repeat":["Powt\u00f3rz"],"Scroll":["Przewi\u0144"],"Tablet":["Tablet"],"Basic":["Podstawowy"],"(no title)":["(brak tytu\u0142u)"],"Select a Form":["Wybierz formularz"],"No forms found\u2026":["Nie znaleziono formularzy\u2026"],"Choose":["Wybierz"],"Create New":["Utw\u00f3rz nowe"],"Change Form":["Zmie\u0144 formularz"],"This form has been deleted or is unavailable.":["Ten formularz zosta\u0142 usuni\u0119ty lub jest niedost\u0119pny."],"Form Settings":["Ustawienia formularza"],"Show Form Title on this Page":["Poka\u017c tytu\u0142 formularza na tej stronie"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Uwaga: Aby edytowa\u0107 SureForms, prosz\u0119 odnie\u015b\u0107 si\u0119 do SureForms Editor -"],"Field preview":["Podgl\u0105d pola"],"General":["Og\u00f3lny"],"Style":["Styl"],"Advanced":["Zaawansowany"],"No tags available":["Brak dost\u0119pnych tag\u00f3w"],"Device":["Urz\u0105dzenie"],"Select Shortcodes":["Wybierz skr\u00f3ty"],"Page Break Label":["Etykieta podzia\u0142u strony"],"Next":["Dalej"],"Back":["Wstecz"],"Reset":["Resetuj"],"Generic tags":["Og\u00f3lne tagi"],"Pixel":["Piksel"],"Em":["Em"],"Select Units":["Wybierz jednostki"],"%s units":["%s jednostki"],"Margin":["Margines"],"Attributes":["Atrybuty"],"Input Pattern":["Wzorzec wej\u015bciowy"],"None":["Brak"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Niestandardowy"],"Custom Mask":["Maska niestandardowa"],"Please check the documentation to manage custom input pattern ":["Prosz\u0119 sprawdzi\u0107 dokumentacj\u0119, aby zarz\u0105dza\u0107 niestandardowym wzorcem wej\u015bciowym"],"here":["tutaj"],"Default Value":["Warto\u015b\u0107 domy\u015blna"],"Error Message":["Komunikat o b\u0142\u0119dzie"],"Help Text":["Tekst pomocy"],"Number Format":["Format liczb"],"US Style (Eg: 9,999.99)":["Styl ameryka\u0144ski (np. 9,999.99)"],"EU Style (Eg: 9.999,99)":["Styl UE (np.: 9.999,99)"],"Minimum Value":["Warto\u015b\u0107 minimalna"],"Maximum Value":["Maksymalna warto\u015b\u0107"],"Please check the Minimum and Maximum value":["Prosz\u0119 sprawdzi\u0107 warto\u015b\u0107 minimaln\u0105 i maksymaln\u0105"],"Enable Email Confirmation":["W\u0142\u0105cz potwierdzenie e-mail"],"Checked by Default":["Zaznaczone domy\u015blnie"],"Error message":["Komunikat o b\u0142\u0119dzie"],"Checked by default":["Domy\u015blnie zaznaczone"],"Please add a option props to MultiButtonsControl":["Prosz\u0119 doda\u0107 opcj\u0119 props do MultiButtonsControl"],"Icon Library":["Biblioteka ikon"],"Close":["Zamknij"],"All Icons":["Wszystkie ikony"],"Other":["Inne"],"No Icons Found":["Nie znaleziono ikon"],"Insert Icon":["Wstaw ikon\u0119"],"Change Icon":["Zmie\u0144 ikon\u0119"],"Choose Icon":["Wybierz ikon\u0119"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"Processing\u2026":["Przetwarzanie\u2026"],"Select Video":["Wybierz wideo"],"Change Video":["Zmie\u0144 wideo"],"Select Lottie Animation":["Wybierz animacj\u0119 Lottie"],"Change Lottie Animation":["Zmie\u0144 animacj\u0119 Lottie"],"Upload SVG":["Prze\u015blij SVG"],"Change SVG":["Zmie\u0144 SVG"],"Select Image":["Wybierz obraz"],"Change Image":["Zmie\u0144 obraz"],"Upload SVG?":["Przes\u0142a\u0107 SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Przesy\u0142anie plik\u00f3w SVG mo\u017ce by\u0107 potencjalnie ryzykowne. Czy jeste\u015b pewien?"],"Upload Anyway":["Prze\u015blij mimo to"],"Bulk Add":["Dodaj masowo"],"Bulk Add Options":["Opcje masowego dodawania"],"Enter each option on a new line.":["Wprowad\u017a ka\u017cd\u0105 opcj\u0119 w nowej linii."],"Insert Options":["Opcje wstawiania"],"Full Width":["Pe\u0142na szeroko\u015b\u0107"],"Option Type":["Typ opcji"],"Edit Options":["Edytuj opcje"],"Add New Option":["Dodaj now\u0105 opcj\u0119"],"ADD":["DODAJ"],"Enable Auto Country Detection":["W\u0142\u0105cz automatyczne wykrywanie kraju"],"%s Width":["Szeroko\u015b\u0107 %s"],"Upgrade":["Aktualizacja"],"Clear":["Wyczy\u015b\u0107"],"Select Color":["Wybierz kolor"],"Primary Color":["Kolor podstawowy"],"Text Color":["Kolor tekstu"],"Field Spacing":["Odst\u0119py mi\u0119dzy polami"],"Small":["Ma\u0142y"],"Large":["Du\u017cy"],"Left":["Lewo"],"Center":["Centrum"],"Right":["Prawo"],"Color":["Kolor"],"Background Color":["Kolor t\u0142a"],"Auto":["Samoch\u00f3d"],"Default":["Domy\u015blny"],"Normal":["Normalny"],"%":["%"],"Top":["G\u00f3ra"],"Bottom":["D\u00f3\u0142"],"Width":["Szeroko\u015b\u0107"],"Size":["Rozmiar"],"EM":["EM"],"Padding":["Wype\u0142nienie"],"Color 1":["Kolor 1"],"Color 2":["Kolor 2"],"Type":["Rodzaj"],"Linear":["Liniowy"],"Radial":["Promieniowy"],"Location 1":["Lokalizacja 1"],"Location 2":["Lokalizacja 2"],"Angle":["K\u0105t"],"Classic":["Klasyczny"],"Gradient":["Gradient"],"Horizontal":["Poziomy"],"Vertical":["Pionowy"],"Background":["T\u0142o"],"Cover":["Ok\u0142adka"],"Contain":["Zawiera\u0107"],"Layout":["Uk\u0142ad"],"Overlay":["Nak\u0142adka"],"No Repeat":["Bez powt\u00f3rki"],"Overlay Opacity":["Przezroczysto\u015b\u0107 nak\u0142adki"],"Conditional Logic":["Logika warunkowa"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Ulepsz do planu SureForms Starter, aby tworzy\u0107 dynamiczne formularze, kt\u00f3re dostosowuj\u0105 si\u0119 na podstawie danych wprowadzonych przez u\u017cytkownika, oferuj\u0105c spersonalizowane i efektywne do\u015bwiadczenie formularza."],"Enable Conditional Logic":["W\u0142\u0105cz logik\u0119 warunkow\u0105"],"this field if":["to pole, je\u015bli"],"Configure Conditions":["Skonfiguruj warunki"],"Premium":["Premium"],"Overlay Type":["Typ nak\u0142adki"],"Image Overlay Color":["Kolor nak\u0142adki obrazu"],"Image Position":["Pozycja obrazu"],"Attachment":["Za\u0142\u0105cznik"],"Fixed":["Naprawione"],"Blend Mode":["Tryb mieszania"],"Multiply":["Mno\u017cenie"],"Screen":["Ekran"],"Darken":["Przyciemnij"],"Lighten":["Rozja\u015bnij"],"Color Dodge":["Rozja\u015bnianie koloru"],"Saturation":["Nasycenie"],"Repeat-x":["Powt\u00f3rz-x"],"Repeat-y":["Powt\u00f3rz-y"],"PX":["PX"],"Button":["Przycisk"],"Prefix Label":["Etykieta prefiksu"],"Suffix Label":["Etykieta sufiksu"],"Border Radius":["Promie\u0144 obramowania"],"Form Theme":["Motyw formularza"],"Select Gradient":["Wybierz gradient"],"Unlock Conditional Logic Editor":["Odblokuj edytor logiki warunkowej"],"Rich Text Editor":["Edytor tekstu sformatowanego"],"Read Only":["Tylko do odczytu"],"Select Country":["Wybierz kraj"],"Default Country":["Domy\u015blny kraj"],"Subscription":["Subskrypcja"],"One Time":["Jeden raz"],"Unique Entry":["Unikalny wpis"],"Maximum Characters":["Maksymalna liczba znak\u00f3w"],"Textarea Height":["Wysoko\u015b\u0107 pola tekstowego"],"Minimum Selections":["Minimalna liczba wybor\u00f3w"],"Maximum Selections":["Maksymalna liczba wybor\u00f3w"],"Add Numeric Values to Options":["Dodaj warto\u015bci numeryczne do opcji"],"Single Choice Only":["Tylko jeden wyb\u00f3r"],"Enable Dropdown Search":["W\u0142\u0105cz wyszukiwanie w rozwijanym menu"],"Allow Multiple":["Zezw\u00f3l na wiele"],"%1$s fields are required. Please configure these fields in the block settings.":["Wymagane s\u0105 pola %1$s. Prosz\u0119 skonfigurowa\u0107 te pola w ustawieniach bloku."],"%1$s field is required. Please configure this field in the block settings.":["Pole %1$s jest wymagane. Prosz\u0119 skonfigurowa\u0107 to pole w ustawieniach bloku."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Musisz skonfigurowa\u0107 konto p\u0142atnicze, aby zbiera\u0107 p\u0142atno\u015bci z tego formularza. Prosz\u0119 skonfigurowa\u0107 swojego dostawc\u0119 p\u0142atno\u015bci, aby kontynuowa\u0107."],"Configure Payment Account":["Skonfiguruj konto p\u0142atnicze"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["To jest symbol zast\u0119pczy dla bloku p\u0142atno\u015bci. Rzeczywiste pola p\u0142atno\u015bci dla skonfigurowanego dostawcy p\u0142atno\u015bci pojawi\u0105 si\u0119 dopiero po podgl\u0105dzie lub opublikowaniu formularza."],"2 Payments":["2 P\u0142atno\u015bci"],"3 Payments":["3 P\u0142atno\u015bci"],"4 Payments":["4 P\u0142atno\u015bci"],"5 Payments":["5 P\u0142atno\u015bci"],"Never":["Nigdy"],"Stop Subscription After":["Zatrzymaj subskrypcj\u0119 po"],"Choose when to automatically stop the subscription":["Wybierz, kiedy automatycznie zako\u0144czy\u0107 subskrypcj\u0119"],"Number of Payments":["Liczba p\u0142atno\u015bci"],"Enter a number between 1 to 100":["Wprowad\u017a liczb\u0119 od 1 do 100"],"Form Field":["Pole formularza"],"Payment Type":["Typ p\u0142atno\u015bci"],"Subscription Plan Name":["Nazwa Planu Subskrypcji"],"Billing Interval":["Okres rozliczeniowy"],"Daily":["Codziennie"],"Weekly":["Tygodniowo"],"Monthly":["Miesi\u0119cznie"],"Quarterly":["Kwartalnie"],"Yearly":["Rocznie"],"Amount Type":["Typ kwoty"],"Fixed Amount":["Sta\u0142a kwota"],"Dynamic Amount":["Dynamiczna kwota"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Wybierz, czy naliczy\u0107 sta\u0142\u0105 kwot\u0119, czy naliczy\u0107 kwot\u0119 na podstawie danych wprowadzonych przez u\u017cytkownika w innych polach formularza."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Ustaw dok\u0142adn\u0105 kwot\u0119, kt\u00f3r\u0105 chcesz pobra\u0107. U\u017cytkownicy nie b\u0119d\u0105 mogli jej zmieni\u0107"],"Choose Amount Field":["Wybierz pole kwoty"],"Select a field\u2026":["Wybierz pole\u2026"],"Minimum Amount":["Minimalna kwota"],"Set the minimum amount users can enter (0 for no minimum)":["Ustaw minimaln\u0105 kwot\u0119, jak\u0105 u\u017cytkownicy mog\u0105 wprowadzi\u0107 (0 dla braku minimum)"],"Customer Name Field (Required)":["Pole Nazwa Klienta (Wymagane)"],"Customer Name Field (Optional)":["Pole Nazwa Klienta (Opcjonalne)"],"Select the input field that contains the customer name (Required for subscriptions)":["Wybierz pole wej\u015bciowe, kt\u00f3re zawiera nazwisko klienta (Wymagane dla subskrypcji)"],"Select the input field that contains the customer name":["Wybierz pole wej\u015bciowe, kt\u00f3re zawiera nazwisko klienta"],"Customer Email Field (Required)":["Pole e-mail klienta (wymagane)"],"Select the email field that contains the customer email":["Wybierz pole e-mail, kt\u00f3re zawiera adres e-mail klienta"],"Payment":["P\u0142atno\u015b\u0107"],"%s - Order ID":["%s - Identyfikator zam\u00f3wienia"],"%s - Amount":["%s - Kwota"],"%s - Customer Email":["%s - E-mail klienta"],"%s - Customer Name":["%s - Nazwa klienta"],"%s - Status":["%s - Status"],"Button Alignment":["Wyr\u00f3wnanie przycisku"],"Placeholder":["Symbol zast\u0119pczy"],"Preselect this option":["Wst\u0119pnie wybierz t\u0119 opcj\u0119"],"Restrict Country Codes":["Ogranicz kody kraj\u00f3w"],"Restriction Type":["Typ ograniczenia"],"Allow":["Zezw\u00f3l"],"Block":["Blok"],"Select Allowed Countries":["Wybierz dozwolone kraje"],"Choose countries\u2026":["Wybierz kraje\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Wybierz, kt\u00f3re kody kraj\u00f3w u\u017cytkownicy mog\u0105 wybra\u0107 w polu numeru telefonu. Pozostaw puste, aby zezwoli\u0107 na wszystkie kody kraj\u00f3w."],"Select Blocked Countries":["Wybierz zablokowane kraje"],"These countries will be hidden from the dropdown.":["Te kraje b\u0119d\u0105 ukryte w rozwijanym menu."],"Bulk Edit":["Masowa edycja"],"Select Layout":["Wybierz uk\u0142ad"],"Number of Columns":["Liczba kolumn"],"Validation Message for Duplicate":["Komunikat walidacyjny dla duplikatu"],"Click here to insert a form":["Kliknij tutaj, aby wstawi\u0107 formularz"],"Inherit Form's Original Style":["Odziedzicz oryginalny styl formularza"],"Text on Primary":["Tekst na g\u0142\u00f3wnym"],"%s - Description":["%s - Opis"],"Upgrade to Unlock":["Uaktualnij, aby odblokowa\u0107"],"Custom (Premium)":["Niestandardowy (Premium)"],"Select a theme style for this form embed.":["Wybierz styl motywu dla tego osadzenia formularza."],"Colors":["Kolory"],"Advanced Styling":["Zaawansowane stylizowanie"],"Unlock Custom Styling":["Odblokuj niestandardowe stylizacje"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Prze\u0142\u0105cz si\u0119 na tryb niestandardowy, aby przej\u0105\u0107 pe\u0142n\u0105 kontrol\u0119 nad projektem i odst\u0119pami formularza."],"Full color control (buttons, fields, text)":["Pe\u0142na kontrola koloru (przyciski, pola, tekst)"],"Row and column gap control":["Kontrola odst\u0119p\u00f3w mi\u0119dzy wierszami i kolumnami"],"Field spacing and layout precision":["Precyzja rozmieszczenia i odst\u0119p\u00f3w p\u00f3l"],"Complete button styling":["Kompletne stylizowanie przycisku"],"Payment Description":["Opis p\u0142atno\u015bci"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Pokazywane na paragonach p\u0142atno\u015bci i w panelu p\u0142atno\u015bci (Stripe i PayPal). Pozostaw puste, aby u\u017cy\u0107 domy\u015blnego."],"Slug":["\u015alimak"],"Auto-generated on save":["Automatycznie generowane przy zapisie"],"This slug is already used by another field. It will revert to the previous value.":["Ten slug jest ju\u017c u\u017cywany przez inne pole. Zostanie przywr\u00f3cony do poprzedniej warto\u015bci."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Zmiana slug mo\u017ce spowodowa\u0107 problemy z przesy\u0142aniem formularzy, logik\u0105 warunkow\u0105, integracjami lub innymi funkcjami, kt\u00f3re obecnie odwo\u0142uj\u0105 si\u0119 do tego slug. B\u0119dziesz musia\u0142 r\u0119cznie zaktualizowa\u0107 wszystkie takie odwo\u0142ania."],"Field Slug":["Slug pola"],"Location Services":["Us\u0142ugi lokalizacyjne"],"Unlock Address Autocomplete":["Odblokuj autouzupe\u0142nianie adresu"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Ulepsz, aby w\u0142\u0105czy\u0107 funkcj\u0119 autouzupe\u0142niania adres\u00f3w Google z interaktywnym podgl\u0105dem mapy, co przyspieszy i zwi\u0119kszy dok\u0142adno\u015b\u0107 wprowadzania adres\u00f3w dla Twoich u\u017cytkownik\u00f3w."],"Enable Google Autocomplete":["W\u0142\u0105cz autouzupe\u0142nianie Google"],"Show Interactive Map":["Poka\u017c interaktywn\u0105 map\u0119"],"Payments Per Page":["P\u0142atno\u015bci za stron\u0119"],"Show Subscriptions Section":["Poka\u017c sekcj\u0119 subskrypcji"],"Show a dedicated subscriptions section above payment history.":["Poka\u017c dedykowan\u0105 sekcj\u0119 subskrypcji nad histori\u0105 p\u0142atno\u015bci."],"Payment Dashboard":["Panel P\u0142atno\u015bci"],"View your payments and manage subscriptions in a single dashboard.":["Przegl\u0105daj swoje p\u0142atno\u015bci i zarz\u0105dzaj subskrypcjami w jednym panelu."],"Dynamic Default Value":["Dynamiczna warto\u015b\u0107 domy\u015blna"],"Minimum Characters":["Minimalna liczba znak\u00f3w"],"Minimum characters cannot exceed Maximum characters.":["Minimalna liczba znak\u00f3w nie mo\u017ce przekracza\u0107 maksymalnej liczby znak\u00f3w."],"Both":["Oba"],"One-Time Label":["Etykieta jednorazowa"],"Label shown to users for the one-time payment option.":["Etykieta pokazywana u\u017cytkownikom dla opcji jednorazowej p\u0142atno\u015bci."],"Subscription Label":["Etykieta subskrypcji"],"Label shown to users for the subscription option.":["Etykieta pokazywana u\u017cytkownikom dla opcji subskrypcji."],"Default Selection":["Domy\u015blny wyb\u00f3r"],"Which option is pre-selected when the form loads.":["Kt\u00f3ra opcja jest wst\u0119pnie wybrana po za\u0142adowaniu formularza."],"One-Time Amount Type":["Rodzaj kwoty jednorazowej"],"Set how the one-time payment amount is determined.":["Ustaw, jak jest okre\u015blana kwota jednorazowej p\u0142atno\u015bci."],"One-Time Fixed Amount":["Jednorazowa sta\u0142a kwota"],"Amount charged for a one-time payment.":["Kwota pobrana za jednorazow\u0105 p\u0142atno\u015b\u0107."],"One-Time Amount Field":["Pole kwoty jednorazowej"],"Pick a form field whose value determines the one-time payment amount.":["Wybierz pole formularza, kt\u00f3rego warto\u015b\u0107 okre\u015bla kwot\u0119 jednorazowej p\u0142atno\u015bci."],"One-Time Minimum Amount":["Jednorazowa minimalna kwota"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Minimalna kwota, jak\u0105 u\u017cytkownicy mog\u0105 wprowadzi\u0107 dla jednorazowej p\u0142atno\u015bci (0, je\u015bli brak minimum)."],"Subscription Amount Type":["Typ kwoty subskrypcji"],"Set how the subscription amount is determined.":["Ustaw, jak jest okre\u015blana kwota subskrypcji."],"Subscription Fixed Amount":["Sta\u0142a kwota subskrypcji"],"Recurring amount charged per billing interval.":["Powtarzaj\u0105ca si\u0119 kwota pobierana za ka\u017cdy okres rozliczeniowy."],"Subscription Amount Field":["Pole kwoty subskrypcji"],"Pick a form field whose value determines the subscription amount.":["Wybierz pole formularza, kt\u00f3rego warto\u015b\u0107 okre\u015bla kwot\u0119 subskrypcji."],"Subscription Minimum Amount":["Minimalna kwota subskrypcji"],"Minimum amount users can enter for subscription (0 for no minimum).":["Minimalna kwota, jak\u0105 u\u017cytkownicy mog\u0105 wpisa\u0107 na subskrypcj\u0119 (0 oznacza brak minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Wybierz pole z formularza, takie jak liczba, lista rozwijana, wielokrotny wyb\u00f3r lub ukryte, kt\u00f3rego warto\u015b\u0107 powinna decydowa\u0107 o kwocie p\u0142atno\u015bci."]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Ustawienia"],"Search":["Szukaj"],"Fields":["Pola"],"Image":["Obraz"],"Submit":["Prze\u015blij"],"Required":["Wymagane"],"Form Title":["Tytu\u0142 formularza"],"Show":["Poka\u017c"],"Hide":["Ukryj"],"Edit Form":["Edytuj formularz"],"Icon":["Ikona"],"Desktop":["Pulpit"],"Medium":["\u015aredni"],"Mobile":["Telefon kom\u00f3rkowy"],"Repeat":["Powt\u00f3rz"],"Scroll":["Przewi\u0144"],"Tablet":["Tablet"],"Basic":["Podstawowy"],"(no title)":["(brak tytu\u0142u)"],"Select a Form":["Wybierz formularz"],"No forms found\u2026":["Nie znaleziono formularzy\u2026"],"Choose":["Wybierz"],"Create New":["Utw\u00f3rz nowe"],"Change Form":["Zmie\u0144 formularz"],"This form has been deleted or is unavailable.":["Ten formularz zosta\u0142 usuni\u0119ty lub jest niedost\u0119pny."],"Form Settings":["Ustawienia formularza"],"Show Form Title on this Page":["Poka\u017c tytu\u0142 formularza na tej stronie"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Uwaga: Aby edytowa\u0107 SureForms, prosz\u0119 odnie\u015b\u0107 si\u0119 do SureForms Editor -"],"Field preview":["Podgl\u0105d pola"],"General":["Og\u00f3lny"],"Style":["Styl"],"Advanced":["Zaawansowany"],"No tags available":["Brak dost\u0119pnych tag\u00f3w"],"Device":["Urz\u0105dzenie"],"Select Shortcodes":["Wybierz skr\u00f3ty"],"Page Break Label":["Etykieta podzia\u0142u strony"],"Next":["Dalej"],"Back":["Wstecz"],"Reset":["Resetuj"],"Generic tags":["Og\u00f3lne tagi"],"Pixel":["Piksel"],"Em":["Em"],"Select Units":["Wybierz jednostki"],"%s units":["%s jednostki"],"Margin":["Margines"],"Attributes":["Atrybuty"],"Input Pattern":["Wzorzec wej\u015bciowy"],"None":["Brak"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Niestandardowy"],"Custom Mask":["Maska niestandardowa"],"Please check the documentation to manage custom input pattern ":["Prosz\u0119 sprawdzi\u0107 dokumentacj\u0119, aby zarz\u0105dza\u0107 niestandardowym wzorcem wej\u015bciowym"],"here":["tutaj"],"Default Value":["Warto\u015b\u0107 domy\u015blna"],"Error Message":["Komunikat o b\u0142\u0119dzie"],"Help Text":["Tekst pomocy"],"Number Format":["Format liczb"],"US Style (Eg: 9,999.99)":["Styl ameryka\u0144ski (np. 9,999.99)"],"EU Style (Eg: 9.999,99)":["Styl UE (np.: 9.999,99)"],"Minimum Value":["Warto\u015b\u0107 minimalna"],"Maximum Value":["Maksymalna warto\u015b\u0107"],"Please check the Minimum and Maximum value":["Prosz\u0119 sprawdzi\u0107 warto\u015b\u0107 minimaln\u0105 i maksymaln\u0105"],"Enable Email Confirmation":["W\u0142\u0105cz potwierdzenie e-mail"],"Checked by Default":["Zaznaczone domy\u015blnie"],"Error message":["Komunikat o b\u0142\u0119dzie"],"Checked by default":["Domy\u015blnie zaznaczone"],"Please add a option props to MultiButtonsControl":["Prosz\u0119 doda\u0107 opcj\u0119 props do MultiButtonsControl"],"Icon Library":["Biblioteka ikon"],"Close":["Zamknij"],"All Icons":["Wszystkie ikony"],"Other":["Inne"],"No Icons Found":["Nie znaleziono ikon"],"Insert Icon":["Wstaw ikon\u0119"],"Change Icon":["Zmie\u0144 ikon\u0119"],"Choose Icon":["Wybierz ikon\u0119"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"Processing\u2026":["Przetwarzanie\u2026"],"Select Video":["Wybierz wideo"],"Change Video":["Zmie\u0144 wideo"],"Select Lottie Animation":["Wybierz animacj\u0119 Lottie"],"Change Lottie Animation":["Zmie\u0144 animacj\u0119 Lottie"],"Upload SVG":["Prze\u015blij SVG"],"Change SVG":["Zmie\u0144 SVG"],"Select Image":["Wybierz obraz"],"Change Image":["Zmie\u0144 obraz"],"Upload SVG?":["Przes\u0142a\u0107 SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Przesy\u0142anie plik\u00f3w SVG mo\u017ce by\u0107 potencjalnie ryzykowne. Czy jeste\u015b pewien?"],"Upload Anyway":["Prze\u015blij mimo to"],"Bulk Add":["Dodaj masowo"],"Bulk Add Options":["Opcje masowego dodawania"],"Enter each option on a new line.":["Wprowad\u017a ka\u017cd\u0105 opcj\u0119 w nowej linii."],"Insert Options":["Opcje wstawiania"],"Full Width":["Pe\u0142na szeroko\u015b\u0107"],"Option Type":["Typ opcji"],"Edit Options":["Edytuj opcje"],"Add New Option":["Dodaj now\u0105 opcj\u0119"],"ADD":["DODAJ"],"Enable Auto Country Detection":["W\u0142\u0105cz automatyczne wykrywanie kraju"],"%s Width":["Szeroko\u015b\u0107 %s"],"Upgrade":["Aktualizacja"],"Clear":["Wyczy\u015b\u0107"],"Select Color":["Wybierz kolor"],"Primary Color":["Kolor podstawowy"],"Text Color":["Kolor tekstu"],"Field Spacing":["Odst\u0119py mi\u0119dzy polami"],"Small":["Ma\u0142y"],"Large":["Du\u017cy"],"Left":["Lewo"],"Center":["Centrum"],"Right":["Prawo"],"Color":["Kolor"],"Background Color":["Kolor t\u0142a"],"Auto":["Samoch\u00f3d"],"Default":["Domy\u015blny"],"Normal":["Normalny"],"%":["%"],"Top":["G\u00f3ra"],"Bottom":["D\u00f3\u0142"],"Width":["Szeroko\u015b\u0107"],"Size":["Rozmiar"],"EM":["EM"],"Padding":["Wype\u0142nienie"],"Color 1":["Kolor 1"],"Color 2":["Kolor 2"],"Type":["Rodzaj"],"Linear":["Liniowy"],"Radial":["Promieniowy"],"Location 1":["Lokalizacja 1"],"Location 2":["Lokalizacja 2"],"Angle":["K\u0105t"],"Classic":["Klasyczny"],"Gradient":["Gradient"],"Horizontal":["Poziomy"],"Vertical":["Pionowy"],"Background":["T\u0142o"],"Cover":["Ok\u0142adka"],"Contain":["Zawiera\u0107"],"Layout":["Uk\u0142ad"],"Overlay":["Nak\u0142adka"],"No Repeat":["Bez powt\u00f3rki"],"Overlay Opacity":["Przezroczysto\u015b\u0107 nak\u0142adki"],"Conditional Logic":["Logika warunkowa"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Ulepsz do planu SureForms Starter, aby tworzy\u0107 dynamiczne formularze, kt\u00f3re dostosowuj\u0105 si\u0119 na podstawie danych wprowadzonych przez u\u017cytkownika, oferuj\u0105c spersonalizowane i efektywne do\u015bwiadczenie formularza."],"Enable Conditional Logic":["W\u0142\u0105cz logik\u0119 warunkow\u0105"],"this field if":["to pole, je\u015bli"],"Configure Conditions":["Skonfiguruj warunki"],"Premium":["Premium"],"Overlay Type":["Typ nak\u0142adki"],"Image Overlay Color":["Kolor nak\u0142adki obrazu"],"Image Position":["Pozycja obrazu"],"Attachment":["Za\u0142\u0105cznik"],"Fixed":["Naprawione"],"Blend Mode":["Tryb mieszania"],"Multiply":["Mno\u017cenie"],"Screen":["Ekran"],"Darken":["Przyciemnij"],"Lighten":["Rozja\u015bnij"],"Color Dodge":["Rozja\u015bnianie koloru"],"Saturation":["Nasycenie"],"Repeat-x":["Powt\u00f3rz-x"],"Repeat-y":["Powt\u00f3rz-y"],"PX":["PX"],"Button":["Przycisk"],"Prefix Label":["Etykieta prefiksu"],"Suffix Label":["Etykieta sufiksu"],"Border Radius":["Promie\u0144 obramowania"],"Form Theme":["Motyw formularza"],"Select Gradient":["Wybierz gradient"],"Unlock Conditional Logic Editor":["Odblokuj edytor logiki warunkowej"],"Rich Text Editor":["Edytor tekstu sformatowanego"],"Read Only":["Tylko do odczytu"],"Select Country":["Wybierz kraj"],"Default Country":["Domy\u015blny kraj"],"Subscription":["Subskrypcja"],"One Time":["Jeden raz"],"Unique Entry":["Unikalny wpis"],"Maximum Characters":["Maksymalna liczba znak\u00f3w"],"Textarea Height":["Wysoko\u015b\u0107 pola tekstowego"],"Minimum Selections":["Minimalna liczba wybor\u00f3w"],"Maximum Selections":["Maksymalna liczba wybor\u00f3w"],"Add Numeric Values to Options":["Dodaj warto\u015bci numeryczne do opcji"],"Single Choice Only":["Tylko jeden wyb\u00f3r"],"Enable Dropdown Search":["W\u0142\u0105cz wyszukiwanie w rozwijanym menu"],"Allow Multiple":["Zezw\u00f3l na wiele"],"%1$s fields are required. Please configure these fields in the block settings.":["Wymagane s\u0105 pola %1$s. Prosz\u0119 skonfigurowa\u0107 te pola w ustawieniach bloku."],"%1$s field is required. Please configure this field in the block settings.":["Pole %1$s jest wymagane. Prosz\u0119 skonfigurowa\u0107 to pole w ustawieniach bloku."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Musisz skonfigurowa\u0107 konto p\u0142atnicze, aby zbiera\u0107 p\u0142atno\u015bci z tego formularza. Prosz\u0119 skonfigurowa\u0107 swojego dostawc\u0119 p\u0142atno\u015bci, aby kontynuowa\u0107."],"Configure Payment Account":["Skonfiguruj konto p\u0142atnicze"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["To jest symbol zast\u0119pczy dla bloku p\u0142atno\u015bci. Rzeczywiste pola p\u0142atno\u015bci dla skonfigurowanego dostawcy p\u0142atno\u015bci pojawi\u0105 si\u0119 dopiero po podgl\u0105dzie lub opublikowaniu formularza."],"2 Payments":["2 P\u0142atno\u015bci"],"3 Payments":["3 P\u0142atno\u015bci"],"4 Payments":["4 P\u0142atno\u015bci"],"5 Payments":["5 P\u0142atno\u015bci"],"Never":["Nigdy"],"Stop Subscription After":["Zatrzymaj subskrypcj\u0119 po"],"Choose when to automatically stop the subscription":["Wybierz, kiedy automatycznie zako\u0144czy\u0107 subskrypcj\u0119"],"Number of Payments":["Liczba p\u0142atno\u015bci"],"Enter a number between 1 to 100":["Wprowad\u017a liczb\u0119 od 1 do 100"],"Form Field":["Pole formularza"],"Payment Type":["Typ p\u0142atno\u015bci"],"Subscription Plan Name":["Nazwa Planu Subskrypcji"],"Billing Interval":["Okres rozliczeniowy"],"Daily":["Codziennie"],"Weekly":["Tygodniowo"],"Monthly":["Miesi\u0119cznie"],"Quarterly":["Kwartalnie"],"Yearly":["Rocznie"],"Amount Type":["Typ kwoty"],"Fixed Amount":["Sta\u0142a kwota"],"Dynamic Amount":["Dynamiczna kwota"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Wybierz, czy naliczy\u0107 sta\u0142\u0105 kwot\u0119, czy naliczy\u0107 kwot\u0119 na podstawie danych wprowadzonych przez u\u017cytkownika w innych polach formularza."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Ustaw dok\u0142adn\u0105 kwot\u0119, kt\u00f3r\u0105 chcesz pobra\u0107. U\u017cytkownicy nie b\u0119d\u0105 mogli jej zmieni\u0107"],"Choose Amount Field":["Wybierz pole kwoty"],"Select a field\u2026":["Wybierz pole\u2026"],"Minimum Amount":["Minimalna kwota"],"Set the minimum amount users can enter (0 for no minimum)":["Ustaw minimaln\u0105 kwot\u0119, jak\u0105 u\u017cytkownicy mog\u0105 wprowadzi\u0107 (0 dla braku minimum)"],"Customer Name Field (Required)":["Pole Nazwa Klienta (Wymagane)"],"Customer Name Field (Optional)":["Pole Nazwa Klienta (Opcjonalne)"],"Select the input field that contains the customer name (Required for subscriptions)":["Wybierz pole wej\u015bciowe, kt\u00f3re zawiera nazwisko klienta (Wymagane dla subskrypcji)"],"Select the input field that contains the customer name":["Wybierz pole wej\u015bciowe, kt\u00f3re zawiera nazwisko klienta"],"Customer Email Field (Required)":["Pole e-mail klienta (wymagane)"],"Select the email field that contains the customer email":["Wybierz pole e-mail, kt\u00f3re zawiera adres e-mail klienta"],"Payment":["P\u0142atno\u015b\u0107"],"%s - Order ID":["%s - Identyfikator zam\u00f3wienia"],"%s - Amount":["%s - Kwota"],"%s - Customer Email":["%s - E-mail klienta"],"%s - Customer Name":["%s - Nazwa klienta"],"%s - Status":["%s - Status"],"Button Alignment":["Wyr\u00f3wnanie przycisku"],"Placeholder":["Symbol zast\u0119pczy"],"Preselect this option":["Wst\u0119pnie wybierz t\u0119 opcj\u0119"],"Restrict Country Codes":["Ogranicz kody kraj\u00f3w"],"Restriction Type":["Typ ograniczenia"],"Allow":["Zezw\u00f3l"],"Block":["Blok"],"Select Allowed Countries":["Wybierz dozwolone kraje"],"Choose countries\u2026":["Wybierz kraje\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Wybierz, kt\u00f3re kody kraj\u00f3w u\u017cytkownicy mog\u0105 wybra\u0107 w polu numeru telefonu. Pozostaw puste, aby zezwoli\u0107 na wszystkie kody kraj\u00f3w."],"Select Blocked Countries":["Wybierz zablokowane kraje"],"These countries will be hidden from the dropdown.":["Te kraje b\u0119d\u0105 ukryte w rozwijanym menu."],"Bulk Edit":["Masowa edycja"],"Select Layout":["Wybierz uk\u0142ad"],"Number of Columns":["Liczba kolumn"],"Validation Message for Duplicate":["Komunikat walidacyjny dla duplikatu"],"Click here to insert a form":["Kliknij tutaj, aby wstawi\u0107 formularz"],"Inherit Form's Original Style":["Odziedzicz oryginalny styl formularza"],"Text on Primary":["Tekst na g\u0142\u00f3wnym"],"%s - Description":["%s - Opis"],"Upgrade to Unlock":["Uaktualnij, aby odblokowa\u0107"],"Custom (Premium)":["Niestandardowy (Premium)"],"Select a theme style for this form embed.":["Wybierz styl motywu dla tego osadzenia formularza."],"Colors":["Kolory"],"Advanced Styling":["Zaawansowane stylizowanie"],"Unlock Custom Styling":["Odblokuj niestandardowe stylizacje"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Prze\u0142\u0105cz si\u0119 na tryb niestandardowy, aby przej\u0105\u0107 pe\u0142n\u0105 kontrol\u0119 nad projektem i odst\u0119pami formularza."],"Full color control (buttons, fields, text)":["Pe\u0142na kontrola koloru (przyciski, pola, tekst)"],"Row and column gap control":["Kontrola odst\u0119p\u00f3w mi\u0119dzy wierszami i kolumnami"],"Field spacing and layout precision":["Precyzja rozmieszczenia i odst\u0119p\u00f3w p\u00f3l"],"Complete button styling":["Kompletne stylizowanie przycisku"],"Payment Description":["Opis p\u0142atno\u015bci"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Pokazywane na paragonach p\u0142atno\u015bci i w panelu p\u0142atno\u015bci (Stripe i PayPal). Pozostaw puste, aby u\u017cy\u0107 domy\u015blnego."],"Slug":["\u015alimak"],"Auto-generated on save":["Automatycznie generowane przy zapisie"],"This slug is already used by another field. It will revert to the previous value.":["Ten slug jest ju\u017c u\u017cywany przez inne pole. Zostanie przywr\u00f3cony do poprzedniej warto\u015bci."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Zmiana slug mo\u017ce spowodowa\u0107 problemy z przesy\u0142aniem formularzy, logik\u0105 warunkow\u0105, integracjami lub innymi funkcjami, kt\u00f3re obecnie odwo\u0142uj\u0105 si\u0119 do tego slug. B\u0119dziesz musia\u0142 r\u0119cznie zaktualizowa\u0107 wszystkie takie odwo\u0142ania."],"Field Slug":["Slug pola"],"Location Services":["Us\u0142ugi lokalizacyjne"],"Unlock Address Autocomplete":["Odblokuj autouzupe\u0142nianie adresu"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Ulepsz, aby w\u0142\u0105czy\u0107 funkcj\u0119 autouzupe\u0142niania adres\u00f3w Google z interaktywnym podgl\u0105dem mapy, co przyspieszy i zwi\u0119kszy dok\u0142adno\u015b\u0107 wprowadzania adres\u00f3w dla Twoich u\u017cytkownik\u00f3w."],"Enable Google Autocomplete":["W\u0142\u0105cz autouzupe\u0142nianie Google"],"Show Interactive Map":["Poka\u017c interaktywn\u0105 map\u0119"],"Payments Per Page":["P\u0142atno\u015bci za stron\u0119"],"Show Subscriptions Section":["Poka\u017c sekcj\u0119 subskrypcji"],"Show a dedicated subscriptions section above payment history.":["Poka\u017c dedykowan\u0105 sekcj\u0119 subskrypcji nad histori\u0105 p\u0142atno\u015bci."],"Payment Dashboard":["Panel P\u0142atno\u015bci"],"View your payments and manage subscriptions in a single dashboard.":["Przegl\u0105daj swoje p\u0142atno\u015bci i zarz\u0105dzaj subskrypcjami w jednym panelu."],"Dynamic Default Value":["Dynamiczna warto\u015b\u0107 domy\u015blna"],"Minimum Characters":["Minimalna liczba znak\u00f3w"],"Minimum characters cannot exceed Maximum characters.":["Minimalna liczba znak\u00f3w nie mo\u017ce przekracza\u0107 maksymalnej liczby znak\u00f3w."],"Both":["Oba"],"One-Time Label":["Etykieta jednorazowa"],"Label shown to users for the one-time payment option.":["Etykieta pokazywana u\u017cytkownikom dla opcji jednorazowej p\u0142atno\u015bci."],"Subscription Label":["Etykieta subskrypcji"],"Label shown to users for the subscription option.":["Etykieta pokazywana u\u017cytkownikom dla opcji subskrypcji."],"Default Selection":["Domy\u015blny wyb\u00f3r"],"Which option is pre-selected when the form loads.":["Kt\u00f3ra opcja jest wst\u0119pnie wybrana po za\u0142adowaniu formularza."],"One-Time Amount Type":["Rodzaj kwoty jednorazowej"],"Set how the one-time payment amount is determined.":["Ustaw, jak jest okre\u015blana kwota jednorazowej p\u0142atno\u015bci."],"One-Time Fixed Amount":["Jednorazowa sta\u0142a kwota"],"Amount charged for a one-time payment.":["Kwota pobrana za jednorazow\u0105 p\u0142atno\u015b\u0107."],"One-Time Amount Field":["Pole kwoty jednorazowej"],"Pick a form field whose value determines the one-time payment amount.":["Wybierz pole formularza, kt\u00f3rego warto\u015b\u0107 okre\u015bla kwot\u0119 jednorazowej p\u0142atno\u015bci."],"One-Time Minimum Amount":["Jednorazowa minimalna kwota"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Minimalna kwota, jak\u0105 u\u017cytkownicy mog\u0105 wprowadzi\u0107 dla jednorazowej p\u0142atno\u015bci (0, je\u015bli brak minimum)."],"Subscription Amount Type":["Typ kwoty subskrypcji"],"Set how the subscription amount is determined.":["Ustaw, jak jest okre\u015blana kwota subskrypcji."],"Subscription Fixed Amount":["Sta\u0142a kwota subskrypcji"],"Recurring amount charged per billing interval.":["Powtarzaj\u0105ca si\u0119 kwota pobierana za ka\u017cdy okres rozliczeniowy."],"Subscription Amount Field":["Pole kwoty subskrypcji"],"Pick a form field whose value determines the subscription amount.":["Wybierz pole formularza, kt\u00f3rego warto\u015b\u0107 okre\u015bla kwot\u0119 subskrypcji."],"Subscription Minimum Amount":["Minimalna kwota subskrypcji"],"Minimum amount users can enter for subscription (0 for no minimum).":["Minimalna kwota, jak\u0105 u\u017cytkownicy mog\u0105 wpisa\u0107 na subskrypcj\u0119 (0 oznacza brak minimum)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Wybierz pole z formularza, takie jak liczba, lista rozwijana, wielokrotny wyb\u00f3r lub ukryte, kt\u00f3rego warto\u015b\u0107 powinna decydowa\u0107 o kwocie p\u0142atno\u015bci."],"Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.":["U\u017cyj inteligentnego tagu, takiego jak {get_input:country}. Pierwsza opcja, kt\u00f3rej tytu\u0142 pasuje do rozwi\u0105zanego warto\u015bci, zostanie wst\u0119pnie wybrana."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.":["U\u017cyj inteligentnego tagu, takiego jak {get_input:colors} i przeka\u017c warto\u015bci oddzielone pionow\u0105 kresk\u0105 w URL (na przyk\u0142ad ?colors=Red|Blue). Ka\u017cda opcja, kt\u00f3rej tytu\u0142 pasuje do warto\u015bci, zostanie zaznaczona. Mo\u017cesz r\u00f3wnie\u017c \u0142\u0105czy\u0107 wiele inteligentnych tag\u00f3w oddzielonych pionowymi kreskami."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.":["U\u017cyj inteligentnego tagu, takiego jak {get_input:colors} i przeka\u017c warto\u015bci oddzielone pionowymi kreskami w URL (na przyk\u0142ad ?colors=Red|Blue). Ka\u017cda opcja, kt\u00f3rej etykieta pasuje do warto\u015bci, zostanie wst\u0119pnie wybrana. Mo\u017cesz r\u00f3wnie\u017c \u0142\u0105czy\u0107 wiele inteligentnych tag\u00f3w oddzielonych pionowymi kreskami."],"Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.":["U\u017cyj inteligentnego tagu, takiego jak {get_input:country}. Pierwsza opcja, kt\u00f3rej etykieta pasuje do rozwi\u0105zanego warto\u015bci, zostanie wst\u0119pnie wybrana."]}}} \ No newline at end of file diff --git a/languages/sureforms-pl_PL-51635fe6489fc8288d603fe596c755ca.json b/languages/sureforms-pl_PL-51635fe6489fc8288d603fe596c755ca.json index e8871f38b..bc61d7951 100644 --- a/languages/sureforms-pl_PL-51635fe6489fc8288d603fe596c755ca.json +++ b/languages/sureforms-pl_PL-51635fe6489fc8288d603fe596c755ca.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Panel sterowania"],"Settings":["Ustawienia"],"Entries":["Wpisy"],"Activated":["Aktywowany"],"Activate":["Aktywuj"],"Monday":["Poniedzia\u0142ek"],"Forms":["Formularze"],"GitHub":["GitHub"],"General":["Og\u00f3lny"],"Other":["Inne"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"Install":["Zainstaluj"],"Plugin Installation failed, Please try again later.":["Instalacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Plugin activation failed, Please try again later.":["Aktywacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Integrations":["Integracje"],"What's New?":["Co nowego?"],"Core":["Rdze\u0144"],"Unlicensed":["Bez licencji"],"Connecting\u2026":["\u0141\u0105czenie\u2026"],"Install & Activate":["Zainstaluj i aktywuj"],"Send Email To":["Wy\u015blij e-mail do"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Niewidoczna"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Walidacje"],"Spam Protection":["Ochrona przed spamem"],"Email Summaries":["Podsumowania e-maili"],"Tuesday":["Wtorek"],"Wednesday":["\u015aroda"],"Thursday":["Czwartek"],"Friday":["Pi\u0105tek"],"Saturday":["Sobota"],"Sunday":["Niedziela"],"Test Email":["Testowy email"],"Schedule Reports":["Zaplanuj raporty"],"IP Logging":["Rejestrowanie IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Je\u015bli ta opcja jest w\u0142\u0105czona, adres IP u\u017cytkownika zostanie zapisany wraz z danymi formularza"],"Confirmation Email Mismatch Message":["Wiadomo\u015b\u0107 o niezgodno\u015bci e-maila potwierdzaj\u0105cego"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s oznacza minimaln\u0105 warto\u015b\u0107 wej\u015bciow\u0105. Na przyk\u0142ad: \"Minimalna warto\u015b\u0107 to 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s oznacza maksymaln\u0105 warto\u015b\u0107 wej\u015bciow\u0105. Na przyk\u0142ad: \"Maksymalna warto\u015b\u0107 to 100.\""],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s oznacza minimaln\u0105 liczb\u0119 wymaganych wybor\u00f3w. Na przyk\u0142ad: \u201eWymagane s\u0105 co najmniej 2 wybory\u201d."],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s oznacza maksymaln\u0105 liczb\u0119 dozwolonych wybor\u00f3w. Na przyk\u0142ad: \u201eDozwolone s\u0105 maksymalnie 4 wybory.\u201d"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s oznacza minimaln\u0105 liczb\u0119 potrzebnych wybor\u00f3w. Na przyk\u0142ad: \u201eWymagany jest co najmniej 1 wyb\u00f3r.\u201d"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s oznacza maksymaln\u0105 liczb\u0119 dozwolonych wybor\u00f3w. Na przyk\u0142ad: \u201eDozwolone s\u0105 maksymalnie 3 wybory\u201d."]," Error Message":["Komunikat o b\u0142\u0119dzie"],"Auto":["Samoch\u00f3d"],"Light":["\u015awiat\u0142o"],"Dark":["Ciemny"],"Turnstile":["Bramka"],"Honeypot":["Pu\u0142apka"],"Get Keys":["Pobierz klucze"],"Documentation":["Dokumentacja"],"Site Key":["Klucz strony"],"Secret Key":["Klucz tajny"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Tryb wygl\u0105du"],"Enable Honeypot Security":["W\u0142\u0105cz zabezpieczenie Honeypot"],"Enable Honeypot Security for better spam protection":["W\u0142\u0105cz Honeypot Security dla lepszej ochrony przed spamem"],"This field cannot be left blank.":["To pole nie mo\u017ce pozosta\u0107 puste."],"OttoKit":["OttoKit"],"Connect with OttoKit":["Po\u0142\u0105cz si\u0119 z OttoKit"],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Gotowy, aby wyj\u015b\u0107 poza darmowy plan?"],"Upgrade now":["Zaktualizuj teraz"],"and unlock the full power of SureForms!":["i odblokuj pe\u0142n\u0105 moc SureForms!"],"Upgrade SureForms":["Uaktualnij SureForms"],"Upgrade Now":["Zaktualizuj teraz"],"Form Validation":["Walidacja formularza"],"Required Error Messages":["Wymagane komunikaty o b\u0142\u0119dach"],"Other Error Messages":["Inne komunikaty o b\u0142\u0119dach"],"Input Field Unique":["Pole wej\u015bciowe unikalne"],"Email Field Unique":["Pole e-mail musi by\u0107 unikalne"],"Invalid URL":["Nieprawid\u0142owy URL"],"Phone Field Unique":["Pole telefonu unikalne"],"Invalid Field Number Block":["Nieprawid\u0142owy blok numeru pola"],"Invalid Email":["Nieprawid\u0142owy adres e-mail"],"Number Minimum Value":["Minimalna warto\u015b\u0107 liczby"],"Number Maximum Value":["Maksymalna warto\u015b\u0107 liczby"],"Dropdown Minimum Selections":["Minimalna liczba wybor\u00f3w w rozwijanym menu"],"Dropdown Maximum Selections":["Maksymalna liczba wybor\u00f3w w rozwijanym menu"],"Multiple Choice Minimum Selections":["Minimalna liczba wybor\u00f3w w pytaniach wielokrotnego wyboru"],"Multiple Choice Maximum Selections":["Wielokrotny wyb\u00f3r maksymalna liczba zaznacze\u0144"],"Input Field":["Pole wej\u015bciowe"],"Email Field":["Pole e-mail"],"URL Field":["Pole URL"],"Phone Field":["Pole telefonu"],"Textarea Field":["Pole tekstowe"],"Checkbox Field":["Pole wyboru"],"Dropdown Field":["Pole rozwijane"],"Multiple Choice Field":["Pole wyboru wielokrotnego"],"Address Field":["Pole adresu"],"Number Field":["Pole liczby"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Aby w\u0142\u0105czy\u0107 funkcj\u0119 reCAPTCHA w SureForms, w\u0142\u0105cz opcj\u0119 reCAPTCHA w ustawieniach blok\u00f3w i wybierz wersj\u0119. Dodaj tutaj tajny klucz i klucz witryny Google reCAPTCHA. reCAPTCHA zostanie dodana do Twojej strony na froncie."],"Enter your %s here":["Wprowad\u017a tutaj sw\u00f3j %s"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Aby w\u0142\u0105czy\u0107 hCAPTCHA, dodaj klucz witryny i klucz tajny. Skonfiguruj te ustawienia w poszczeg\u00f3lnych formularzach."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Aby w\u0142\u0105czy\u0107 Cloudflare Turnstile, dodaj klucz witryny i klucz tajny. Skonfiguruj te ustawienia w ramach poszczeg\u00f3lnego formularza."],"Save":["Zapisz"],"Anonymous Analytics":["Anonimowa Analiza"],"Learn More":["Dowiedz si\u0119 wi\u0119cej"],"Admin Notification":["Powiadomienie administratora"],"Enable Admin Notification":["W\u0142\u0105cz powiadomienia administratora"],"Admin notifications keep you informed about new form entries since your last visit.":["Powiadomienia administracyjne informuj\u0105 Ci\u0119 o nowych wpisach formularza od Twojej ostatniej wizyty."],"Continue":["Kontynuuj"],"Get Started":["Rozpocznij"],"Integration":["Integracja"],"Connect Native Integrations with SureForms":["Po\u0142\u0105cz natywne integracje z SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Odblokuj pot\u0119\u017cne integracje w planie Premium, aby zautomatyzowa\u0107 swoje przep\u0142ywy pracy i po\u0142\u0105czy\u0107 SureForms bezpo\u015brednio z ulubionymi narz\u0119dziami."],"Send form submissions straight to CRMs, email, and marketing platforms":["Wysy\u0142aj zg\u0142oszenia formularzy bezpo\u015brednio do CRM, e-maili i platform marketingowych"],"Automate repetitive tasks with seamless data syncing":["Zautomatyzuj powtarzalne zadania dzi\u0119ki p\u0142ynnej synchronizacji danych"],"Access exclusive native integrations for faster workflows":["Uzyskaj dost\u0119p do ekskluzywnych natywnych integracji dla szybszych przep\u0142yw\u00f3w pracy"],"Payments":["P\u0142atno\u015bci"],"Stripe account disconnected successfully.":["Konto Stripe zosta\u0142o pomy\u015blnie od\u0142\u0105czone."],"Failed to create webhook.":["Nie uda\u0142o si\u0119 utworzy\u0107 webhooka."],"Failed to connect to Stripe.":["Nie uda\u0142o si\u0119 po\u0142\u0105czy\u0107 ze Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Baza wiedzy"],"What\u2019s New":["Co nowego"],"delete":["usu\u0144"],"Please type \"%s\" in the input box":["Prosz\u0119 wpisa\u0107 \"%s\" w polu wej\u015bciowym"],"To confirm, type \"%s\" in the box below:":["Aby potwierdzi\u0107, wpisz \"%s\" w polu poni\u017cej:"],"Type \"%s\"":["Wpisz \"%s\""],"Go to OttoKit Settings":["Przejd\u017a do ustawie\u0144 OttoKit"],"USD - US Dollar":["USD - Dolar ameryka\u0144ski"],"Payment Mode":["Tryb p\u0142atno\u015bci"],"Test Mode":["Tryb testowy"],"Live Mode":["Tryb na \u017cywo"],"General Settings":["Ustawienia og\u00f3lne"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Skonfiguruj podsumowania e-mail, alerty administratora i preferencje danych, aby \u0142atwo zarz\u0105dza\u0107 swoimi formularzami."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Dostosuj domy\u015blne komunikaty o b\u0142\u0119dach wy\u015bwietlane, gdy u\u017cytkownicy przesy\u0142aj\u0105 nieprawid\u0142owe lub niekompletne wpisy formularza."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["W\u0142\u0105cz ochron\u0119 przed spamem dla swoich formularzy, korzystaj\u0105c z us\u0142ug CAPTCHA lub zabezpiecze\u0144 typu honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Po\u0142\u0105cz i zarz\u0105dzaj swoimi bramkami p\u0142atno\u015bci, aby bezpiecznie akceptowa\u0107 transakcje za po\u015brednictwem swoich formularzy."],"1% transaction and payment gateway fees apply.":["Obowi\u0105zuje 1% op\u0142ata transakcyjna i op\u0142ata za bramk\u0119 p\u0142atnicz\u0105."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Obowi\u0105zuj\u0105 op\u0142aty za transakcje i bramki p\u0142atnicze w wysoko\u015bci 2,9%. Aktywuj licencj\u0119, aby zmniejszy\u0107 op\u0142aty transakcyjne."],"2.9% transaction and payment gateway fees apply.":["Obowi\u0105zuj\u0105 op\u0142aty za transakcje i bramki p\u0142atnicze w wysoko\u015bci 2,9%."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Prosz\u0119 odwiedzi\u0107 %1$s, usun\u0105\u0107 nieu\u017cywany webhook, a nast\u0119pnie klikn\u0105\u0107 poni\u017cej, aby spr\u00f3bowa\u0107 ponownie."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms nie m\u00f3g\u0142 utworzy\u0107 webhooka, poniewa\u017c na Twoim koncie Stripe sko\u0144czy\u0142y si\u0119 darmowe sloty. Webhooki s\u0105 potrzebne do otrzymywania aktualizacji o p\u0142atno\u015bciach."],"Stripe Dashboard":["Pulpit Stripe"],"Creating\u2026":["Tworzenie\u2026"],"Create Webhook":["Utw\u00f3rz Webhook"],"Successfully connected to Stripe!":["Pomy\u015blnie po\u0142\u0105czono ze Stripe!"],"Invalid response from server. Please try again.":["Nieprawid\u0142owa odpowied\u017a z serwera. Prosz\u0119 spr\u00f3bowa\u0107 ponownie."],"Failed to disconnect Stripe account.":["Nie uda\u0142o si\u0119 od\u0142\u0105czy\u0107 konta Stripe."],"Webhook created successfully!":["Webhook utworzony pomy\u015blnie!"],"Select Currency":["Wybierz walut\u0119"],"Select the default currency for payment forms.":["Wybierz domy\u015bln\u0105 walut\u0119 dla formularzy p\u0142atno\u015bci."],"Connection Status":["Status po\u0142\u0105czenia"],"Disconnect Stripe Account":["Od\u0142\u0105cz konto Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Czy na pewno chcesz od\u0142\u0105czy\u0107 swoje konto Stripe? Spowoduje to zatrzymanie wszystkich aktywnych p\u0142atno\u015bci, subskrypcji i transakcji formularzy powi\u0105zanych z tym kontem."],"Disconnect":["Roz\u0142\u0105cz"],"Disconnecting\u2026":["Roz\u0142\u0105czanie\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook zosta\u0142 pomy\u015blnie po\u0142\u0105czony, wszystkie zdarzenia Stripe s\u0105 \u015bledzone."],"Connect your Stripe account to start accepting payments through your forms.":["Po\u0142\u0105cz swoje konto Stripe, aby zacz\u0105\u0107 przyjmowa\u0107 p\u0142atno\u015bci za po\u015brednictwem formularzy."],"Connect to Stripe":["Po\u0142\u0105cz z Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Bezpiecznie po\u0142\u0105cz si\u0119 ze Stripe kilkoma klikni\u0119ciami, aby zacz\u0105\u0107 akceptowa\u0107 p\u0142atno\u015bci!"],"Payment Methods":["Metody p\u0142atno\u015bci"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Tryb testowy pozwala na przetwarzanie p\u0142atno\u015bci bez rzeczywistych op\u0142at. Prze\u0142\u0105cz si\u0119 na tryb na \u017cywo, aby dokonywa\u0107 rzeczywistych transakcji."],"General Payment Settings":["Og\u00f3lne ustawienia p\u0142atno\u015bci"],"These settings apply to all payment gateways.":["Te ustawienia maj\u0105 zastosowanie do wszystkich bramek p\u0142atniczych."],"Stripe Settings":["Ustawienia Stripe"],"Left ($100)":["Lewo ($100)"],"Right (100$)":["Prawo (100$)"],"Left Space ($ 100)":["Wolna przestrze\u0144 ($ 100)"],"Right Space (100 $)":["Prawe Miejsce (100 $)"],"Currency Sign Position":["Pozycja znaku waluty"],"Select the position of the currency symbol relative to the amount.":["Wybierz pozycj\u0119 symbolu waluty wzgl\u0119dem kwoty."],"Learn":["Ucz si\u0119"],"Enable email summaries":["W\u0142\u0105cz podsumowania e-mail"],"Enable IP logging":["W\u0142\u0105cz logowanie IP"],"Turn on Admin Notification from here.":["W\u0142\u0105cz powiadomienia administratora st\u0105d."],"Send entries to 100+ popular apps.":["Wy\u015blij wpisy do ponad 100 popularnych aplikacji."],"Build automated workflows that run instantly.":["Tw\u00f3rz zautomatyzowane przep\u0142ywy pracy, kt\u00f3re dzia\u0142aj\u0105 natychmiast."],"Create custom app integrations using our Custom App feature.":["Tw\u00f3rz niestandardowe integracje aplikacji za pomoc\u0105 funkcji Niestandardowa Aplikacja."],"Keep your tools in sync automatically.":["Utrzymuj swoje narz\u0119dzia w synchronizacji automatycznie."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["To zainstaluje i aktywuje OttoKit na Twojej stronie WordPress, aby w\u0142\u0105czy\u0107 funkcje automatyzacji."],"Automate Your Forms with OttoKit":["Zautomatyzuj swoje formularze za pomoc\u0105 OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ka\u017cde przes\u0142anie formularza powinno wywo\u0142a\u0107 jak\u0105\u015b akcj\u0119 \u2014 alert w Slacku, lead w CRM, e-mail z przypomnieniem lub nowy wiersz w Arkuszach Google."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Skonfiguruj uprawnienia klienta AI i ustawienia serwera MCP."],"View documentation":["Wy\u015bwietl dokumentacj\u0119"],"Copy to clipboard":["Kopiuj do schowka"],"Claude Desktop":["Pulpit Claude"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) lub %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Kod Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (projekt) lub ~\/.claude.json (globalny)"],"Cursor":["Kursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (projekt) lub settings.json > mcp.servers (globalne)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml lub config.json"],"Your client's MCP configuration file":["Plik konfiguracyjny MCP Twojego klienta"],"Connect Your AI Client":["Po\u0142\u0105cz swojego klienta AI"],"AI Client":["Klient AI"],"Create an Application Password \u2014 ":["Utw\u00f3rz has\u0142o aplikacji \u2014"],"Open Application Passwords":["Otw\u00f3rz has\u0142a aplikacji"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Lub u\u017cyj tego polecenia CLI, aby szybko doda\u0107 serwer (nadal b\u0119dziesz musia\u0142 ustawi\u0107 zmienne \u015brodowiskowe):"],"Copy the JSON config below into: ":["Skopiuj poni\u017csz\u0105 konfiguracj\u0119 JSON do:"],"Replace \"your-application-password\" with the password from Step 1.":["Zast\u0105p \"your-application-password\" has\u0142em z Kroku 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 punkt ko\u0144cowy MCP Twojej witryny. WP_API_USERNAME \u2014 Twoja nazwa u\u017cytkownika WordPress. WP_API_PASSWORD \u2014 has\u0142o aplikacji, kt\u00f3re wygenerowa\u0142e\u015b."],"View setup docs":["Wy\u015bwietl dokumentacj\u0119 konfiguracji"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Wtyczka MCP Adapter jest zainstalowana, ale nieaktywna. Aktywuj j\u0105, aby skonfigurowa\u0107 ustawienia MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Wtyczka MCP Adapter jest wymagana do po\u0142\u0105czenia klient\u00f3w AI z Twoimi formularzami. Pobierz i zainstaluj j\u0105 z GitHub, a nast\u0119pnie aktywuj."],"Download the latest release from":["Pobierz najnowsz\u0105 wersj\u0119 z"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Zainstaluj wtyczk\u0119, przechodz\u0105c do Wtyczki > Dodaj now\u0105 wtyczk\u0119 > Prze\u015blij wtyczk\u0119."],"Activate the MCP Adapter plugin.":["Aktywuj wtyczk\u0119 MCP Adapter."],"Activating\u2026":["Aktywowanie\u2026"],"Activate MCP Adapter":["Aktywuj adapter MCP"],"Download MCP Adapter":["Pobierz adapter MCP"],"Experimental":["Eksperymentalny"],"Enable Abilities":["W\u0142\u0105cz umiej\u0119tno\u015bci"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Zarejestruj mo\u017cliwo\u015bci SureForms w API Umiej\u0119tno\u015bci WordPress. Po w\u0142\u0105czeniu klienci AI mog\u0105 wy\u015bwietla\u0107, czyta\u0107, tworzy\u0107, edytowa\u0107 i usuwa\u0107 Twoje formularze i wpisy. Po wy\u0142\u0105czeniu \u017cadne umiej\u0119tno\u015bci nie s\u0105 rejestrowane i klienci AI nie mog\u0105 wykonywa\u0107 \u017cadnych dzia\u0142a\u0144 na Twoich formularzach."],"Abilities API \u2014 Edit":["API umiej\u0119tno\u015bci \u2014 Edytuj"],"Enable Edit Abilities":["W\u0142\u0105cz mo\u017cliwo\u015bci edycji"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Po w\u0142\u0105czeniu klienci AI mog\u0105 tworzy\u0107 nowe formularze, aktualizowa\u0107 tytu\u0142y formularzy, pola i ustawienia, duplikowa\u0107 formularze oraz modyfikowa\u0107 statusy wpis\u00f3w. Po wy\u0142\u0105czeniu te mo\u017cliwo\u015bci s\u0105 wyrejestrowane i klienci AI mog\u0105 jedynie odczytywa\u0107 Twoje dane."],"Abilities API \u2014 Delete":["API umiej\u0119tno\u015bci \u2014 Usu\u0144"],"Enable Delete Abilities":["W\u0142\u0105cz mo\u017cliwo\u015b\u0107 usuwania"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Po w\u0142\u0105czeniu klienci AI mog\u0105 trwale usuwa\u0107 formularze i wpisy. Usuni\u0119tych danych nie mo\u017cna odzyska\u0107. Po wy\u0142\u0105czeniu, mo\u017cliwo\u015bci usuwania s\u0105 wyrejestrowane i klienci AI nie mog\u0105 usuwa\u0107 \u017cadnych danych."],"MCP Server":["Serwer MCP"],"Enable MCP Server":["W\u0142\u0105cz serwer MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Tworzy dedykowany punkt ko\u0144cowy SureForms MCP, do kt\u00f3rego mog\u0105 si\u0119 pod\u0142\u0105czy\u0107 klienci AI, tacy jak Claude. Gdy jest wy\u0142\u0105czony, punkt ko\u0144cowy jest usuwany i zewn\u0119trzni klienci AI nie mog\u0105 odkrywa\u0107 ani wywo\u0142ywa\u0107 \u017cadnych funkcji SureForms."],"Learn more":["Dowiedz si\u0119 wi\u0119cej"],"MCP Adapter Required":["Wymagany adapter MCP"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Skonfiguruj klucz API Google Maps do autouzupe\u0142niania adres\u00f3w i podgl\u0105du mapy."],"Help shape the future of SureForms":["Pom\u00f3\u017c kszta\u0142towa\u0107 przysz\u0142o\u015b\u0107 SureForms"],"Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ":["Podziel si\u0119, jak u\u017cywasz wtyczki, aby\u015bmy mogli tworzy\u0107 funkcje, kt\u00f3re maj\u0105 znaczenie, szybciej naprawia\u0107 problemy i podejmowa\u0107 m\u0105drzejsze decyzje."],"Enable Google Address Autocomplete":["W\u0142\u0105cz autouzupe\u0142nianie adres\u00f3w Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Uaktualnij do planu SureForms Business, aby doda\u0107 autouzupe\u0142nianie adres\u00f3w zasilane przez Google z interaktywnym podgl\u0105dem mapy do swoich formularzy."],"Auto-suggest addresses as users type for faster, error-free submissions":["Automatyczne sugerowanie adres\u00f3w podczas pisania przez u\u017cytkownik\u00f3w dla szybszych, bezb\u0142\u0119dnych zg\u0142osze\u0144"],"Show an interactive map preview with draggable pin for precise locations":["Poka\u017c interaktywny podgl\u0105d mapy z przeci\u0105galnym pinezk\u0105 dla precyzyjnych lokalizacji"],"Automatically populate address fields like city, state, and postal code":["Automatycznie wype\u0142niaj pola adresowe, takie jak miasto, wojew\u00f3dztwo i kod pocztowy"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Panel sterowania"],"Settings":["Ustawienia"],"Entries":["Wpisy"],"Activated":["Aktywowany"],"Activate":["Aktywuj"],"Monday":["Poniedzia\u0142ek"],"Forms":["Formularze"],"New Form Submission - %s":["Nowe przes\u0142anie formularza - %s"],"GitHub":["GitHub"],"(no title)":["(brak tytu\u0142u)"],"General":["Og\u00f3lny"],"No tags available":["Brak dost\u0119pnych tag\u00f3w"],"Generic tags":["Og\u00f3lne tagi"],"Other":["Inne"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"Install":["Zainstaluj"],"Plugin Installation failed, Please try again later.":["Instalacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Plugin activation failed, Please try again later.":["Aktywacja wtyczki nie powiod\u0142a si\u0119, spr\u00f3buj ponownie p\u00f3\u017aniej."],"Integrations":["Integracje"],"What's New?":["Co nowego?"],"Core":["Rdze\u0144"],"Unlicensed":["Bez licencji"],"Connecting\u2026":["\u0141\u0105czenie\u2026"],"Install & Activate":["Zainstaluj i aktywuj"],"Compliance Settings":["Ustawienia zgodno\u015bci"],"Enable GDPR Compliance":["W\u0142\u0105cz zgodno\u015b\u0107 z RODO"],"Never store entry data after form submission":["Nigdy nie przechowuj danych wej\u015bciowych po przes\u0142aniu formularza"],"When enabled this form will never store Entries.":["Gdy jest w\u0142\u0105czony, ten formularz nigdy nie b\u0119dzie przechowywa\u0142 wpis\u00f3w."],"Automatically delete entries":["Automatycznie usu\u0144 wpisy"],"When enabled this form will automatically delete entries after a certain period of time.":["Po w\u0142\u0105czeniu ten formularz automatycznie usunie wpisy po okre\u015blonym czasie."],"Entries older than the days set will be deleted automatically.":["Wpisy starsze ni\u017c ustawione dni zostan\u0105 usuni\u0119te automatycznie."],"Visual":["Wizualny"],"HTML":["HTML"],"All Data":["Wszystkie dane"],"Add Shortcode":["Dodaj shortcode"],"Form input tags":["Tagi wej\u015bciowe formularza"],"Comma separated values are also accepted.":["Warto\u015bci oddzielone przecinkami s\u0105 r\u00f3wnie\u017c akceptowane."],"Email Notification":["Powiadomienie e-mail"],"Name":["Imi\u0119"],"Send Email To":["Wy\u015blij e-mail do"],"Subject":["Temat"],"CC":["DW"],"BCC":["UDW"],"Reply To":["Odpowiedz do"],"Add Key":["Dodaj klucz"],"Add Value":["Dodaj warto\u015b\u0107"],"Add":["Dodaj"],"Confirmation Message":["Wiadomo\u015b\u0107 potwierdzaj\u0105ca"],"After Form Submission":["Po przes\u0142aniu formularza"],"Hide Form":["Ukryj formularz"],"Reset Form":["Zresetuj formularz"],"Custom URL":["Niestandardowy URL"],"Add Query Parameters":["Dodaj parametry zapytania"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Wybierz, je\u015bli chcesz doda\u0107 pary klucz-warto\u015b\u0107 dla p\u00f3l formularza do uwzgl\u0119dnienia w parametrach zapytania"],"Query Parameters":["Parametry zapytania"],"Success Message":["Komunikat o sukcesie"],"Redirect":["Przekieruj"],"Redirect to":["Przekieruj do"],"Page":["Strona"],"Form Confirmation":["Potwierdzenie formularza"],"Confirmation Type":["Typ potwierdzenia"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Niewidoczna"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Walidacje"],"Spam Protection":["Ochrona przed spamem"],"Email Summaries":["Podsumowania e-maili"],"Tuesday":["Wtorek"],"Wednesday":["\u015aroda"],"Thursday":["Czwartek"],"Friday":["Pi\u0105tek"],"Saturday":["Sobota"],"Sunday":["Niedziela"],"Test Email":["Testowy email"],"Schedule Reports":["Zaplanuj raporty"],"IP Logging":["Rejestrowanie IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Je\u015bli ta opcja jest w\u0142\u0105czona, adres IP u\u017cytkownika zostanie zapisany wraz z danymi formularza"],"Confirmation Email Mismatch Message":["Wiadomo\u015b\u0107 o niezgodno\u015bci e-maila potwierdzaj\u0105cego"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s oznacza minimaln\u0105 warto\u015b\u0107 wej\u015bciow\u0105. Na przyk\u0142ad: \"Minimalna warto\u015b\u0107 to 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s oznacza maksymaln\u0105 warto\u015b\u0107 wej\u015bciow\u0105. Na przyk\u0142ad: \"Maksymalna warto\u015b\u0107 to 100.\""],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s oznacza minimaln\u0105 liczb\u0119 wymaganych wybor\u00f3w. Na przyk\u0142ad: \u201eWymagane s\u0105 co najmniej 2 wybory\u201d."],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s oznacza maksymaln\u0105 liczb\u0119 dozwolonych wybor\u00f3w. Na przyk\u0142ad: \u201eDozwolone s\u0105 maksymalnie 4 wybory.\u201d"],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s oznacza minimaln\u0105 liczb\u0119 potrzebnych wybor\u00f3w. Na przyk\u0142ad: \u201eWymagany jest co najmniej 1 wyb\u00f3r.\u201d"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s oznacza maksymaln\u0105 liczb\u0119 dozwolonych wybor\u00f3w. Na przyk\u0142ad: \u201eDozwolone s\u0105 maksymalnie 3 wybory\u201d."]," Error Message":["Komunikat o b\u0142\u0119dzie"],"Auto":["Samoch\u00f3d"],"Light":["\u015awiat\u0142o"],"Dark":["Ciemny"],"Turnstile":["Bramka"],"Honeypot":["Pu\u0142apka"],"Get Keys":["Pobierz klucze"],"Documentation":["Dokumentacja"],"Site Key":["Klucz strony"],"Secret Key":["Klucz tajny"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Tryb wygl\u0105du"],"Enable Honeypot Security":["W\u0142\u0105cz zabezpieczenie Honeypot"],"Enable Honeypot Security for better spam protection":["W\u0142\u0105cz Honeypot Security dla lepszej ochrony przed spamem"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Po\u0142\u0105cz si\u0119 z OttoKit"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Bie\u017c\u0105cy adres \u201eOd e-mail\u201d nie pasuje do nazwy domeny Twojej strony internetowej (%1$s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami b\u0119d\u0105 blokowane lub oznaczane jako spam. Alternatywnie, spr\u00f3buj u\u017cy\u0107 adresu Od, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Obecny adres \u201eOd e-mail\u201d nie pasuje do nazwy domeny Twojej strony internetowej (%s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam."],"We strongly recommend that you install the free ":["Zalecamy zdecydowanie zainstalowanie darmowego"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["wtyczka! Kreator konfiguracji u\u0142atwia napraw\u0119 Twoich e-maili."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternatywnie spr\u00f3buj u\u017cy\u0107 adresu nadawcy, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Prosz\u0119 wprowadzi\u0107 prawid\u0142owy adres e-mail. Powiadomienia nie b\u0119d\u0105 wysy\u0142ane, je\u015bli pole nie zostanie wype\u0142nione poprawnie."],"From Name":["Od Nazwa"],"From Email":["Z e-maila"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["Bie\u017c\u0105cy adres \u201eOd e-mail\u201d mo\u017ce nie pasowa\u0107 do nazwy domeny Twojej strony internetowej (%1$s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam. Alternatywnie, spr\u00f3buj u\u017cy\u0107 adresu Od, kt\u00f3ry pasuje do domeny Twojej strony internetowej (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["Obecny adres \u201eOd e-mail\u201d mo\u017ce nie pasowa\u0107 do nazwy domeny Twojej strony internetowej (%s). Mo\u017ce to spowodowa\u0107, \u017ce Twoje e-maile z powiadomieniami zostan\u0105 zablokowane lub oznaczone jako spam."],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Gotowy, aby wyj\u015b\u0107 poza darmowy plan?"],"Upgrade now":["Zaktualizuj teraz"],"and unlock the full power of SureForms!":["i odblokuj pe\u0142n\u0105 moc SureForms!"],"Upgrade SureForms":["Uaktualnij SureForms"],"Upgrade Now":["Zaktualizuj teraz"],"Entries older than the selected days will be deleted.":["Wpisy starsze ni\u017c wybrane dni zostan\u0105 usuni\u0119te."],"Entries Time Period":["Okres czasu wpis\u00f3w"],"Notifications can use only one From Email so please enter a single address.":["Powiadomienia mog\u0105 u\u017cywa\u0107 tylko jednego adresu e-mail nadawcy, wi\u0119c prosz\u0119 poda\u0107 jeden adres."],"Select Page to redirect":["Wybierz stron\u0119 do przekierowania"],"Search for a page":["Wyszukaj stron\u0119"],"Select a page":["Wybierz stron\u0119"],"Form Validation":["Walidacja formularza"],"Required Error Messages":["Wymagane komunikaty o b\u0142\u0119dach"],"Other Error Messages":["Inne komunikaty o b\u0142\u0119dach"],"Input Field Unique":["Pole wej\u015bciowe unikalne"],"Email Field Unique":["Pole e-mail musi by\u0107 unikalne"],"Invalid URL":["Nieprawid\u0142owy URL"],"Phone Field Unique":["Pole telefonu unikalne"],"Invalid Field Number Block":["Nieprawid\u0142owy blok numeru pola"],"Invalid Email":["Nieprawid\u0142owy adres e-mail"],"Number Minimum Value":["Minimalna warto\u015b\u0107 liczby"],"Number Maximum Value":["Maksymalna warto\u015b\u0107 liczby"],"Dropdown Minimum Selections":["Minimalna liczba wybor\u00f3w w rozwijanym menu"],"Dropdown Maximum Selections":["Maksymalna liczba wybor\u00f3w w rozwijanym menu"],"Multiple Choice Minimum Selections":["Minimalna liczba wybor\u00f3w w pytaniach wielokrotnego wyboru"],"Multiple Choice Maximum Selections":["Wielokrotny wyb\u00f3r maksymalna liczba zaznacze\u0144"],"Input Field":["Pole wej\u015bciowe"],"Email Field":["Pole e-mail"],"URL Field":["Pole URL"],"Phone Field":["Pole telefonu"],"Textarea Field":["Pole tekstowe"],"Checkbox Field":["Pole wyboru"],"Dropdown Field":["Pole rozwijane"],"Multiple Choice Field":["Pole wyboru wielokrotnego"],"Address Field":["Pole adresu"],"Number Field":["Pole liczby"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Aby w\u0142\u0105czy\u0107 funkcj\u0119 reCAPTCHA w SureForms, w\u0142\u0105cz opcj\u0119 reCAPTCHA w ustawieniach blok\u00f3w i wybierz wersj\u0119. Dodaj tutaj tajny klucz i klucz witryny Google reCAPTCHA. reCAPTCHA zostanie dodana do Twojej strony na froncie."],"Enter your %s here":["Wprowad\u017a tutaj sw\u00f3j %s"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Aby w\u0142\u0105czy\u0107 hCAPTCHA, dodaj klucz witryny i klucz tajny. Skonfiguruj te ustawienia w poszczeg\u00f3lnych formularzach."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Aby w\u0142\u0105czy\u0107 Cloudflare Turnstile, dodaj klucz witryny i klucz tajny. Skonfiguruj te ustawienia w ramach poszczeg\u00f3lnego formularza."],"Save":["Zapisz"],"Anonymous Analytics":["Anonimowa Analiza"],"Learn More":["Dowiedz si\u0119 wi\u0119cej"],"Admin Notification":["Powiadomienie administratora"],"Enable Admin Notification":["W\u0142\u0105cz powiadomienia administratora"],"Admin notifications keep you informed about new form entries since your last visit.":["Powiadomienia administracyjne informuj\u0105 Ci\u0119 o nowych wpisach formularza od Twojej ostatniej wizyty."],"Continue":["Kontynuuj"],"Maximum Number of Entries":["Maksymalna liczba wpis\u00f3w"],"Maximum Entries":["Maksymalna liczba wpis\u00f3w"],"Response Description After Maximum Entries":["Opis odpowiedzi po maksymalnej liczbie wpis\u00f3w"],"Get Started":["Rozpocznij"],"Integration":["Integracja"],"Connect Native Integrations with SureForms":["Po\u0142\u0105cz natywne integracje z SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Odblokuj pot\u0119\u017cne integracje w planie Premium, aby zautomatyzowa\u0107 swoje przep\u0142ywy pracy i po\u0142\u0105czy\u0107 SureForms bezpo\u015brednio z ulubionymi narz\u0119dziami."],"Send form submissions straight to CRMs, email, and marketing platforms":["Wysy\u0142aj zg\u0142oszenia formularzy bezpo\u015brednio do CRM, e-maili i platform marketingowych"],"Automate repetitive tasks with seamless data syncing":["Zautomatyzuj powtarzalne zadania dzi\u0119ki p\u0142ynnej synchronizacji danych"],"Access exclusive native integrations for faster workflows":["Uzyskaj dost\u0119p do ekskluzywnych natywnych integracji dla szybszych przep\u0142yw\u00f3w pracy"],"Expected format for emails - email@sureforms.com or John Doe ":["Oczekiwany format dla e-maili - email@sureforms.com lub John Doe "],"Payments":["P\u0142atno\u015bci"],"Stripe account disconnected successfully.":["Konto Stripe zosta\u0142o pomy\u015blnie od\u0142\u0105czone."],"Failed to create webhook.":["Nie uda\u0142o si\u0119 utworzy\u0107 webhooka."],"Failed to connect to Stripe.":["Nie uda\u0142o si\u0119 po\u0142\u0105czy\u0107 ze Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Baza wiedzy"],"What\u2019s New":["Co nowego"],"delete":["usu\u0144"],"Please type \"%s\" in the input box":["Prosz\u0119 wpisa\u0107 \"%s\" w polu wej\u015bciowym"],"To confirm, type \"%s\" in the box below:":["Aby potwierdzi\u0107, wpisz \"%s\" w polu poni\u017cej:"],"Type \"%s\"":["Wpisz \"%s\""],"Go to OttoKit Settings":["Przejd\u017a do ustawie\u0144 OttoKit"],"USD - US Dollar":["USD - Dolar ameryka\u0144ski"],"Payment Mode":["Tryb p\u0142atno\u015bci"],"Test Mode":["Tryb testowy"],"Live Mode":["Tryb na \u017cywo"],"General Settings":["Ustawienia og\u00f3lne"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Skonfiguruj podsumowania e-mail, alerty administratora i preferencje danych, aby \u0142atwo zarz\u0105dza\u0107 swoimi formularzami."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Dostosuj domy\u015blne komunikaty o b\u0142\u0119dach wy\u015bwietlane, gdy u\u017cytkownicy przesy\u0142aj\u0105 nieprawid\u0142owe lub niekompletne wpisy formularza."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["W\u0142\u0105cz ochron\u0119 przed spamem dla swoich formularzy, korzystaj\u0105c z us\u0142ug CAPTCHA lub zabezpiecze\u0144 typu honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Po\u0142\u0105cz i zarz\u0105dzaj swoimi bramkami p\u0142atno\u015bci, aby bezpiecznie akceptowa\u0107 transakcje za po\u015brednictwem swoich formularzy."],"1% transaction and payment gateway fees apply.":["Obowi\u0105zuje 1% op\u0142ata transakcyjna i op\u0142ata za bramk\u0119 p\u0142atnicz\u0105."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Obowi\u0105zuj\u0105 op\u0142aty za transakcje i bramki p\u0142atnicze w wysoko\u015bci 2,9%. Aktywuj licencj\u0119, aby zmniejszy\u0107 op\u0142aty transakcyjne."],"2.9% transaction and payment gateway fees apply.":["Obowi\u0105zuj\u0105 op\u0142aty za transakcje i bramki p\u0142atnicze w wysoko\u015bci 2,9%."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Prosz\u0119 odwiedzi\u0107 %1$s, usun\u0105\u0107 nieu\u017cywany webhook, a nast\u0119pnie klikn\u0105\u0107 poni\u017cej, aby spr\u00f3bowa\u0107 ponownie."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms nie m\u00f3g\u0142 utworzy\u0107 webhooka, poniewa\u017c na Twoim koncie Stripe sko\u0144czy\u0142y si\u0119 darmowe sloty. Webhooki s\u0105 potrzebne do otrzymywania aktualizacji o p\u0142atno\u015bciach."],"Stripe Dashboard":["Pulpit Stripe"],"Creating\u2026":["Tworzenie\u2026"],"Create Webhook":["Utw\u00f3rz Webhook"],"Successfully connected to Stripe!":["Pomy\u015blnie po\u0142\u0105czono ze Stripe!"],"Invalid response from server. Please try again.":["Nieprawid\u0142owa odpowied\u017a z serwera. Prosz\u0119 spr\u00f3bowa\u0107 ponownie."],"Failed to disconnect Stripe account.":["Nie uda\u0142o si\u0119 od\u0142\u0105czy\u0107 konta Stripe."],"Webhook created successfully!":["Webhook utworzony pomy\u015blnie!"],"Select Currency":["Wybierz walut\u0119"],"Select the default currency for payment forms.":["Wybierz domy\u015bln\u0105 walut\u0119 dla formularzy p\u0142atno\u015bci."],"Connection Status":["Status po\u0142\u0105czenia"],"Disconnect Stripe Account":["Od\u0142\u0105cz konto Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Czy na pewno chcesz od\u0142\u0105czy\u0107 swoje konto Stripe? Spowoduje to zatrzymanie wszystkich aktywnych p\u0142atno\u015bci, subskrypcji i transakcji formularzy powi\u0105zanych z tym kontem."],"Disconnect":["Roz\u0142\u0105cz"],"Disconnecting\u2026":["Roz\u0142\u0105czanie\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook zosta\u0142 pomy\u015blnie po\u0142\u0105czony, wszystkie zdarzenia Stripe s\u0105 \u015bledzone."],"Connect your Stripe account to start accepting payments through your forms.":["Po\u0142\u0105cz swoje konto Stripe, aby zacz\u0105\u0107 przyjmowa\u0107 p\u0142atno\u015bci za po\u015brednictwem formularzy."],"Connect to Stripe":["Po\u0142\u0105cz z Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Bezpiecznie po\u0142\u0105cz si\u0119 ze Stripe kilkoma klikni\u0119ciami, aby zacz\u0105\u0107 akceptowa\u0107 p\u0142atno\u015bci!"],"Set the total number of submissions allowed for this form.":["Ustaw ca\u0142kowit\u0105 liczb\u0119 dozwolonych zg\u0142osze\u0144 dla tego formularza."],"Payment Methods":["Metody p\u0142atno\u015bci"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["Tryb testowy pozwala na przetwarzanie p\u0142atno\u015bci bez rzeczywistych op\u0142at. Prze\u0142\u0105cz si\u0119 na tryb na \u017cywo, aby dokonywa\u0107 rzeczywistych transakcji."],"General Payment Settings":["Og\u00f3lne ustawienia p\u0142atno\u015bci"],"These settings apply to all payment gateways.":["Te ustawienia maj\u0105 zastosowanie do wszystkich bramek p\u0142atniczych."],"Stripe Settings":["Ustawienia Stripe"],"Left ($100)":["Lewo ($100)"],"Right (100$)":["Prawo (100$)"],"Left Space ($ 100)":["Wolna przestrze\u0144 ($ 100)"],"Right Space (100 $)":["Prawe Miejsce (100 $)"],"Currency Sign Position":["Pozycja znaku waluty"],"Select the position of the currency symbol relative to the amount.":["Wybierz pozycj\u0119 symbolu waluty wzgl\u0119dem kwoty."],"Learn":["Ucz si\u0119"],"Enable email summaries":["W\u0142\u0105cz podsumowania e-mail"],"Enable IP logging":["W\u0142\u0105cz logowanie IP"],"Turn on Admin Notification from here.":["W\u0142\u0105cz powiadomienia administratora st\u0105d."],"Send entries to 100+ popular apps.":["Wy\u015blij wpisy do ponad 100 popularnych aplikacji."],"Build automated workflows that run instantly.":["Tw\u00f3rz zautomatyzowane przep\u0142ywy pracy, kt\u00f3re dzia\u0142aj\u0105 natychmiast."],"Create custom app integrations using our Custom App feature.":["Tw\u00f3rz niestandardowe integracje aplikacji za pomoc\u0105 funkcji Niestandardowa Aplikacja."],"Keep your tools in sync automatically.":["Utrzymuj swoje narz\u0119dzia w synchronizacji automatycznie."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["To zainstaluje i aktywuje OttoKit na Twojej stronie WordPress, aby w\u0142\u0105czy\u0107 funkcje automatyzacji."],"Automate Your Forms with OttoKit":["Zautomatyzuj swoje formularze za pomoc\u0105 OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Ka\u017cde przes\u0142anie formularza powinno wywo\u0142a\u0107 jak\u0105\u015b akcj\u0119 \u2014 alert w Slacku, lead w CRM, e-mail z przypomnieniem lub nowy wiersz w Arkuszach Google."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Skonfiguruj uprawnienia klienta AI i ustawienia serwera MCP."],"View documentation":["Wy\u015bwietl dokumentacj\u0119"],"Copy to clipboard":["Kopiuj do schowka"],"Claude Desktop":["Pulpit Claude"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) lub %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["Kod Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (projekt) lub ~\/.claude.json (globalny)"],"Cursor":["Kursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (projekt) lub settings.json > mcp.servers (globalne)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml lub config.json"],"Your client's MCP configuration file":["Plik konfiguracyjny MCP Twojego klienta"],"Connect Your AI Client":["Po\u0142\u0105cz swojego klienta AI"],"AI Client":["Klient AI"],"Create an Application Password \u2014 ":["Utw\u00f3rz has\u0142o aplikacji \u2014"],"Open Application Passwords":["Otw\u00f3rz has\u0142a aplikacji"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Lub u\u017cyj tego polecenia CLI, aby szybko doda\u0107 serwer (nadal b\u0119dziesz musia\u0142 ustawi\u0107 zmienne \u015brodowiskowe):"],"Copy the JSON config below into: ":["Skopiuj poni\u017csz\u0105 konfiguracj\u0119 JSON do:"],"Replace \"your-application-password\" with the password from Step 1.":["Zast\u0105p \"your-application-password\" has\u0142em z Kroku 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 punkt ko\u0144cowy MCP Twojej witryny. WP_API_USERNAME \u2014 Twoja nazwa u\u017cytkownika WordPress. WP_API_PASSWORD \u2014 has\u0142o aplikacji, kt\u00f3re wygenerowa\u0142e\u015b."],"View setup docs":["Wy\u015bwietl dokumentacj\u0119 konfiguracji"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["Wtyczka MCP Adapter jest zainstalowana, ale nieaktywna. Aktywuj j\u0105, aby skonfigurowa\u0107 ustawienia MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["Wtyczka MCP Adapter jest wymagana do po\u0142\u0105czenia klient\u00f3w AI z Twoimi formularzami. Pobierz i zainstaluj j\u0105 z GitHub, a nast\u0119pnie aktywuj."],"Download the latest release from":["Pobierz najnowsz\u0105 wersj\u0119 z"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Zainstaluj wtyczk\u0119, przechodz\u0105c do Wtyczki > Dodaj now\u0105 wtyczk\u0119 > Prze\u015blij wtyczk\u0119."],"Activate the MCP Adapter plugin.":["Aktywuj wtyczk\u0119 MCP Adapter."],"Activating\u2026":["Aktywowanie\u2026"],"Activate MCP Adapter":["Aktywuj adapter MCP"],"Download MCP Adapter":["Pobierz adapter MCP"],"Experimental":["Eksperymentalny"],"Enable Abilities":["W\u0142\u0105cz umiej\u0119tno\u015bci"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Zarejestruj mo\u017cliwo\u015bci SureForms w API Umiej\u0119tno\u015bci WordPress. Po w\u0142\u0105czeniu klienci AI mog\u0105 wy\u015bwietla\u0107, czyta\u0107, tworzy\u0107, edytowa\u0107 i usuwa\u0107 Twoje formularze i wpisy. Po wy\u0142\u0105czeniu \u017cadne umiej\u0119tno\u015bci nie s\u0105 rejestrowane i klienci AI nie mog\u0105 wykonywa\u0107 \u017cadnych dzia\u0142a\u0144 na Twoich formularzach."],"Abilities API \u2014 Edit":["API umiej\u0119tno\u015bci \u2014 Edytuj"],"Enable Edit Abilities":["W\u0142\u0105cz mo\u017cliwo\u015bci edycji"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Po w\u0142\u0105czeniu klienci AI mog\u0105 tworzy\u0107 nowe formularze, aktualizowa\u0107 tytu\u0142y formularzy, pola i ustawienia, duplikowa\u0107 formularze oraz modyfikowa\u0107 statusy wpis\u00f3w. Po wy\u0142\u0105czeniu te mo\u017cliwo\u015bci s\u0105 wyrejestrowane i klienci AI mog\u0105 jedynie odczytywa\u0107 Twoje dane."],"Abilities API \u2014 Delete":["API umiej\u0119tno\u015bci \u2014 Usu\u0144"],"Enable Delete Abilities":["W\u0142\u0105cz mo\u017cliwo\u015b\u0107 usuwania"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Po w\u0142\u0105czeniu klienci AI mog\u0105 trwale usuwa\u0107 formularze i wpisy. Usuni\u0119tych danych nie mo\u017cna odzyska\u0107. Po wy\u0142\u0105czeniu, mo\u017cliwo\u015bci usuwania s\u0105 wyrejestrowane i klienci AI nie mog\u0105 usuwa\u0107 \u017cadnych danych."],"MCP Server":["Serwer MCP"],"Enable MCP Server":["W\u0142\u0105cz serwer MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Tworzy dedykowany punkt ko\u0144cowy SureForms MCP, do kt\u00f3rego mog\u0105 si\u0119 pod\u0142\u0105czy\u0107 klienci AI, tacy jak Claude. Gdy jest wy\u0142\u0105czony, punkt ko\u0144cowy jest usuwany i zewn\u0119trzni klienci AI nie mog\u0105 odkrywa\u0107 ani wywo\u0142ywa\u0107 \u017cadnych funkcji SureForms."],"Learn more":["Dowiedz si\u0119 wi\u0119cej"],"MCP Adapter Required":["Wymagany adapter MCP"],"Heading 1":["Nag\u0142\u00f3wek 1"],"Heading 2":["Nag\u0142\u00f3wek 2"],"Heading 3":["Nag\u0142\u00f3wek 3"],"Heading 4":["Nag\u0142\u00f3wek 4"],"Heading 5":["Nag\u0142\u00f3wek 5"],"Heading 6":["Nag\u0142\u00f3wek 6"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Skonfiguruj klucz API Google Maps do autouzupe\u0142niania adres\u00f3w i podgl\u0105du mapy."],"Help shape the future of SureForms":["Pom\u00f3\u017c kszta\u0142towa\u0107 przysz\u0142o\u015b\u0107 SureForms"],"Enable Google Address Autocomplete":["W\u0142\u0105cz autouzupe\u0142nianie adres\u00f3w Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Uaktualnij do planu SureForms Business, aby doda\u0107 autouzupe\u0142nianie adres\u00f3w zasilane przez Google z interaktywnym podgl\u0105dem mapy do swoich formularzy."],"Auto-suggest addresses as users type for faster, error-free submissions":["Automatyczne sugerowanie adres\u00f3w podczas pisania przez u\u017cytkownik\u00f3w dla szybszych, bezb\u0142\u0119dnych zg\u0142osze\u0144"],"Show an interactive map preview with draggable pin for precise locations":["Poka\u017c interaktywny podgl\u0105d mapy z przeci\u0105galnym pinezk\u0105 dla precyzyjnych lokalizacji"],"Automatically populate address fields like city, state, and postal code":["Automatycznie wype\u0142niaj pola adresowe, takie jak miasto, wojew\u00f3dztwo i kod pocztowy"],"This form is now closed as we've received all the entries.":["Formularz jest teraz zamkni\u0119ty, poniewa\u017c otrzymali\u015bmy wszystkie zg\u0142oszenia."],"Thank you for contacting us! We will be in touch with you shortly.":["Dzi\u0119kujemy za skontaktowanie si\u0119 z nami! Wkr\u00f3tce si\u0119 z Tob\u0105 skontaktujemy."],"Saving\u2026":["Zapisywanie\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Po w\u0142\u0105czeniu tego formularza nie b\u0119d\u0105 przechowywane adres IP u\u017cytkownika, nazwa przegl\u0105darki i nazwa urz\u0105dzenia w wpisach."],"Form data":["Dane formularza"],"Unsaved changes":["Niezapisane zmiany"],"Keep editing":["Kontynuuj edytowanie"],"Global Defaults":["Domy\u015blne ustawienia globalne"],"Form Restrictions":["Ograniczenia formularza"],"Configure default settings that apply to newly created forms.":["Skonfiguruj domy\u015blne ustawienia, kt\u00f3re maj\u0105 zastosowanie do nowo utworzonych formularzy."],"Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ":["Zbieraj niesensytywne informacje z Twojej strony internetowej, takie jak wersja PHP i u\u017cywane funkcje, aby pom\u00f3c nam szybciej naprawia\u0107 b\u0142\u0119dy, podejmowa\u0107 m\u0105drzejsze decyzje i tworzy\u0107 funkcje, kt\u00f3re naprawd\u0119 maj\u0105 dla Ciebie znaczenie. "],"Failed to load pages. Please refresh and try again.":["Nie uda\u0142o si\u0119 za\u0142adowa\u0107 stron. Od\u015bwie\u017c i spr\u00f3buj ponownie."],"Failed to load settings. Please refresh and try again.":["Nie uda\u0142o si\u0119 za\u0142adowa\u0107 ustawie\u0144. Od\u015bwie\u017c stron\u0119 i spr\u00f3buj ponownie."],"Form Validation fields cannot be left blank.":["Pola walidacji formularza nie mog\u0105 pozosta\u0107 puste."],"Recipient email is required when email summaries are enabled.":["Adres e-mail odbiorcy jest wymagany, gdy w\u0142\u0105czone s\u0105 podsumowania e-mail."],"Please enter a valid recipient email.":["Prosz\u0119 wprowadzi\u0107 prawid\u0142owy adres e-mail odbiorcy."],"Settings saved.":["Ustawienia zapisane."],"Failed to save settings.":["Nie uda\u0142o si\u0119 zapisa\u0107 ustawie\u0144."],"Some settings failed to save. Please retry.":["Niekt\u00f3re ustawienia nie zosta\u0142y zapisane. Prosz\u0119 spr\u00f3bowa\u0107 ponownie."],"Some fields have unsaved changes. Discard them to continue, or stay to save your edits.":["Niekt\u00f3re pola maj\u0105 niezapisane zmiany. Odrzu\u0107 je, aby kontynuowa\u0107, lub zosta\u0144, aby zapisa\u0107 swoje edycje."],"Discard & switch":["Odrzu\u0107 i prze\u0142\u0105cz"],"Quill heading picker: default paragraph style\u0004Normal":["Normalny"]}}} \ No newline at end of file diff --git a/languages/sureforms-pl_PL-8cf77722f0a349f4f2e7f56437f288f9.json b/languages/sureforms-pl_PL-8cf77722f0a349f4f2e7f56437f288f9.json index d52ba87aa..439769040 100644 --- a/languages/sureforms-pl_PL-8cf77722f0a349f4f2e7f56437f288f9.json +++ b/languages/sureforms-pl_PL-8cf77722f0a349f4f2e7f56437f288f9.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Panel sterowania"],"Settings":["Ustawienia"],"Entries":["Wpisy"],"Move to Trash":["Przenie\u015b do kosza"],"Export":["Eksport"],"Trash":["\u015amieci"],"Published":["Opublikowano"],"Restore":["Przywr\u00f3\u0107"],"Delete Permanently":["Usu\u0144 na sta\u0142e"],"Clear Filter":["Wyczy\u015b\u0107 filtr"],"Activated":["Aktywowany"],"Edit":["Edytuj"],"Import Form":["Formularz importu"],"Add New Form":["Dodaj nowy formularz"],"View Form":["Wy\u015bwietl formularz"],"Forms":["Formularze"],"Shortcode":["Kod kr\u00f3tki"],"(no title)":["(brak tytu\u0142u)"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"What's New?":["Co nowego?"],"Core":["Rdze\u0144"],"Unlicensed":["Bez licencji"],"Page":["Strona"],"No Date":["Brak daty"],"Invalid Date":["Nieprawid\u0142owa data"],"Ready to go beyond free plan?":["Gotowy, aby wyj\u015b\u0107 poza darmowy plan?"],"Upgrade now":["Zaktualizuj teraz"],"and unlock the full power of SureForms!":["i odblokuj pe\u0142n\u0105 moc SureForms!"],"Upgrade SureForms":["Uaktualnij SureForms"],"Clear Filters":["Wyczy\u015b\u0107 filtry"],"Select Date Range":["Wybierz zakres dat"],"Actions":["Akcje"],"Duplicate":["Duplikat"],"All Forms":["Wszystkie formularze"],"Date & Time":["Data i czas"],"Payments":["P\u0142atno\u015bci"],"Knowledge Base":["Baza wiedzy"],"What\u2019s New":["Co nowego"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/yyyy - dd\/mm\/yyyy"],"out of":["z"],"No entries found":["Nie znaleziono wpis\u00f3w"],"delete":["usu\u0144"],"Please type \"%s\" in the input box":["Prosz\u0119 wpisa\u0107 \"%s\" w polu wej\u015bciowym"],"To confirm, type \"%s\" in the box below:":["Aby potwierdzi\u0107, wpisz \"%s\" w polu poni\u017cej:"],"Type \"%s\"":["Wpisz \"%s\""],"No results found":["Nie znaleziono wynik\u00f3w"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Nie znale\u017ali\u015bmy \u017cadnych rekord\u00f3w pasuj\u0105cych do Twoich filtr\u00f3w. Spr\u00f3buj dostosowa\u0107 filtry lub zresetowa\u0107 je, aby zobaczy\u0107 wszystkie wyniki."],"Please select a file to import.":["Prosz\u0119 wybra\u0107 plik do importu."],"Invalid JSON file format.":["Nieprawid\u0142owy format pliku JSON."],"Failed to read file.":["Nie uda\u0142o si\u0119 odczyta\u0107 pliku."],"Import failed.":["Import nie powi\u00f3d\u0142 si\u0119."],"An error occurred during import.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas importu."],"Import Forms":["Importuj formularze"],"Please select a valid JSON file.":["Prosz\u0119 wybra\u0107 prawid\u0142owy plik JSON."],"Drag and drop or browse files":["Przeci\u0105gnij i upu\u015b\u0107 lub przegl\u0105daj pliki"],"Importing\u2026":["Importowanie\u2026"],"Drafts":["Szkice"],"Search forms\u2026":["Wyszukaj formularze\u2026"],"No forms found":["Nie znaleziono formularzy"],"Title":["Tytu\u0142"],"Copied!":["Skopiowano!"],"Copy Shortcode":["Skopiuj kod skr\u00f3tu"],"No Forms":["Brak formularzy"],"Hi there, let's get you started":["Cze\u015b\u0107, zacznijmy."],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Wygl\u0105da na to, \u017ce nie utworzy\u0142e\u015b jeszcze \u017cadnych formularzy. Zacznij budowa\u0107 z SureForms i uruchom pot\u0119\u017cne formularze w zaledwie kilku klikni\u0119ciach."],"Design forms with our Gutenberg-native builder.":["Projektuj formularze za pomoc\u0105 naszego natywnego kreatora Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["U\u017cyj AI, aby natychmiast generowa\u0107 formularze z prostego polecenia."],"Build engaging conversational, calculation, and multi-step forms.":["Tw\u00f3rz anga\u017cuj\u0105ce formularze konwersacyjne, obliczeniowe i wieloetapowe."],"Create Form":["Utw\u00f3rz formularz"],"An error occurred while fetching forms.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas pobierania formularzy."],"%d form moved to trash.":["%d formularz przeniesiony do kosza."],"%d form restored.":["%d formularz przywr\u00f3cony."],"%d form permanently deleted.":["%d formularz zosta\u0142 trwale usuni\u0119ty."],"An error occurred while performing the action.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas wykonywania akcji."],"%d form imported successfully.":["%d formularz zaimportowany pomy\u015blnie."],"%d form will be moved to trash and can be restored later.":["%d formularz zostanie przeniesiony do kosza i mo\u017cna go p\u00f3\u017aniej przywr\u00f3ci\u0107."],"Delete Form":["Usu\u0144 formularz"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Czy na pewno chcesz trwale usun\u0105\u0107 formularz %d? Tej akcji nie mo\u017cna cofn\u0105\u0107."],"Restore Form":["Przywr\u00f3\u0107 formularz"],"%d form will be restored from trash.":["%d formularz zostanie przywr\u00f3cony z kosza."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Czy na pewno chcesz trwale usun\u0105\u0107 ten formularz? Tej akcji nie mo\u017cna cofn\u0105\u0107."],"This form will be moved to trash and can be restored later.":["Ten formularz zostanie przeniesiony do kosza i mo\u017cna go p\u00f3\u017aniej przywr\u00f3ci\u0107."],"An error occurred while duplicating the form.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas duplikowania formularza."],"This will create a copy of \"%s\" with all its settings.":["To utworzy kopi\u0119 \u201e%s\u201d ze wszystkimi jego ustawieniami."],"Learn":["Ucz si\u0119"],"Export failed: no data received.":["Eksport nie powi\u00f3d\u0142 si\u0119: nie otrzymano danych."],"Select a SureForms export file (.json) to import.":["Wybierz plik eksportu SureForms (.json) do importu."],"Drop a form file (.json) here":["Upu\u015b\u0107 tutaj plik formularza (.json)"],"(Draft)":["(Szkic)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Tw\u00f3rz natychmiastowe formularze i udost\u0119pniaj je za pomoc\u0105 linku \u2014 bez potrzeby osadzania."],"Form \"%s\" duplicated successfully.":["Formularz \"%s\" zosta\u0142 pomy\u015blnie zduplikowany."],"Error loading forms":["B\u0142\u0105d \u0142adowania formularzy"],"Move form to trash?":["Przenie\u015b\u0107 formularz do kosza?"],"Delete form?":["Usun\u0105\u0107 formularz?"],"Duplicate form?":["Powieli\u0107 formularz?"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Panel sterowania"],"Settings":["Ustawienia"],"Entries":["Wpisy"],"Move to Trash":["Przenie\u015b do kosza"],"Export":["Eksport"],"Trash":["\u015amieci"],"Published":["Opublikowano"],"Restore":["Przywr\u00f3\u0107"],"Delete Permanently":["Usu\u0144 na sta\u0142e"],"Clear Filter":["Wyczy\u015b\u0107 filtr"],"Activated":["Aktywowany"],"Edit":["Edytuj"],"Import Form":["Formularz importu"],"Add New Form":["Dodaj nowy formularz"],"View Form":["Wy\u015bwietl formularz"],"Forms":["Formularze"],"Shortcode":["Kod kr\u00f3tki"],"(no title)":["(brak tytu\u0142u)"],"Confirm":["Potwierd\u017a"],"Cancel":["Anuluj"],"What's New?":["Co nowego?"],"Core":["Rdze\u0144"],"Unlicensed":["Bez licencji"],"Page":["Strona"],"No Date":["Brak daty"],"Invalid Date":["Nieprawid\u0142owa data"],"Ready to go beyond free plan?":["Gotowy, aby wyj\u015b\u0107 poza darmowy plan?"],"Upgrade now":["Zaktualizuj teraz"],"and unlock the full power of SureForms!":["i odblokuj pe\u0142n\u0105 moc SureForms!"],"Upgrade SureForms":["Uaktualnij SureForms"],"Clear Filters":["Wyczy\u015b\u0107 filtry"],"Select Date Range":["Wybierz zakres dat"],"Actions":["Akcje"],"Duplicate":["Duplikat"],"All Forms":["Wszystkie formularze"],"Date & Time":["Data i czas"],"Payments":["P\u0142atno\u015bci"],"Knowledge Base":["Baza wiedzy"],"What\u2019s New":["Co nowego"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/yyyy - dd\/mm\/yyyy"],"out of":["z"],"No entries found":["Nie znaleziono wpis\u00f3w"],"delete":["usu\u0144"],"Please type \"%s\" in the input box":["Prosz\u0119 wpisa\u0107 \"%s\" w polu wej\u015bciowym"],"To confirm, type \"%s\" in the box below:":["Aby potwierdzi\u0107, wpisz \"%s\" w polu poni\u017cej:"],"Type \"%s\"":["Wpisz \"%s\""],"No results found":["Nie znaleziono wynik\u00f3w"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["Nie znale\u017ali\u015bmy \u017cadnych rekord\u00f3w pasuj\u0105cych do Twoich filtr\u00f3w. Spr\u00f3buj dostosowa\u0107 filtry lub zresetowa\u0107 je, aby zobaczy\u0107 wszystkie wyniki."],"Please select a file to import.":["Prosz\u0119 wybra\u0107 plik do importu."],"Invalid JSON file format.":["Nieprawid\u0142owy format pliku JSON."],"Failed to read file.":["Nie uda\u0142o si\u0119 odczyta\u0107 pliku."],"Import failed.":["Import nie powi\u00f3d\u0142 si\u0119."],"An error occurred during import.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas importu."],"Import Forms":["Importuj formularze"],"Please select a valid JSON file.":["Prosz\u0119 wybra\u0107 prawid\u0142owy plik JSON."],"Drag and drop or browse files":["Przeci\u0105gnij i upu\u015b\u0107 lub przegl\u0105daj pliki"],"Importing\u2026":["Importowanie\u2026"],"Drafts":["Szkice"],"Search forms\u2026":["Wyszukaj formularze\u2026"],"No forms found":["Nie znaleziono formularzy"],"Title":["Tytu\u0142"],"Copied!":["Skopiowano!"],"Copy Shortcode":["Skopiuj kod skr\u00f3tu"],"No Forms":["Brak formularzy"],"Hi there, let's get you started":["Cze\u015b\u0107, zacznijmy."],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Wygl\u0105da na to, \u017ce nie utworzy\u0142e\u015b jeszcze \u017cadnych formularzy. Zacznij budowa\u0107 z SureForms i uruchom pot\u0119\u017cne formularze w zaledwie kilku klikni\u0119ciach."],"Design forms with our Gutenberg-native builder.":["Projektuj formularze za pomoc\u0105 naszego natywnego kreatora Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["U\u017cyj AI, aby natychmiast generowa\u0107 formularze z prostego polecenia."],"Build engaging conversational, calculation, and multi-step forms.":["Tw\u00f3rz anga\u017cuj\u0105ce formularze konwersacyjne, obliczeniowe i wieloetapowe."],"Create Form":["Utw\u00f3rz formularz"],"An error occurred while fetching forms.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas pobierania formularzy."],"%d form moved to trash.":["%d formularz przeniesiony do kosza."],"%d form restored.":["%d formularz przywr\u00f3cony."],"%d form permanently deleted.":["%d formularz zosta\u0142 trwale usuni\u0119ty."],"An error occurred while performing the action.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas wykonywania akcji."],"%d form imported successfully.":["%d formularz zaimportowany pomy\u015blnie."],"%d form will be moved to trash and can be restored later.":["%d formularz zostanie przeniesiony do kosza i mo\u017cna go p\u00f3\u017aniej przywr\u00f3ci\u0107."],"Delete Form":["Usu\u0144 formularz"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Czy na pewno chcesz trwale usun\u0105\u0107 formularz %d? Tej akcji nie mo\u017cna cofn\u0105\u0107."],"Restore Form":["Przywr\u00f3\u0107 formularz"],"%d form will be restored from trash.":["%d formularz zostanie przywr\u00f3cony z kosza."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Czy na pewno chcesz trwale usun\u0105\u0107 ten formularz? Tej akcji nie mo\u017cna cofn\u0105\u0107."],"This form will be moved to trash and can be restored later.":["Ten formularz zostanie przeniesiony do kosza i mo\u017cna go p\u00f3\u017aniej przywr\u00f3ci\u0107."],"An error occurred while duplicating the form.":["Wyst\u0105pi\u0142 b\u0142\u0105d podczas duplikowania formularza."],"This will create a copy of \"%s\" with all its settings.":["To utworzy kopi\u0119 \u201e%s\u201d ze wszystkimi jego ustawieniami."],"Learn":["Ucz si\u0119"],"Export failed: no data received.":["Eksport nie powi\u00f3d\u0142 si\u0119: nie otrzymano danych."],"Select a SureForms export file (.json) to import.":["Wybierz plik eksportu SureForms (.json) do importu."],"Drop a form file (.json) here":["Upu\u015b\u0107 tutaj plik formularza (.json)"],"(Draft)":["(Szkic)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Tw\u00f3rz natychmiastowe formularze i udost\u0119pniaj je za pomoc\u0105 linku \u2014 bez potrzeby osadzania."],"Form \"%s\" duplicated successfully.":["Formularz \"%s\" zosta\u0142 pomy\u015blnie zduplikowany."],"Error loading forms":["B\u0142\u0105d \u0142adowania formularzy"],"Move form to trash?":["Przenie\u015b\u0107 formularz do kosza?"],"Delete form?":["Usun\u0105\u0107 formularz?"],"Duplicate form?":["Powieli\u0107 formularz?"],"Switch to Draft":["Prze\u0142\u0105cz na wersj\u0119 robocz\u0105"],"%d form switched to draft.":["%d formularz zosta\u0142 prze\u0142\u0105czony na wersj\u0119 robocz\u0105."],"Switch form to draft?":["Prze\u0142\u0105czy\u0107 formularz na wersj\u0119 robocz\u0105?"],"%d form will be switched to draft and will no longer be publicly accessible.":["%d formularz zostanie prze\u0142\u0105czony na wersj\u0119 robocz\u0105 i nie b\u0119dzie ju\u017c publicznie dost\u0119pny."],"This form will be switched to draft and will no longer be publicly accessible.":["Ten formularz zostanie prze\u0142\u0105czony na wersj\u0119 robocz\u0105 i nie b\u0119dzie ju\u017c publicznie dost\u0119pny."]}}} \ No newline at end of file diff --git a/languages/sureforms-pl_PL-e2cfcb2408d95abf73e3ead4a0965656.json b/languages/sureforms-pl_PL-e2cfcb2408d95abf73e3ead4a0965656.json new file mode 100644 index 000000000..fc9d3cf51 --- /dev/null +++ b/languages/sureforms-pl_PL-e2cfcb2408d95abf73e3ead4a0965656.json @@ -0,0 +1 @@ +{"translation-revision-date":"2025-01-02T08:44:41+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/partialEntriesEmptyState.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Panel sterowania"],"Settings":["Ustawienia"],"Entries":["Wpisy"],"Activated":["Aktywowany"],"Forms":["Formularze"],"What's New?":["Co nowego?"],"Core":["Rdze\u0144"],"Unlicensed":["Bez licencji"],"Ready to go beyond free plan?":["Gotowy, aby wyj\u015b\u0107 poza darmowy plan?"],"Upgrade now":["Zaktualizuj teraz"],"and unlock the full power of SureForms!":["i odblokuj pe\u0142n\u0105 moc SureForms!"],"Upgrade SureForms":["Uaktualnij SureForms"],"Payments":["P\u0142atno\u015bci"],"Knowledge Base":["Baza wiedzy"],"What\u2019s New":["Co nowego"],"Learn":["Ucz si\u0119"],"Upgrade to SureForms":["Uaktualnij do SureForms"],"Partial Entries Placeholder":["Symbol zast\u0119pczy dla cz\u0119\u015bciowych wpis\u00f3w"],"Capture in-progress form data the moment visitors stop typing \u2014 no submit required":["Przechwy\u0107 dane formularza w trakcie wype\u0142niania, gdy tylko odwiedzaj\u0105cy przestan\u0105 pisa\u0107 \u2014 nie jest wymagane przesy\u0142anie"],"Recover abandoned submissions and follow up with prospects you would otherwise lose":["Odzyskaj porzucone zg\u0142oszenia i skontaktuj si\u0119 z potencjalnymi klientami, kt\u00f3rych w przeciwnym razie by\u015b straci\u0142"],"Let visitors pick up where they left off with secure, shareable resume links":["Pozw\u00f3l odwiedzaj\u0105cym kontynuowa\u0107 od miejsca, w kt\u00f3rym przerwali, dzi\u0119ki bezpiecznym, udost\u0119pnialnym linkom do wznawiania"],"Stop Losing Leads to Abandoned Forms":["Przesta\u0144 traci\u0107 potencjalnych klient\u00f3w przez porzucone formularze"],"See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:":["Zobacz, co wpisali odwiedzaj\u0105cy, zanim odeszli. Ulepsz do SureForms Premium, aby odblokowa\u0107 cz\u0119\u015bciowe wpisy:"]}}} \ No newline at end of file diff --git a/languages/sureforms-pl_PL.mo b/languages/sureforms-pl_PL.mo index 840030fa4..8c515185c 100644 Binary files a/languages/sureforms-pl_PL.mo and b/languages/sureforms-pl_PL.mo differ diff --git a/languages/sureforms-pl_PL.po b/languages/sureforms-pl_PL.po index c0d94b529..7e413cd5a 100644 --- a/languages/sureforms-pl_PL.po +++ b/languages/sureforms-pl_PL.po @@ -14,9 +14,9 @@ msgstr "" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -43,13 +43,14 @@ msgstr "Prosty, ale potężny sposób na tworzenie nowoczesnych formularzy na Tw msgid "https://sureforms.com/" msgstr "https://sureforms.com/" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -58,15 +59,16 @@ msgstr "https://sureforms.com/" msgid "Dashboard" msgstr "Panel sterowania" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -74,21 +76,22 @@ msgstr "Panel sterowania" msgid "Settings" msgstr "Ustawienia" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "Nowy formularz" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -97,7 +100,7 @@ msgid "Entries" msgstr "Wpisy" #. Translators: Post Title. -#: admin/admin.php:843 +#: admin/admin.php:869 #, php-format msgid "Edit %1$s" msgstr "Edytuj %1$s" @@ -111,25 +114,25 @@ msgstr "Edytuj %1$s" #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "Weryfikacja nonce nie powiodła się." #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 +#: admin/admin.php:1504 #, php-format msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "Proszę %1$saktywować%2$s swoją kopię %3$s, aby uzyskać nowe funkcje, dostęp do wsparcia, otrzymywać powiadomienia o aktualizacjach i więcej." #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 +#: admin/admin.php:1522 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "SureForms %1$s wymaga co najmniej %2$s %3$s, aby działać poprawnie. Proszę zaktualizować do najnowszej wersji z %4$stąd%5$s." -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 @@ -197,7 +200,7 @@ msgstr "Śmieci" msgid "Published" msgstr "Opublikowano" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "Widok" @@ -286,17 +289,18 @@ msgstr "Nie określono wtyczki" msgid "Plugin Successfully Activated" msgstr "Wtyczka została pomyślnie aktywowana" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "Aktywowanie..." -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -305,17 +309,17 @@ msgstr "Aktywowanie..." msgid "Activated" msgstr "Aktywowany" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "Aktywuj" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "Instalowanie..." -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "Zainstalowano" @@ -323,14 +327,14 @@ msgstr "Zainstalowano" msgid "You do not have permission to access this page." msgstr "Nie masz uprawnień do dostępu do tej strony." -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "Nieprawidłowy nonce." @@ -339,7 +343,7 @@ msgid "Form ID is required." msgstr "Wymagany jest identyfikator formularza." #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1001 msgid "Invalid form ID." msgstr "Nieprawidłowy identyfikator formularza." @@ -591,28 +595,23 @@ msgstr "Wystąpił błąd podczas próby przesłania formularza. Proszę spróbo msgid "Test Email Sent Successfully." msgstr "Testowy e-mail został wysłany pomyślnie." -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "Nie znaleziono formularzy." #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "Poniedziałek" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" -msgstr "Błąd zapisywania ustawień!" - -#: inc/global-settings/global-settings.php:122 #: assets/build/formEditor.js:172 msgid "Global Settings" msgstr "Ustawienia globalne" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "Ustawienia zostały pomyślnie zapisane." @@ -626,7 +625,6 @@ msgid "Advanced Fields" msgstr "Pola zaawansowane" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "To pole jest wymagane." @@ -638,7 +636,7 @@ msgstr "Wartość musi być unikalna." msgid "Sorry, you are not allowed to perform this action." msgstr "Przepraszam, nie masz uprawnień do wykonania tej czynności." -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "Oceń SureForms" @@ -685,7 +683,7 @@ msgstr "Ukryj" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "Edytuj formularz" @@ -709,37 +707,38 @@ msgstr "Utwórz" msgid "Import Form" msgstr "Formularz importu" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "Dodaj nowy formularz" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "Nie znaleziono rekordów" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "To tutaj pojawią się Twoje wpisy w formularzu" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "Wyświetl formularz" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "Wyświetl formularze" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -747,32 +746,37 @@ msgstr "Wyświetl formularze" msgid "Forms" msgstr "Formularze" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "Formularze wyszukiwania" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "Formularze nadrzędne:" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "Nie znaleziono formularzy w koszu." -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "Formularz opublikowany." -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "Formularz zaktualizowany." -#: inc/post-types.php:977 +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 msgid "Admin Notification Email" msgstr "Powiadomienie e-mail dla administratora" #. translators: %s: Form title smart tag -#: inc/post-types.php:984 +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 #, php-format msgid "New Form Submission - %s" msgstr "Nowe przesłanie formularza - %s" @@ -8236,7 +8240,7 @@ msgstr "Socialne" msgid "Travel" msgstr "Podróż" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "Pusty formularz" @@ -8266,6 +8270,7 @@ msgstr "Stworzone z ♡ %s" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "(brak tytułu)" @@ -8292,7 +8297,7 @@ msgstr "Zmień formularz" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "Ten formularz został usunięty lub jest niedostępny." @@ -8338,6 +8343,7 @@ msgstr "Zaawansowany" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "Brak dostępnych tagów" @@ -8382,6 +8388,7 @@ msgstr "Resetuj" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "Ogólne tagi" @@ -8761,6 +8768,7 @@ msgstr "Integracje" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8773,6 +8781,7 @@ msgstr "Co nowego?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8785,6 +8794,7 @@ msgstr "Rdzeń" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8793,52 +8803,52 @@ msgid "Unlicensed" msgstr "Bez licencji" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 #, js-format msgid "%s Removed from Quick Action Bar." msgstr "%s usunięto z paska szybkich akcji." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "Dodaj do paska szybkich akcji" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 #, js-format msgid "%s Added to Quick Action Bar." msgstr "%s dodano do paska szybkich akcji." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "Już obecne na pasku szybkich akcji" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "Nie znaleziono wyników." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "obiekt danych jest pusty" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "Dodaj bloki do paska szybkich akcji" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "Przestaw blok wewnątrz paska szybkich akcji" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -8864,30 +8874,37 @@ msgid "Install & Activate" msgstr "Zainstaluj i aktywuj" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Compliance Settings" msgstr "Ustawienia zgodności" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "Włącz zgodność z RODO" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "Nigdy nie przechowuj danych wejściowych po przesłaniu formularza" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "Gdy jest włączony, ten formularz nigdy nie będzie przechowywał wpisów." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "Automatycznie usuń wpisy" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "Po włączeniu ten formularz automatycznie usunie wpisy po określonym czasie." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "Wpisy starsze niż ustawione dni zostaną usunięte automatycznie." @@ -8900,34 +8917,42 @@ msgid "The following CSS styles added below will only apply to this form contain msgstr "Następujące style CSS dodane poniżej będą dotyczyć tylko tego kontenera formularza." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "Wizualny" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "HTML" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "Wszystkie dane" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "Dodaj shortcode" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "Tagi wejściowe formularza" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Comma separated values are also accepted." msgstr "Wartości oddzielone przecinkami są również akceptowane." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "Powiadomienie e-mail" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Name" msgstr "Imię" @@ -8937,18 +8962,22 @@ msgid "Send Email To" msgstr "Wyślij e-mail do" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Subject" msgstr "Temat" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "CC" msgstr "DW" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "BCC" msgstr "UDW" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reply To" msgstr "Odpowiedz do" @@ -8957,54 +8986,57 @@ msgid "Add Notification" msgstr "Dodaj powiadomienie" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." -msgstr "Powiadomienie e-mail zostało pomyślnie wyłączone." - -#: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." -msgstr "Powiadomienie e-mail zostało pomyślnie włączone." - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "Dodaj klucz" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "Dodaj wartość" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "Dodaj" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "Wiadomość potwierdzająca" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "Po przesłaniu formularza" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "Ukryj formularz" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "Zresetuj formularz" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "Niestandardowy URL" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "Dodaj parametry zapytania" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "Wybierz, jeśli chcesz dodać pary klucz-wartość dla pól formularza do uwzględnienia w parametrach zapytania" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "Parametry zapytania" @@ -9017,14 +9049,17 @@ msgid "Suggestion: URL should use HTTPS" msgstr "Sugestia: URL powinien używać HTTPS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Success Message" msgstr "Komunikat o sukcesie" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect" msgstr "Przekieruj" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect to" msgstr "Przekieruj do" @@ -9032,14 +9067,17 @@ msgstr "Przekieruj do" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "Strona" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form Confirmation" msgstr "Potwierdzenie formularza" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "Typ potwierdzenia" @@ -9181,7 +9219,7 @@ msgstr "Centrum" msgid "Right" msgstr "Prawo" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1178 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" @@ -9191,7 +9229,7 @@ msgstr "Google reCAPTCHA" msgid "CloudFlare Turnstile" msgstr "CloudFlare Turnstile" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1182 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" @@ -9250,7 +9288,8 @@ msgstr "Podział strony" msgid "Previous" msgstr "Poprzedni" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 #: assets/build/formEditor.js:172 msgid "Thank you" msgstr "Dziękuję" @@ -9483,7 +9522,7 @@ msgstr "Klucz strony" msgid "Secret Key" msgstr "Klucz tajny" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1186 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "Cloudflare Turnstile" @@ -9500,10 +9539,6 @@ msgstr "Włącz zabezpieczenie Honeypot" msgid "Enable Honeypot Security for better spam protection" msgstr "Włącz Honeypot Security dla lepszej ochrony przed spamem" -#: assets/build/settings.js:172 -msgid "This field cannot be left blank." -msgstr "To pole nie może pozostać puste." - #: assets/build/templatePicker.js:172 msgid "Connect Now" msgstr "Połącz teraz" @@ -10481,18 +10516,18 @@ msgstr "Odblokuj Dodaj Notatkę" msgid "With the SureForms Starter plan, enhance your submitted form entries by adding personalized notes for better clarity and tracking." msgstr "Dzięki planowi SureForms Starter ulepsz swoje przesłane formularze, dodając spersonalizowane notatki dla lepszej przejrzystości i śledzenia." -#: inc/form-submit.php:823 +#: inc/form-submit.php:852 msgid "Email notification passed to the sending server" msgstr "Powiadomienie e-mail zostało przekazane do serwera wysyłającego" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 +#: inc/form-submit.php:925 #, php-format msgid "Email notification recipient: %s" msgstr "Odbiorca powiadomienia e-mail: %s" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 +#: inc/form-submit.php:942 #, php-format msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "Serwer poczty nie mógł wysłać powiadomienia e-mail. Odbiorca: %1$s. Powód: %2$s" @@ -10535,7 +10570,7 @@ msgstr "Odblokuj formularze konwersacyjne" msgid "With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience." msgstr "Dzięki planowi SureForms Pro możesz przekształcić swoje formularze w angażujące, konwersacyjne układy, zapewniając płynne doświadczenie użytkownika." -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "Pobierz SureForms Pro" @@ -10631,7 +10666,7 @@ msgstr "PX" msgid "Button" msgstr "Przycisk" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" @@ -10663,46 +10698,56 @@ msgid "SUREFORMS PREMIUM FIELDS" msgstr "Pola premium SureForms" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "Bieżący adres „Od e-mail” nie pasuje do nazwy domeny Twojej strony internetowej (%1$s). Może to spowodować, że Twoje e-maile z powiadomieniami będą blokowane lub oznaczane jako spam. Alternatywnie, spróbuj użyć adresu Od, który pasuje do domeny Twojej strony internetowej (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "Obecny adres „Od e-mail” nie pasuje do nazwy domeny Twojej strony internetowej (%s). Może to spowodować, że Twoje e-maile z powiadomieniami zostaną zablokowane lub oznaczone jako spam." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "We strongly recommend that you install the free " msgstr "Zalecamy zdecydowanie zainstalowanie darmowego" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "wtyczka! Kreator konfiguracji ułatwia naprawę Twoich e-maili." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "Alternatywnie spróbuj użyć adresu nadawcy, który pasuje do domeny Twojej strony internetowej (admin@%s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "Proszę wprowadzić prawidłowy adres e-mail. Powiadomienia nie będą wysyłane, jeśli pole nie zostanie wypełnione poprawnie." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Name" msgstr "Od Nazwa" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Email" msgstr "Z e-maila" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "Bieżący adres „Od e-mail” może nie pasować do nazwy domeny Twojej strony internetowej (%1$s). Może to spowodować, że Twoje e-maile z powiadomieniami zostaną zablokowane lub oznaczone jako spam. Alternatywnie, spróbuj użyć adresu Od, który pasuje do domeny Twojej strony internetowej (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "Obecny adres „Od e-mail” może nie pasować do nazwy domeny Twojej strony internetowej (%s). Może to spowodować, że Twoje e-maile z powiadomieniami zostaną zablokowane lub oznaczone jako spam." @@ -10736,24 +10781,24 @@ msgstr "Wybierz gradient" msgid "reCAPTCHA" msgstr "reCAPTCHA" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1122 msgid "Captcha validation failed. No error code provided." msgstr "Weryfikacja Captcha nie powiodła się. Nie podano kodu błędu." -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1123 msgid "Captcha validation failed." msgstr "Weryfikacja Captcha nie powiodła się." -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1190 msgid "Unknown Captcha" msgstr "Nieznana Captcha" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1191 msgid "Invalid captcha type." msgstr "Nieprawidłowy typ captcha." #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 +#: inc/form-submit.php:1204 #, php-format msgid "%s verification failed. Please contact your site administrator." msgstr "Weryfikacja %s nie powiodła się. Proszę skontaktować się z administratorem strony." @@ -10776,11 +10821,11 @@ msgstr "Weryfikacja klucza witryny HCaptcha nie powiodła się. Proszę skontakt msgid "%s sitekey is missing. Please contact your site administrator." msgstr "Brakuje klucza witryny %s. Proszę skontaktować się z administratorem witryny." -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "SureMail" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "Szablony startowe" @@ -10821,6 +10866,7 @@ msgstr "Nieprawidłowa data" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10833,6 +10879,7 @@ msgstr "Gotowy, aby wyjść poza darmowy plan?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10845,6 +10892,7 @@ msgstr "Zaktualizuj teraz" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10857,6 +10905,7 @@ msgstr "i odblokuj pełną moc SureForms!" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10947,10 +10996,12 @@ msgid "Free" msgstr "Bezpłatny" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "Wpisy starsze niż wybrane dni zostaną usunięte." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "Okres czasu wpisów" @@ -10959,6 +11010,7 @@ msgid "Custom CSS Panel" msgstr "Panel niestandardowego CSS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "Powiadomienia mogą używać tylko jednego adresu e-mail nadawcy, więc proszę podać jeden adres." @@ -10986,14 +11038,17 @@ msgid "Delete" msgstr "Usuń" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "Wybierz stronę do przekierowania" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "Wyszukaj stronę" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "Wybierz stronę" @@ -11119,6 +11174,7 @@ msgstr "Aby włączyć hCAPTCHA, dodaj klucz witryny i klucz tajny. Skonfiguruj msgid "To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form." msgstr "Aby włączyć Cloudflare Turnstile, dodaj klucz witryny i klucz tajny. Skonfiguruj te ustawienia w ramach poszczególnego formularza." +#: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Save" msgstr "Zapisz" @@ -11139,8 +11195,8 @@ msgstr "Opisz formularz, który chcesz utworzyć" msgid "We are building your form…" msgstr "Budujemy Twój formularz…" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "SMTP" @@ -11270,28 +11326,28 @@ msgstr "Włącz powiadomienia administratora" msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "Powiadomienia administracyjne informują Cię o nowych wpisach formularza od Twojej ostatniej wizyty." -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "Nieautoryzowany użytkownik." #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 +#: admin/admin.php:1774 #, php-format msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "%1$sZacznij od %2$szbudowania swojego pierwszego formularza%3$s.%4$s%5$sDoświadcz mocy naszego intuicyjnego Kreatora Formularzy AI%6$s" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "SureForms czeka na Ciebie!" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "Zbuduj mój pierwszy formularz" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "Odrzuć" @@ -11311,51 +11367,51 @@ msgstr "Zaloguj się" msgid "Register" msgstr "Zarejestruj się" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "Ostatnie wpisy" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "( Ostatnie 7 dni )" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "Użyj logiki warunkowej, aby pokazać tylko to, co ważne" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "Podziel swój formularz na etapy, aby był łatwy." -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "Pozwól ludziom przesyłać pliki bezpośrednio do Twojego formularza" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "Automatycznie przekształcaj odpowiedzi w pliki PDF do pobrania" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "Pozwól użytkownikom podpisać się w prostym polu podpisu" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "Połącz swój formularz z innymi narzędziami za pomocą webhooków" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "Użyj Formularzy Konwersacyjnych, aby uzyskać doświadczenie podobne do czatu" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "Pozwól użytkownikom zarejestrować się lub zalogować przez Twój formularz" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "Twórz formularze, które tworzą konta użytkowników WordPress" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "Dodaj obliczenia do automatycznego sumowania wyników lub cen" @@ -11585,21 +11641,21 @@ msgstr "Ostatnie szlify, które robią różnicę:" msgid "Build Your First Form" msgstr "Zbuduj swój pierwszy formularz" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "Nieprawidłowa akcja lub nazwa nonce." -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "Nieprawidłowy token zabezpieczający." -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "Nieprawidłowy typ żądania." -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "Nie masz uprawnień do wykonania tej czynności." @@ -11677,10 +11733,12 @@ msgid "Form Restriction" msgstr "Ograniczenie formularza" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "Maksymalna liczba wpisów" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "Maksymalna liczba wpisów" @@ -11698,6 +11756,7 @@ msgid "Click here" msgstr "Kliknij tutaj" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "Opis odpowiedzi po maksymalnej liczbie wpisów" @@ -11711,7 +11770,7 @@ msgstr "Cześć," msgid "Email Summary of your last week - %1$s to %2$s" msgstr "Podsumowanie e-mail z ostatniego tygodnia - %1$s do %2$s" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "Ultimate Addons dla Elementor" @@ -11773,7 +11832,7 @@ msgstr "Odkryj SureDash" msgid "Something went wrong. We have logged the error for further investigation" msgstr "Coś poszło nie tak. Zarejestrowaliśmy błąd do dalszego zbadania" -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "Pole jest nieprawidłowe." @@ -11837,16 +11896,18 @@ msgid "SureForms Video Thumbnail" msgstr "Miniatura wideo SureForms" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Expected format for emails - email@sureforms.com or John Doe " msgstr "Oczekiwany format dla e-maili - email@sureforms.com lub John Doe " -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -12010,47 +12071,47 @@ msgstr "Tryb testowy jest włączony:" msgid "Click here to enable live mode and accept payment" msgstr "Kliknij tutaj, aby włączyć tryb na żywo i zaakceptować płatność" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "Zwiększ swoją dostarczalność e-maili natychmiast!" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "Uzyskaj dostęp do potężnej, łatwej w użyciu usługi dostarczania e-maili, która zapewnia, że Twoje wiadomości trafiają do skrzynek odbiorczych, a nie do folderów ze spamem. Automatyzuj przepływy pracy e-mail w WordPress z pewnością dzięki SureMail." -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "Zautomatyzuj swoje przepływy pracy w WordPressie bez wysiłku." -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "Połącz swoje wtyczki WordPress i ulubione aplikacje, automatyzuj zadania i synchronizuj dane bez wysiłku za pomocą przejrzystego, wizualnego kreatora przepływu pracy OttoKit — bez potrzeby kodowania czy skomplikowanej konfiguracji." -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "Uruchamiaj piękne strony internetowe w kilka minut!" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "Wybierz spośród profesjonalnie zaprojektowanych szablonów, zaimportuj jednym kliknięciem i dostosuj bez wysiłku do swojej marki." -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "Wzmocnij Elementor, aby szybciej tworzyć oszałamiające strony internetowe!" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "Ulepsz Elementor za pomocą potężnych widżetów i szablonów. Twórz oszałamiające, wydajne strony internetowe szybciej dzięki kreatywnym elementom projektowym i bezproblemowej personalizacji." -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "SureRank" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "Podnieś swoje SEO i wspinaj się w rankingach wyszukiwania bez wysiłku!" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "Zwiększ widoczność swojej strony internetowej dzięki inteligentnej automatyzacji SEO. Optymalizuj treści, śledź wydajność słów kluczowych i uzyskaj praktyczne wskazówki, wszystko w WordPressie." @@ -12175,49 +12236,49 @@ msgstr "%1$d płatność(i) usunięto pomyślnie. %2$d nie powiodło się." msgid "Failed to delete payments. Please try again." msgstr "Nie udało się usunąć płatności. Proszę spróbować ponownie." -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "Nieznana forma" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "Nie dotyczy" #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "Subscription" msgstr "Subskrypcja" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "Odnowienie" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "Jeden raz" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "Nieznany" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -12233,7 +12294,7 @@ msgstr "Ważny adres e-mail klienta jest wymagany do płatności." #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -12312,7 +12373,7 @@ msgstr "Nieoczekiwany błąd: %s" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "Nie znaleziono identyfikatora subskrypcji." @@ -12375,9 +12436,9 @@ msgstr "Weryfikacja subskrypcji" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 +#: inc/payments/stripe/stripe-webhook.php:1120 #, php-format msgid "Subscription ID: %s" msgstr "Identyfikator subskrypcji: %s" @@ -12392,13 +12453,13 @@ msgstr "Identyfikator subskrypcji: %s" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 #, php-format msgid "Payment Gateway: %s" msgstr "Bramka płatnicza: %s" @@ -12411,7 +12472,7 @@ msgstr "Identyfikator intencji płatności: %s" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 +#: inc/payments/stripe/stripe-webhook.php:1050 #, php-format msgid "Charge ID: %s" msgstr "Identyfikator opłaty: %s" @@ -12421,14 +12482,14 @@ msgstr "Identyfikator opłaty: %s" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 +#: inc/payments/stripe/admin-stripe-handler.php:516 #, php-format msgid "Subscription Status: %s" msgstr "Status subskrypcji: %s" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 +#: inc/payments/stripe/stripe-webhook.php:1124 #, php-format msgid "Customer ID: %s" msgstr "ID klienta: %s" @@ -12437,8 +12498,8 @@ msgstr "ID klienta: %s" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 #, php-format msgid "Amount: %1$s %2$s" msgstr "Kwota: %1$s %2$s" @@ -12473,7 +12534,7 @@ msgstr "Weryfikacja płatności" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 +#: inc/payments/stripe/stripe-webhook.php:1112 #, php-format msgid "Transaction ID: %s" msgstr "ID transakcji: %s" @@ -12482,7 +12543,7 @@ msgstr "ID transakcji: %s" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 #, php-format msgid "Status: %s" msgstr "Status: %s" @@ -12850,23 +12911,23 @@ msgid "Unknown error" msgstr "Nieznany błąd" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "Brakuje identyfikatora płatności." -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "Nie masz uprawnień do wykonania tej czynności." #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "Płatność nie została znaleziona w bazie danych." #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "To nie jest płatność abonamentowa." @@ -12876,7 +12937,7 @@ msgid "Subscription cancellation failed." msgstr "Anulowanie subskrypcji nie powiodło się." #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "Nie udało się zaktualizować statusu subskrypcji w bazie danych." @@ -12885,58 +12946,58 @@ msgstr "Nie udało się zaktualizować statusu subskrypcji w bazie danych." msgid "Invalid payment data." msgstr "Nieprawidłowe dane płatności." -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "Tylko zakończone sukcesem lub częściowo zwrócone płatności mogą być zwrócone." -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "Nieprawidłowy identyfikator transakcji." -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "Nieprawidłowy format identyfikatora transakcji do zwrotu." -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "Nie udało się przetworzyć zwrotu za pośrednictwem API Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "Nie udało się zaktualizować rekordu płatności po zwrocie." #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "Płatność została pomyślnie zwrócona." #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "Nie udało się przetworzyć zwrotu. Proszę spróbować ponownie." -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "Nie udało się wstrzymać subskrypcji." -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "Pełny" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "Częściowy" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 #, php-format msgid "Refund ID: %s" msgstr "Identyfikator zwrotu: %s" @@ -12944,9 +13005,9 @@ msgstr "Identyfikator zwrotu: %s" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 #, php-format msgid "Refund Amount: %1$s %2$s" msgstr "Kwota zwrotu: %1$s %2$s" @@ -12954,9 +13015,9 @@ msgstr "Kwota zwrotu: %1$s %2$s" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 #, php-format msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "Całkowita kwota zwrotu: %1$s %2$s z %3$s %4$s" @@ -12964,9 +13025,9 @@ msgstr "Całkowita kwota zwrotu: %1$s %2$s z %3$s %4$s" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 #, php-format msgid "Refund Status: %s" msgstr "Status zwrotu: %s" @@ -12975,10 +13036,10 @@ msgstr "Status zwrotu: %s" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 #, php-format msgid "Payment Status: %s" msgstr "Status płatności: %s" @@ -12986,132 +13047,132 @@ msgstr "Status płatności: %s" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 #, php-format msgid "Refunded by: %s" msgstr "Zwrócono przez: %s" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 #, php-format msgid "Refund Notes: %s" msgstr "Notatki dotyczące zwrotu: %s" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 #, php-format msgid "%s Payment Refund" msgstr "%s Zwrot Płatności" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 #, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "Webhooki utrzymują SureForms w synchronizacji ze Stripe, automatycznie aktualizując dane dotyczące płatności i subskrypcji. Proszę %1$s Webhook." -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "konfiguruj" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "Podano nieprawidłowe parametry zwrotu." -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "Ta płatność nie jest związana z subskrypcją." -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "Tylko aktywne, zakończone sukcesem lub częściowo zwrócone płatności subskrypcyjne mogą zostać zwrócone." -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "Utworzenie zwrotu Stripe nie powiodło się. Proszę sprawdzić swój panel Stripe, aby uzyskać więcej szczegółów." -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "Zwrot został przetworzony przez Stripe, ale nie udało się zaktualizować lokalnych zapisów. Proszę sprawdzić swoje zapisy płatności ręcznie." -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "Płatność za subskrypcję została pomyślnie zwrócona." #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 +#: inc/payments/stripe/admin-stripe-handler.php:977 #, php-format msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "Kwota zwrotu przekracza dostępne środki. Maksymalna kwota zwrotu: %1$s %2$s" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "Kwota zwrotu musi być większa niż zero." -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "Kwota zwrotu musi wynosić co najmniej 0,50 USD." -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "Nie można ustalić odpowiedniej metody zwrotu dla tej płatności za subskrypcję." #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 +#: inc/payments/stripe/admin-stripe-handler.php:1256 #, php-format msgid "%s Subscription Payment Refund" msgstr "%s Zwrot Płatności za Subskrypcję" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "Ta płatność została już w pełni zwrócona." -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "Płatność nie została znaleziona w Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "Kwota zwrotu przekracza dostępną kwotę do zwrotu." -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "Nie można znaleźć płatności za tę subskrypcję." -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "Subskrypcja nie została znaleziona w Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "Ta subskrypcja nie ma udanych płatności do zwrotu." -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "Metoda płatności dla tej subskrypcji jest nieprawidłowa." -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "Niewystarczające uprawnienia do przetwarzania zwrotów." -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "Zbyt wiele żądań. Proszę spróbować ponownie za chwilę." -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "Błąd sieci. Proszę sprawdzić połączenie i spróbować ponownie." #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 +#: inc/payments/stripe/admin-stripe-handler.php:1308 #, php-format msgid "Subscription refund failed: %s" msgstr "Zwrot subskrypcji nie powiódł się: %s" @@ -13261,7 +13322,7 @@ msgstr "Anulowano o: %s" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 +#: inc/payments/stripe/stripe-webhook.php:892 #, php-format msgid "Cancellation Reason: %s" msgstr "Powód anulowania: %s" @@ -13280,24 +13341,24 @@ msgstr "Anulowano subskrypcję" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "Webhook" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "Anulowano zwrot" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:882 #, php-format msgid "Canceled Refund Amount: %1$s %2$s" msgstr "Anulowana kwota zwrotu: %1$s %2$s" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 +#: inc/payments/stripe/stripe-webhook.php:885 #, php-format msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "Pozostała kwota zwrotu: %1$s %2$s z %3$s %4$s" @@ -13306,52 +13367,52 @@ msgstr "Pozostała kwota zwrotu: %1$s %2$s z %3$s %4$s" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:896 #, php-format msgid "Canceled by: %s" msgstr "Anulowano przez: %s" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "Początkowa płatność za subskrypcję zakończona sukcesem" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 #, php-format msgid "Invoice ID: %s" msgstr "Identyfikator faktury: %s" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "Status płatności: Zakończono pomyślnie" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "Status subskrypcji: Aktywny" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "Płatność za opłatę abonamentową" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "Powiodło się" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 +#: inc/payments/stripe/stripe-webhook.php:1126 #, php-format msgid "Customer Email: %s" msgstr "Email klienta: %s" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 +#: inc/payments/stripe/stripe-webhook.php:1128 #, php-format msgid "Customer Name: %s" msgstr "Nazwa klienta: %s" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "Utworzono w ramach cyklu rozliczeniowego subskrypcji" @@ -13359,19 +13420,20 @@ msgstr "Utworzono w ramach cyklu rozliczeniowego subskrypcji" msgid "Edit this form" msgstr "Edytuj ten formularz" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." msgstr "Twój formularz został pomyślnie przesłany. Przejrzymy Twoje dane i wkrótce się z Tobą skontaktujemy." #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "Wymagany jest identyfikator wpisu." #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "Nie znaleziono wpisu." @@ -13571,6 +13633,7 @@ msgstr "Wybierz pole e-mail, które zawiera adres e-mail klienta" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13583,6 +13646,7 @@ msgstr "Baza wiedzy" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13664,6 +13728,7 @@ msgid "Go to Forms" msgstr "Przejdź do Formularzy" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13671,6 +13736,7 @@ msgid "delete" msgstr "usuń" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13679,6 +13745,7 @@ msgid "Please type \"%s\" in the input box" msgstr "Proszę wpisać \"%s\" w polu wejściowym" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13687,6 +13754,7 @@ msgid "To confirm, type \"%s\" in the box below:" msgstr "Aby potwierdzić, wpisz \"%s\" w polu poniżej:" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14113,7 +14181,7 @@ msgstr "Użyj AI, aby natychmiast generować formularze z prostego polecenia." msgid "Build engaging conversational, calculation, and multi-step forms." msgstr "Twórz angażujące formularze konwersacyjne, obliczeniowe i wieloetapowe." -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "Utwórz formularz" @@ -14897,22 +14965,22 @@ msgstr "Uwaga: Subskrypcja została trwale anulowana. Klient nie będzie już ob #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "Wstrzymano" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 +#: inc/payments/stripe/admin-stripe-handler.php:521 #, php-format msgid "Paused by: %s" msgstr "Wstrzymane przez: %s" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "Uwaga: Rozliczanie subskrypcji zostało wstrzymane. Żadne opłaty nie będą naliczane, dopóki subskrypcja nie zostanie wznowiona." -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "Subskrypcja wstrzymana" @@ -14921,6 +14989,7 @@ msgid "This entry will be moved to trash and can be restored later." msgstr "Ten wpis zostanie przeniesiony do kosza i można go będzie przywrócić później." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "Ustaw całkowitą liczbę dozwolonych zgłoszeń dla tego formularza." @@ -15048,7 +15117,7 @@ msgstr "Wartość pola zmiennej kwoty jest wymagana." msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "Kwota płatności poniżej minimum. Minimum: %1$s, otrzymano %2$s." -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "(Kopiuj)" @@ -15109,12 +15178,14 @@ msgstr "To utworzy kopię „%s” ze wszystkimi jego ustawieniami." msgid "Pay with credit or debit card" msgstr "Zapłać kartą kredytową lub debetową" +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 msgid "This form is not yet available. Please check back after the scheduled start time." msgstr "Ten formularz nie jest jeszcze dostępny. Proszę sprawdzić ponownie po zaplanowanym czasie rozpoczęcia." #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "Formularz ten nie przyjmuje już zgłoszeń. Okres składania zgłoszeń dobiegł końca." @@ -15133,7 +15204,7 @@ msgstr "Przetwarzanie zwrotów nie jest obsługiwane dla bramki %s." msgid "Number field configuration not found." msgstr "Nie znaleziono konfiguracji pola liczbowego." -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "Nieprawidłowe parametry zwrotu." @@ -15248,24 +15319,24 @@ msgid "Stripe Settings" msgstr "Ustawienia Stripe" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 +#: admin/admin.php:1439 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "SureForms %1$s wymaga co najmniej %2$s %3$s do prawidłowego działania. Proszę zaktualizować do najnowszej wersji." -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "Zaktualizuj teraz" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "SureContact" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "Zamień e-maile na przychody dzięki CRM stworzonym dla Twojej strony internetowej!" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "Wysyłaj biuletyny, prowadź kampanie, konfiguruj automatyzacje, zarządzaj kontaktami i zobacz dokładnie, ile przychodów generują Twoje e-maile, wszystko w jednym miejscu." @@ -15301,13 +15372,14 @@ msgstr "Pozycja znaku waluty" msgid "Select the position of the currency symbol relative to the amount." msgstr "Wybierz pozycję symbolu waluty względem kwoty." -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -15315,40 +15387,40 @@ msgstr "Wybierz pozycję symbolu waluty względem kwoty." msgid "Learn" msgstr "Ucz się" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "Niesamowite! SureForms napędza Twoje formularze i zgłoszenia - rozwijajmy się razem!" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "Jeśli SureForms okazał się pomocny, czy mógłbyś poświęcić chwilę na pozostawienie 5-gwiazdkowej recenzji na WordPress.org?" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "Może później" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "Już to zrobiłem" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "SureForms jest gotowy, aby zasilić Twoje formularze — odkryj, co jest możliwe!" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "Zarządzaj swoimi formularzami, śledź zgłoszenia i odkrywaj funkcje takie jak AI Form Builder, integracje płatności i inne z poziomu pulpitu SureForms." -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "Przejdź do pulpitu nawigacyjnego" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "Już wiem" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "Nieprawidłowe parametry." @@ -15510,7 +15582,7 @@ msgstr "Wymagane jest co najmniej jedno pole formularza." msgid "Failed to generate form fields from the provided data." msgstr "Nie udało się wygenerować pól formularza z dostarczonych danych." -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "Nie udało się utworzyć formularza." @@ -15730,15 +15802,16 @@ msgstr "Pole tekstowe" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "Ten formularz nie jest jeszcze dostępny. Sprawdź ponownie po zaplanowanym czasie rozpoczęcia." +#: inc/admin/html-form-detector.php:268 #: inc/form-submit.php:99 #: inc/form-submit.php:400 #: inc/form-submit.php:445 -#: inc/form-submit.php:968 +#: inc/form-submit.php:997 #: inc/payments/front-end.php:78 #: inc/payments/front-end.php:263 #: inc/rest-api.php:98 @@ -15752,9 +15825,10 @@ msgstr "Ten formularz nie jest jeszcze dostępny. Sprawdź ponownie po zaplanowa #: inc/rest-api.php:667 #: inc/rest-api.php:716 #: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 msgid "Security verification failed. Please refresh the page and try again." msgstr "Weryfikacja bezpieczeństwa nie powiodła się. Odśwież stronę i spróbuj ponownie." @@ -15787,19 +15861,19 @@ msgstr "Proszę sprawdzić formularz pod kątem błędów." msgid "Your submission was flagged as spam. Please try again." msgstr "Twoje zgłoszenie zostało oznaczone jako spam. Proszę spróbuj ponownie." -#: inc/form-submit.php:651 +#: inc/form-submit.php:680 msgid "Unable to submit form. Please try again." msgstr "Nie można przesłać formularza. Proszę spróbować ponownie." -#: inc/form-submit.php:903 +#: inc/form-submit.php:932 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "Nie wykryto wtyczki SMTP. Proszę skonfigurować wtyczkę SMTP, aby umożliwić wysyłanie e-maili." -#: inc/form-submit.php:904 +#: inc/form-submit.php:933 msgid "Email sending failed for an unknown reason." msgstr "Wysyłanie e-maila nie powiodło się z nieznanego powodu." -#: inc/form-submit.php:943 +#: inc/form-submit.php:972 msgid "No emails were sent." msgstr "Nie wysłano żadnych e-maili." @@ -15984,7 +16058,7 @@ msgstr "Nie można utworzyć płatności. Proszę skontaktować się z pomocą t msgid "Subscription canceled successfully!" msgstr "Subskrypcja została pomyślnie anulowana!" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "Subskrypcja została pomyślnie wstrzymana!" @@ -16016,8 +16090,8 @@ msgstr "Nie można usunąć webhooka." msgid "Unable to connect to Stripe." msgstr "Nie można połączyć się ze Stripe." -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "Formularz jest zamknięty. Okres składania wniosków zakończył się." @@ -16056,28 +16130,28 @@ msgstr "Nieprawidłowa akcja. Użyj \"przeczytane\" lub \"nieprzeczytane\"." msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "Nieprawidłowa akcja. Użyj \"trash\" lub \"restore\"." -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "Wybierz co najmniej jeden formularz i określ działanie." -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "Formularz nie został znaleziony lub nie jest prawidłowym typem formularza." -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "Ten formularz jest już w koszu." -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "Ten formularz nie znajduje się w koszu." -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "Nieprawidłowa akcja." #. translators: %s: action name -#: inc/rest-api.php:1100 +#: inc/rest-api.php:1124 #, php-format msgid "Failed to %s this form. Please try again." msgstr "Nie udało się %s tego formularza. Proszę spróbować ponownie." @@ -16220,10 +16294,6 @@ msgstr "Informacje o wejściu" msgid "Resend Email Notification" msgstr "Wyślij ponownie powiadomienie e-mail" -#: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." -msgstr "Po włączeniu, ten formularz nie będzie przechowywał adresu IP użytkownika, nazwy przeglądarki ani nazwy urządzenia w wpisach." - #: assets/build/formEditor.js:172 msgid "Select a spam protection service. Configure API keys in Global Settings before enabling." msgstr "Wybierz usługę ochrony przed spamem. Skonfiguruj klucze API w Ustawieniach Globalnych przed włączeniem." @@ -16691,26 +16761,27 @@ msgstr "Tajny klucz webhooka nie jest skonfigurowany." msgid "Invalid webhook signature." msgstr "Nieprawidłowy podpis webhooka." -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "Quizy" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "Wpisy do quizu" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "Nowy" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1006 msgid "Invalid form." msgstr "Nieprawidłowy formularz." -#: inc/form-submit.php:982 +#: inc/form-submit.php:1011 msgid "Too many requests. Please try again shortly." msgstr "Zbyt wiele żądań. Proszę spróbować ponownie za chwilę." @@ -16922,10 +16993,6 @@ msgstr "Polityka prywatności" msgid "Finish" msgstr "Zakończ" -#: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." -msgstr "Wybierz metodę ochrony przed spamem dla tego formularza, aby zapobiec niechcianym zgłoszeniom." - #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Send entries to 100+ popular apps." @@ -17005,6 +17072,7 @@ msgstr "Twórz angażujące quizy z SureForms" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "Zamień swoje formularze w potężne quizy. Ulepsz do SureForms, aby odblokować możliwości quizów:" +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/surveyEmptyState.js:172 msgid "Upgrade to SureForms" @@ -17222,39 +17290,45 @@ msgstr "Idealne do edukacji, szkoleń i zabawnych ciekawostek" msgid "Select this to create a quiz with scored questions and graded results." msgstr "Wybierz to, aby utworzyć quiz z punktowanymi pytaniami i ocenianymi wynikami." -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "Raporty z ankiet" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "Nagłówek 1" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "Nagłówek 2" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "Nagłówek 3" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "Nagłówek 4" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "Nagłówek 5" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "Nagłówek 6" @@ -17271,7 +17345,7 @@ msgid "Cancellation not supported for this gateway." msgstr "Anulowanie nie jest obsługiwane dla tej bramki." #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "Subskrypcja została pomyślnie anulowana." @@ -17488,10 +17562,6 @@ msgstr "Skonfiguruj klucz API Google Maps do autouzupełniania adresów i podgl msgid "Help shape the future of SureForms" msgstr "Pomóż kształtować przyszłość SureForms" -#: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " -msgstr "Podziel się, jak używasz wtyczki, abyśmy mogli tworzyć funkcje, które mają znaczenie, szybciej naprawiać problemy i podejmować mądrzejsze decyzje." - #: assets/build/settings.js:172 msgid "Enable Google Address Autocomplete" msgstr "Włącz autouzupełnianie adresów Google" @@ -17576,16 +17646,16 @@ msgstr "Polski Złoty" msgid "Dynamic Default Value" msgstr "Dynamiczna wartość domyślna" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "Hej! Wygląda na to, że tworzysz formularz. Zbuduj gotowy do użycia formularz w mniej niż 30 sekund z SureForms AI, bez dodatkowej konfiguracji." -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "Nieprawidłowy post." -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "Nie możesz edytować tego posta." @@ -17624,7 +17694,7 @@ msgid "Error creating SureForms Form." msgstr "Błąd podczas tworzenia formularza SureForms." #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 #, php-format msgid "Please enter at least %s characters." @@ -17782,22 +17852,374 @@ msgstr "Odpowiedź AI była pusta. Proszę dopracować swój prompt i spróbowa msgid "Unable to build form fields from the AI response." msgstr "Nie można utworzyć pól formularza z odpowiedzi AI." -#: inc/post-types.php:205 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "Częściowe wpisy" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." +msgstr "Formularz jest teraz zamknięty, ponieważ otrzymaliśmy wszystkie zgłoszenia." + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." +msgstr "Nieprawidłowa karta ustawień." + +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "Dziękujemy za skontaktowanie się z nami! Wkrótce się z Tobą skontaktujemy." + +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "Użyj akcji przywracania, aby odzyskać usunięty formularz przed przełączeniem go na wersję roboczą." + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "Ten formularz jest już szkicem." + +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "Nie masz uprawnień do edytowania tego formularza." + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "Nieprawidłowy identyfikator formularza." + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "Ustawienia formularza zostały zapisane." + +#: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "Limit wejść opiera się na zapisanych wpisach do liczenia zgłoszeń. Gdy w Ustawieniach Zgodności jest włączona opcja \"Nigdy nie przechowuj danych wpisu po przesłaniu formularza\", ten limit nie będzie egzekwowany. Wyłącz tę opcję lub usuń limit wpisów, aby skorzystać z tej funkcji." + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "Symbol zastępczy dla częściowych wpisów" + +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "Tekst zastępczy wyświetlany wewnątrz pustego pola wejściowego/obszaru tekstowego lub jako pusta pierwsza opcja w rozwijanym menu." + +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "Tablica pól generowana przez parser po stronie edytora." + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "Surowy HTML źródła . Wymagane, gdy pewność parsera jest niska, abyśmy mogli przekazać znacznik do pośrednika AI." + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "Deskryptor stylizacji w miarę możliwości (kolory szesnastkowe) wyodrębniony z stylów wbudowanych w źródłowy ." + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "Nie masz pozwolenia na konwertowanie formularzy HTML." + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "Przekształcona forma" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "Formularz HTML jest zbyt duży, aby go przekonwertować. Proszę uprościć znacznik lub zbudować formularz ręcznie." + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "Nie można było wyprowadzić żadnych pól z dostarczonego formularza." + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "Usługa SureForms AI nie mogła przetworzyć tego formularza. Spróbuj ponownie lub zbuduj formularz ręcznie." + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "Usługa SureForms AI zwróciła nieużyteczną odpowiedź. Spróbuj ponownie lub zbuduj formularz ręcznie." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "Użyj inteligentnego tagu, takiego jak {get_input:country}. Pierwsza opcja, której tytuł pasuje do rozwiązanego wartości, zostanie wstępnie wybrana." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "Użyj inteligentnego tagu, takiego jak {get_input:colors} i przekaż wartości oddzielone pionową kreską w URL (na przykład ?colors=Red|Blue). Każda opcja, której tytuł pasuje do wartości, zostanie zaznaczona. Możesz również łączyć wiele inteligentnych tagów oddzielonych pionowymi kreskami." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "Użyj inteligentnego tagu, takiego jak {get_input:colors} i przekaż wartości oddzielone pionowymi kreskami w URL (na przykład ?colors=Red|Blue). Każda opcja, której etykieta pasuje do wartości, zostanie wstępnie wybrana. Możesz również łączyć wiele inteligentnych tagów oddzielonych pionowymi kreskami." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "Użyj inteligentnego tagu, takiego jak {get_input:country}. Pierwsza opcja, której etykieta pasuje do rozwiązanego wartości, zostanie wstępnie wybrana." + +#: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "Ustawienia zostały zapisane, ale atrybuty posta (hasło / tytuł / treść) nie zostały zaktualizowane. Spróbuj ponownie, aby je zachować." + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "Nie udało się zapisać ustawień formularza." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "Zapisywanie…" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." +msgstr "Po włączeniu tego formularza nie będą przechowywane adres IP użytkownika, nazwa przeglądarki i nazwa urządzenia w wpisach." + +#: assets/build/formEditor.js:172 +msgid "Failed to save. Please try again." +msgstr "Nie udało się zapisać. Proszę spróbować ponownie." + +#: assets/build/formEditor.js:172 +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "Klucze API reCAPTCHA dla wybranej wersji nie są skonfigurowane. Ustaw je w Ustawieniach Globalnych." + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "Proszę wybrać wersję reCAPTCHA." + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "Klucze API hCaptcha nie są skonfigurowane. Ustaw je w Ustawieniach Globalnych." + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." +msgstr "Klucze API Cloudflare Turnstile nie są skonfigurowane. Ustaw je w Ustawieniach Globalnych." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "Dane formularza" + +#: assets/build/formEditor.js:172 +msgid "Some fields need attention" +msgstr "Niektóre pola wymagają uwagi" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Unsaved changes" +msgstr "Niezapisane zmiany" + +#: assets/build/formEditor.js:172 +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "Adres e-mail odbiorcy i temat są wymagane przed zapisaniem tego powiadomienia. Popraw wyróżnione pola lub odrzuć zmiany, aby wrócić." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "Masz niezapisane zmiany dla tego powiadomienia. Odrzuć je, aby wrócić, lub zostań, aby je zapisać." + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "Odrzuć i wróć" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "Zostań i napraw" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" +msgstr "Kontynuuj edytowanie" + +#: assets/build/formEditor.js:172 +msgid "Please provide a recipient email address." +msgstr "Proszę podać adres e-mail odbiorcy." + +#: assets/build/formEditor.js:172 +msgid "Please provide a subject line." +msgstr "Proszę podać temat." + +#: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "Proszę podać niestandardowy adres URL." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "Masz niezapisane zmiany. Odrzuć je, aby kontynuować, lub zostań, aby zapisać zmiany." + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "Odrzuć i kontynuuj" + +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "Przełącz na wersję roboczą" + +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "%d formularz został przełączony na wersję roboczą." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "Przełączyć formularz na wersję roboczą?" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "%d formularz zostanie przełączony na wersję roboczą i nie będzie już publicznie dostępny." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "Ten formularz zostanie przełączony na wersję roboczą i nie będzie już publicznie dostępny." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "SureForms nie mógł uwierzytelnić tego żądania. Proszę przeładować edytor i spróbować ponownie." + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "%s — Przekształcona forma" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "Formularz został przekształcony na SureForms za pomocą AI. Przejrzyj nowy formularz pod kątem ewentualnych poprawek." + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "Formularz został przekształcony na SureForms." + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "Nie masz uprawnień do konwersji tego formularza." + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "Ten formularz jest zbyt duży, aby go przekonwertować. Spróbuj uprościć znacznik lub zbudować formularz ręcznie." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "SureForms nie mógł wyprowadzić żadnych pól z tego formularza." + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "Usługa SureForms AI nie mogła przetworzyć tego formularza. Proszę spróbować ponownie lub zbudować formularz ręcznie." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "SureForms otrzymał nieoczekiwaną odpowiedź. Proszę spróbować ponownie." + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "Nie można przekonwertować tego formularza na SureForms. Proszę spróbować ponownie." + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "Konwertowanie…" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "Konwertuj na SureForms" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "Przechwyć dane formularza w trakcie wypełniania, gdy tylko odwiedzający przestaną pisać — nie jest wymagane przesyłanie" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "Odzyskaj porzucone zgłoszenia i skontaktuj się z potencjalnymi klientami, których w przeciwnym razie byś stracił" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "Pozwól odwiedzającym kontynuować od miejsca, w którym przerwali, dzięki bezpiecznym, udostępnialnym linkom do wznawiania" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "Przestań tracić potencjalnych klientów przez porzucone formularze" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "Zobacz, co wpisali odwiedzający, zanim odeszli. Ulepsz do SureForms Premium, aby odblokować częściowe wpisy:" + +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "Domyślne ustawienia globalne" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "Ograniczenia formularza" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "Skonfiguruj domyślne ustawienia, które mają zastosowanie do nowo utworzonych formularzy." + +#: assets/build/settings.js:172 +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " +msgstr "Zbieraj niesensytywne informacje z Twojej strony internetowej, takie jak wersja PHP i używane funkcje, aby pomóc nam szybciej naprawiać błędy, podejmować mądrzejsze decyzje i tworzyć funkcje, które naprawdę mają dla Ciebie znaczenie. " + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." +msgstr "Nie udało się załadować stron. Odśwież i spróbuj ponownie." + +#: assets/build/settings.js:172 +msgid "Failed to load settings. Please refresh and try again." +msgstr "Nie udało się załadować ustawień. Odśwież stronę i spróbuj ponownie." + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "Pola walidacji formularza nie mogą pozostać puste." + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "Adres e-mail odbiorcy jest wymagany, gdy włączone są podsumowania e-mail." + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "Proszę wprowadzić prawidłowy adres e-mail odbiorcy." + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "Ustawienia zapisane." + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "Nie udało się zapisać ustawień." + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "Niektóre ustawienia nie zostały zapisane. Proszę spróbować ponownie." + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." +msgstr "Niektóre pola mają niezapisane zmiany. Odrzuć je, aby kontynuować, lub zostań, aby zapisać swoje edycje." + +#: assets/build/settings.js:172 +msgid "Discard & switch" +msgstr "Odrzuć i przełącz" + +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "Formularze" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "Formularz" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "Formularze" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "Dodaj nowy" @@ -18203,6 +18625,7 @@ msgstr "konto" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "Normalny" diff --git a/languages/sureforms-pt_PT-1cb9ecd067cd971ff5d9db0b4dae2891.json b/languages/sureforms-pt_PT-1cb9ecd067cd971ff5d9db0b4dae2891.json index 170e7854e..b5fc8859d 100644 --- a/languages/sureforms-pt_PT-1cb9ecd067cd971ff5d9db0b4dae2891.json +++ b/languages/sureforms-pt_PT-1cb9ecd067cd971ff5d9db0b4dae2891.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formul\u00e1rio"],"Fields":["Campos"],"Image":["Imagem"],"Activated":["Ativado"],"Activate":["Ativar"],"Submit":["Enviar"],"Global Settings":["Configura\u00e7\u00f5es Globais"],"This field is required.":["Este campo \u00e9 obrigat\u00f3rio."],"Form Title":["T\u00edtulo do Formul\u00e1rio"],"Edit":["Editar"],"Please enter a valid URL.":["Por favor, insira um URL v\u00e1lido."],"Desktop":["\u00c1rea de trabalho"],"Medium":["M\u00e9dio"],"Mobile":["M\u00f3vel"],"Repeat":["Repetir"],"Scroll":["Rolar"],"Signature":["Assinatura"],"Tablet":["Tablet"],"Upload":["Carregar"],"Basic":["B\u00e1sico"],"Form Settings":["Configura\u00e7\u00f5es do Formul\u00e1rio"],"General":["Geral"],"Style":["Estilo"],"Advanced":["Avan\u00e7ado"],"No tags available":["Sem etiquetas dispon\u00edveis"],"Device":["Dispositivo"],"Select Shortcodes":["Selecionar C\u00f3digos Curtos"],"Page Break Label":["R\u00f3tulo de Quebra de P\u00e1gina"],"Next":["Pr\u00f3ximo"],"Back":["Voltar"],"Reset":["Redefinir"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecionar Unidades"],"%s units":["%s unidades"],"Margin":["Margem"],"None":["Nenhum"],"Custom":["Personalizado"],"Please add a option props to MultiButtonsControl":["Por favor, adicione uma op\u00e7\u00e3o de propriedades ao MultiButtonsControl"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Processando\u2026"],"Select Video":["Selecionar V\u00eddeo"],"Change Video":["Alterar V\u00eddeo"],"Select Lottie Animation":["Selecionar Anima\u00e7\u00e3o Lottie"],"Change Lottie Animation":["Alterar Anima\u00e7\u00e3o Lottie"],"Upload SVG":["Carregar SVG"],"Change SVG":["Alterar SVG"],"Select Image":["Selecionar imagem"],"Change Image":["Alterar Imagem"],"Upload SVG?":["Carregar SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Fazer upload de SVG pode ser potencialmente arriscado. Tem certeza?"],"Upload Anyway":["Carregar Mesmo Assim"],"Full Width":["Largura Total"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["A instala\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Plugin activation failed, Please try again later.":["A ativa\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Integrations":["Integra\u00e7\u00f5es"],"%s Removed from Quick Action Bar.":["%s removido da Barra de A\u00e7\u00e3o R\u00e1pida."],"Add to Quick Action Bar":["Adicionar \u00e0 Barra de A\u00e7\u00f5es R\u00e1pidas"],"%s Added to Quick Action Bar.":["%s adicionado \u00e0 barra de a\u00e7\u00f5es r\u00e1pidas."],"Already Present in Quick Action Bar":["J\u00e1 presente na barra de a\u00e7\u00f5es r\u00e1pidas"],"No results found.":["Nenhum resultado encontrado."],"data object is empty":["o objeto de dados est\u00e1 vazio"],"Add blocks to Quick Action Bar":["Adicionar blocos \u00e0 Barra de A\u00e7\u00e3o R\u00e1pida"],"Re-arrange block inside Quick Action Bar":["Reorganizar bloco dentro da Barra de A\u00e7\u00e3o R\u00e1pida"],"Upgrade":["Atualizar"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar e Ativar"],"Compliance Settings":["Configura\u00e7\u00f5es de Conformidade"],"Enable GDPR Compliance":["Ativar conformidade com o GDPR"],"Never store entry data after form submission":["Nunca armazene os dados de entrada ap\u00f3s o envio do formul\u00e1rio"],"When enabled this form will never store Entries.":["Quando ativado, este formul\u00e1rio nunca armazenar\u00e1 entradas."],"Automatically delete entries":["Excluir entradas automaticamente"],"When enabled this form will automatically delete entries after a certain period of time.":["Quando ativado, este formul\u00e1rio excluir\u00e1 automaticamente as entradas ap\u00f3s um determinado per\u00edodo de tempo."],"Entries older than the days set will be deleted automatically.":["As entradas mais antigas do que os dias definidos ser\u00e3o exclu\u00eddas automaticamente."],"Custom CSS":["CSS Personalizado"],"The following CSS styles added below will only apply to this form container.":["Os estilos CSS a seguir adicionados abaixo ser\u00e3o aplicados apenas a este cont\u00eainer de formul\u00e1rio."],"Visual":["Visual"],"HTML":["HTML"],"All Data":["Todos os dados"],"Add Shortcode":["Adicionar Shortcode"],"Form input tags":["Etiquetas de entrada de formul\u00e1rio"],"Comma separated values are also accepted.":["Valores separados por v\u00edrgula tamb\u00e9m s\u00e3o aceitos."],"Email Notification":["Notifica\u00e7\u00e3o por Email"],"Name":["Nome"],"Send Email To":["Enviar Email Para"],"Subject":["Assunto"],"CC":["CC"],"BCC":["Cco"],"Reply To":["Responder a"],"Add Notification":["Adicionar Notifica\u00e7\u00e3o"],"Email Notification disabled successfully.":["Notifica\u00e7\u00e3o por email desativada com sucesso."],"Email Notification enabled successfully.":["Notifica\u00e7\u00e3o por email ativada com sucesso."],"Add Key":["Adicionar Chave"],"Add Value":["Adicionar Valor"],"Add":["Adicionar"],"Confirmation Message":["Mensagem de Confirma\u00e7\u00e3o"],"After Form Submission":["Ap\u00f3s o Envio do Formul\u00e1rio"],"Hide Form":["Ocultar Formul\u00e1rio"],"Reset Form":["Redefinir Formul\u00e1rio"],"Custom URL":["URL personalizada"],"Add Query Parameters":["Adicionar Par\u00e2metros de Consulta"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Selecione se deseja adicionar pares chave-valor para campos de formul\u00e1rio a serem inclu\u00eddos nos par\u00e2metros de consulta"],"Query Parameters":["Par\u00e2metros de Consulta"],"Please select a page.":["Por favor, selecione uma p\u00e1gina."],"Suggestion: URL should use HTTPS":["Sugest\u00e3o: a URL deve usar HTTPS"],"Success Message":["Mensagem de Sucesso"],"Redirect":["Redirecionar"],"Redirect to":["Redirecionar para"],"Page":["P\u00e1gina"],"Form Confirmation":["Confirma\u00e7\u00e3o de Formul\u00e1rio"],"Confirmation Type":["Tipo de Confirma\u00e7\u00e3o"],"Use Labels as Placeholders":["Use r\u00f3tulos como marcadores de posi\u00e7\u00e3o"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["A configura\u00e7\u00e3o acima colocar\u00e1 os r\u00f3tulos dentro dos campos como marcadores de posi\u00e7\u00e3o (quando poss\u00edvel). Esta configura\u00e7\u00e3o s\u00f3 tem efeito na p\u00e1gina ao vivo, n\u00e3o na pr\u00e9-visualiza\u00e7\u00e3o do editor."],"Page Break":["Quebra de p\u00e1gina"],"Show Labels":["Mostrar R\u00f3tulos"],"First Page Label":["Etiqueta da Primeira P\u00e1gina"],"Progress Indicator":["Indicador de Progresso"],"Progress Bar":["Barra de Progresso"],"Connector":["Conector"],"Steps":["Passos"],"Next Button Text":["Texto do Bot\u00e3o Seguinte"],"Back Button Text":["Texto do Bot\u00e3o Voltar"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Tem certeza de que deseja fechar? Suas altera\u00e7\u00f5es n\u00e3o salvas ser\u00e3o perdidas, pois voc\u00ea tem alguns erros de valida\u00e7\u00e3o."],"There are few unsaved changes. Please save your changes to reflect the updates.":["H\u00e1 algumas altera\u00e7\u00f5es n\u00e3o salvas. Por favor, salve suas altera\u00e7\u00f5es para refletir as atualiza\u00e7\u00f5es."],"Form Behavior":["Comportamento do Formul\u00e1rio"],"Clear":["Limpar"],"Select Color":["Selecionar Cor"],"Primary Color":["Cor Prim\u00e1ria"],"Text Color":["Cor do Texto"],"Text Color on Primary":["Cor do Texto no Prim\u00e1rio"],"Field Spacing":["Espa\u00e7amento de Campo"],"Small":["Pequeno"],"Large":["Grande"],"Left":["Esquerda"],"Center":["Centro"],"Right":["Certo"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invis\u00edvel"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Seletor de Data"],"Time Picker":["Seletor de Hora"],"Hidden":["Oculto"],"Slider":["Controle deslizante"],"Rating":["Avalia\u00e7\u00e3o"],"Upgrade to Unlock These Fields":["Atualize para Desbloquear Estes Campos"],"Add Block":["Adicionar Bloco"],"Customize with SureForms":["Personalize com SureForms"],"Page break":["Quebra de p\u00e1gina"],"Previous":["Anterior"],"Thank you":["Obrigado"],"Form submitted successfully!":["Formul\u00e1rio enviado com sucesso!"],"Instant Form":["Formul\u00e1rio Instant\u00e2neo"],"Enable Instant Form":["Ativar Formul\u00e1rio Instant\u00e2neo"],"Enable Preview":["Ativar visualiza\u00e7\u00e3o"],"Show Title":["T\u00edtulo do Show"],"Site Logo":["Logotipo do Site"],"Banner Background":["Fundo do Banner"],"Color":["Cor"],"Upload Image":["Carregar Imagem"],"Background Color":["Cor de Fundo"],"Use banner as page background":["Usar banner como fundo de p\u00e1gina"],"Form Width":["Largura do Formul\u00e1rio"],"URL":["URL"],"URL Slug":["Slug de URL"],"The last part of the URL.":["A \u00faltima parte do URL."],"Learn more.":["Saiba mais."],"SureForms Description":["Descri\u00e7\u00e3o do SureForms"],"Form Options":["Op\u00e7\u00f5es de Formul\u00e1rio"],"Form Shortcode":["C\u00f3digo Curto do Formul\u00e1rio"],"Paste this shortcode on the page or post to render this form.":["Cole este shortcode na p\u00e1gina ou postagem para renderizar este formul\u00e1rio."],"Spam Protection":["Prote\u00e7\u00e3o contra Spam"],"Auto":["Carro"],"Normal":["Normal"],"%":["%"],"Top":["Topo"],"Bottom":["Inferior"],"Solid":["S\u00f3lido"],"Width":["Largura"],"Size":["Tamanho"],"EM":["EM"],"Padding":["Preenchimento"],"Color 1":["Cor 1"],"Color 2":["Cor 2"],"Type":["Digite"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Localiza\u00e7\u00e3o 1"],"Location 2":["Localiza\u00e7\u00e3o 2"],"Angle":["\u00c2ngulo"],"Classic":["Cl\u00e1ssico"],"Gradient":["Gradiente"],"Background":["Fundo"],"Cover":["Cobertura"],"Contain":["Conter"],"Overlay":["Sobreposi\u00e7\u00e3o"],"No Repeat":["Sem repeti\u00e7\u00e3o"],"Overlay Opacity":["Opacidade da Sobreposi\u00e7\u00e3o"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Os nomes das classes devem ser separados por espa\u00e7os. Cada nome de classe n\u00e3o deve come\u00e7ar com um d\u00edgito, h\u00edfen ou sublinhado. Eles podem incluir apenas letras (incluindo caracteres Unicode), n\u00fameros, h\u00edfens e sublinhados."],"Conversational Layout":["Layout Conversacional"],"Unlock Conversational Forms":["Desbloquear Formul\u00e1rios Conversacionais"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Com o Plano SureForms Pro, voc\u00ea pode transformar seus formul\u00e1rios em layouts conversacionais envolventes para uma experi\u00eancia do usu\u00e1rio perfeita."],"Premium":["Premium"],"Overlay Type":["Tipo de Sobreposi\u00e7\u00e3o"],"Image Overlay Color":["Cor de Sobreposi\u00e7\u00e3o da Imagem"],"Image Position":["Posi\u00e7\u00e3o da Imagem"],"Attachment":["Anexo"],"Fixed":["Fixo"],"Blend Mode":["Modo de Mesclagem"],"Multiply":["Multiplicar"],"Screen":["Tela"],"Darken":["Escurecer"],"Lighten":["Iluminar"],"Color Dodge":["Esquiva de Cor"],"Saturation":["Satura\u00e7\u00e3o"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repita-y"],"PX":["PX"],"Button":["Bot\u00e3o"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Conectar com OttoKit"],"SUREFORMS PREMIUM FIELDS":["CAMPOS PREMIUM DO SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["O endere\u00e7o de 'Email de Remetente' atual n\u00e3o corresponde ao nome de dom\u00ednio do seu site (%1$s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endere\u00e7o de Remetente que corresponda ao dom\u00ednio do seu site (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["O endere\u00e7o de 'Email de Remetente' atual n\u00e3o corresponde ao nome de dom\u00ednio do seu site (%s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam."],"We strongly recommend that you install the free ":["Recomendamos fortemente que voc\u00ea instale o gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! O Assistente de Configura\u00e7\u00e3o facilita a corre\u00e7\u00e3o dos seus e-mails."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativamente, tente usar um endere\u00e7o de remetente que corresponda ao dom\u00ednio do seu site (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Por favor, insira um endere\u00e7o de e-mail v\u00e1lido. Suas notifica\u00e7\u00f5es n\u00e3o ser\u00e3o enviadas se o campo n\u00e3o for preenchido corretamente."],"From Name":["De Nome"],"From Email":["De Email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["O endere\u00e7o de 'Email de Remetente' atual pode n\u00e3o corresponder ao nome de dom\u00ednio do seu site (%1$s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endere\u00e7o de Remetente que corresponda ao dom\u00ednio do seu site (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["O endere\u00e7o de 'Email de Remetente' atual pode n\u00e3o corresponder ao nome de dom\u00ednio do seu site (%s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam."],"Border Radius":["Raio da Borda"],"Form Theme":["Tema do Formul\u00e1rio"],"Instant Form Padding":["Preenchimento Instant\u00e2neo de Formul\u00e1rio"],"Instant Form Border Radius":["Raio de Borda do Formul\u00e1rio Instant\u00e2neo"],"Select Gradient":["Selecionar Gradiente"],"Upgrade Now":["Atualize agora"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["As entradas mais antigas que os dias selecionados ser\u00e3o exclu\u00eddas."],"Entries Time Period":["Per\u00edodo de Tempo das Entradas"],"Custom CSS Panel":["Painel de CSS Personalizado"],"Notifications can use only one From Email so please enter a single address.":["As notifica\u00e7\u00f5es podem usar apenas um \u00fanico endere\u00e7o de e-mail de remetente, portanto, insira um \u00fanico endere\u00e7o."],"Email Notifications":["Notifica\u00e7\u00f5es de Email"],"Actions":["A\u00e7\u00f5es"],"Duplicate":["Duplicar"],"Delete":["Excluir"],"Select Page to redirect":["Selecione a p\u00e1gina para redirecionar"],"Search for a page":["Procurar uma p\u00e1gina"],"Select a page":["Selecione uma p\u00e1gina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Login":["Entrar"],"Register":["Registrar"],"Date":["Data"],"Advanced Settings":["Configura\u00e7\u00f5es Avan\u00e7adas"],"Form Restriction":["Restri\u00e7\u00e3o de Formul\u00e1rio"],"Maximum Number of Entries":["N\u00famero M\u00e1ximo de Entradas"],"Maximum Entries":["Entradas M\u00e1ximas"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["A configura\u00e7\u00e3o do Per\u00edodo de Tempo funciona de acordo com o fuso hor\u00e1rio do seu site WordPress. Clique aqui<\/a> para abrir as Configura\u00e7\u00f5es Gerais do WordPress, onde voc\u00ea pode verificar e atualiz\u00e1-lo."],"Click here":["Clique aqui"],"Response Description After Maximum Entries":["Descri\u00e7\u00e3o da Resposta Ap\u00f3s o M\u00e1ximo de Entradas"],"All changes will be saved automatically when you press back.":["Todas as altera\u00e7\u00f5es ser\u00e3o salvas automaticamente quando voc\u00ea pressionar voltar."],"Repeater":["Repetidor"],"OttoKit Settings":["Configura\u00e7\u00f5es do OttoKit"],"Get Started":["Come\u00e7ar"],"Connect Native Integrations with SureForms":["Conecte Integra\u00e7\u00f5es Nativas com SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato esperado para e-mails - email@sureforms.com ou John Doe "],"Payment":["Pagamento"],"%s - Order ID":["%s - ID do Pedido"],"%s - Amount":["%s - Quantidade"],"%s - Customer Email":["%s - Email do Cliente"],"%s - Customer Name":["%s - Nome do Cliente"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["Adicione regras CSS personalizadas para estilizar este formul\u00e1rio espec\u00edfico independentemente dos estilos globais."],"Spam Protection Type":["Tipo de Prote\u00e7\u00e3o contra Spam"],"Select Security Type":["Selecione o Tipo de Seguran\u00e7a"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Nota: Usar diferentes vers\u00f5es do reCAPTCHA (V2 checkbox e V3) na mesma p\u00e1gina criar\u00e1 conflitos entre as vers\u00f5es. Por favor, evite usar diferentes vers\u00f5es na mesma p\u00e1gina."],"Select Version":["Selecionar Vers\u00e3o"],"Please configure the API keys correctly from the settings":["Por favor, configure as chaves da API corretamente nas configura\u00e7\u00f5es"],"Control email alerts sent to admins or users after a form submission.":["Controle os alertas de e-mail enviados aos administradores ou usu\u00e1rios ap\u00f3s o envio de um formul\u00e1rio."],"Customize the confirmation message or redirect the users after submitting the form.":["Personalize a mensagem de confirma\u00e7\u00e3o ou redirecione os usu\u00e1rios ap\u00f3s enviar o formul\u00e1rio."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Defina limites sobre quantas vezes um formul\u00e1rio pode ser enviado e gerencie op\u00e7\u00f5es de conformidade, incluindo GDPR e reten\u00e7\u00e3o de dados."],"Go to OttoKit Settings":["V\u00e1 para as Configura\u00e7\u00f5es do OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Conecte o SureForms com seus aplicativos favoritos para automatizar tarefas e sincronizar dados perfeitamente."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Desbloqueie integra\u00e7\u00f5es poderosas no plano Premium para automatizar seus fluxos de trabalho e conectar o SureForms diretamente com suas ferramentas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Envie envios de formul\u00e1rios diretamente para CRMs, e-mail e plataformas de marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatize tarefas repetitivas com sincroniza\u00e7\u00e3o de dados perfeita."],"Access exclusive native integrations for faster workflows.":["Acesse integra\u00e7\u00f5es nativas exclusivas para fluxos de trabalho mais r\u00e1pidos."],"PDF Generation":["Gera\u00e7\u00e3o de PDF"],"Generate and customize PDF copies of form submissions.":["Gerar e personalizar c\u00f3pias em PDF das submiss\u00f5es de formul\u00e1rios."],"Generate Submission PDFs":["Gerar PDFs de Submiss\u00e3o"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Transforme cada entrada de formul\u00e1rio em um arquivo PDF refinado, tornando-o perfeito para relat\u00f3rios, registros ou compartilhamento."],"Automatically generate PDFs from your form submissions.":["Gerar automaticamente PDFs a partir das suas submiss\u00f5es de formul\u00e1rios."],"Customize PDF templates with your branding.":["Personalize modelos de PDF com sua marca."],"Download or email PDFs instantly.":["Baixe ou envie PDFs por e-mail instantaneamente."],"User Registration":["Registro de Usu\u00e1rio"],"Onboard new users or update existing accounts through beautiful looking forms.":["Integre novos usu\u00e1rios ou atualize contas existentes atrav\u00e9s de formul\u00e1rios visualmente atraentes."],"Register Users with SureForms":["Registrar Usu\u00e1rios com SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Simplifique todo o processo de integra\u00e7\u00e3o de usu\u00e1rios para seus sites com logins e registros perfeitos alimentados por formul\u00e1rios."],"Register new users directly via your form submissions.":["Registre novos usu\u00e1rios diretamente atrav\u00e9s das suas submiss\u00f5es de formul\u00e1rio."],"Create or update existing accounts by mapping form data to user fields.":["Crie ou atualize contas existentes mapeando os dados do formul\u00e1rio para os campos do usu\u00e1rio."],"Assign roles and control access automatically.":["Atribua fun\u00e7\u00f5es e controle o acesso automaticamente."],"Post Feed":["Feed de Publica\u00e7\u00f5es"],"Transform your form submission into WordPress posts.":["Transforme o envio do seu formul\u00e1rio em publica\u00e7\u00f5es do WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Transforme automaticamente envios de formul\u00e1rios em posts, p\u00e1ginas ou tipos de post personalizados no WordPress. Economize tempo e deixe seus formul\u00e1rios publicarem conte\u00fado diretamente."],"Create posts, pages, or CPTs from your form entries.":["Crie posts, p\u00e1ginas ou CPTs a partir das suas entradas de formul\u00e1rio."],"Map form fields to your post fields easily.":["Mapeie os campos do formul\u00e1rio para os campos da sua postagem facilmente."],"Automate the content publishing flow with few simple steps.":["Automatize o fluxo de publica\u00e7\u00e3o de conte\u00fado com alguns passos simples."],"Automations":["Automatiza\u00e7\u00f5es"],"Unlock Advanced Styling":["Desbloquear Estilo Avan\u00e7ado"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Tenha controle total sobre a apar\u00eancia do seu formul\u00e1rio com cores, fontes e layouts personalizados."],"Button Alignment":["Alinhamento do Bot\u00e3o"],"Add Custom CSS Class(es)":["Adicionar Classe(s) CSS Personalizada(s)"],"Set the total number of submissions allowed for this form.":["Defina o n\u00famero total de envios permitidos para este formul\u00e1rio."],"Save & Progress":["Salvar e Progredir"],"Allow users to save their progress and continue form completion later.":["Permitir que os usu\u00e1rios salvem seu progresso e continuem o preenchimento do formul\u00e1rio mais tarde."],"Save & Progress in SureForms":["Salvar & Progresso no SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["D\u00ea aos seus usu\u00e1rios a flexibilidade de preencher formul\u00e1rios no seu pr\u00f3prio ritmo, permitindo que salvem o progresso e retornem a qualquer momento."],"Let users pause long or multi-step forms and continue later.":["Permita que os usu\u00e1rios pausem formul\u00e1rios longos ou com v\u00e1rias etapas e continuem mais tarde."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Reduza o abandono de formul\u00e1rios com links de retomada convenientes e acesse o progresso de qualquer lugar."],"Improve user experience for lengthy, complex, or multi-page forms.":["Melhore a experi\u00eancia do usu\u00e1rio para formul\u00e1rios longos, complexos ou de v\u00e1rias p\u00e1ginas."],"This form is not yet available. Please check back after the scheduled start time.":["Este formul\u00e1rio ainda n\u00e3o est\u00e1 dispon\u00edvel. Por favor, verifique novamente ap\u00f3s o hor\u00e1rio de in\u00edcio programado."],"This form is no longer accepting submissions. The submission period has ended.":["Este formul\u00e1rio n\u00e3o est\u00e1 mais aceitando envios. O per\u00edodo de envio terminou."],"The start date and time must be before the end date and time.":["A data e hora de in\u00edcio devem ser anteriores \u00e0 data e hora de t\u00e9rmino."],"Form Scheduling":["Agendamento de Formul\u00e1rio"],"Enable Form Scheduling":["Ativar agendamento de formul\u00e1rios"],"Set a time period during which this form will be available for submissions.":["Defina um per\u00edodo de tempo durante o qual este formul\u00e1rio estar\u00e1 dispon\u00edvel para submiss\u00f5es."],"Start Date & Time":["Data e Hora de In\u00edcio"],"End Date & Time":["Data e Hora de T\u00e9rmino"],"Response Description Before Start Date":["Descri\u00e7\u00e3o da Resposta Antes da Data de In\u00edcio"],"Response Description After End Date":["Descri\u00e7\u00e3o da Resposta Ap\u00f3s a Data Final"],"Conditional Confirmations":["Confirma\u00e7\u00f5es Condicionais"],"Set up the message or redirect users will see after submitting the form.":["Configure a mensagem ou redirecione os usu\u00e1rios que ver\u00e3o ap\u00f3s enviar o formul\u00e1rio."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Mostre a mensagem certa para o usu\u00e1rio certo com base em como eles respondem. Personalize confirma\u00e7\u00f5es com condi\u00e7\u00f5es inteligentes e guie os usu\u00e1rios para o pr\u00f3ximo melhor passo automaticamente."],"Display different confirmation messages based on form responses.":["Exibir diferentes mensagens de confirma\u00e7\u00e3o com base nas respostas do formul\u00e1rio."],"Redirect users to specific pages or URLs conditionally.":["Redirecione os usu\u00e1rios para p\u00e1ginas ou URLs espec\u00edficos condicionalmente."],"Create personalized thank-you messages without extra forms.":["Crie mensagens de agradecimento personalizadas sem formul\u00e1rios extras."],"Lost Password":["Senha Perdida"],"Reset Password":["Redefinir Senha"],"When enabled, this form will not store user IP, browser name, or device name in entries.":["Quando ativado, este formul\u00e1rio n\u00e3o armazenar\u00e1 o IP do usu\u00e1rio, o nome do navegador ou o nome do dispositivo nas entradas."],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Selecione um servi\u00e7o de prote\u00e7\u00e3o contra spam. Configure as chaves de API nas Configura\u00e7\u00f5es Globais antes de ativar."],"Send as Raw HTML":["Enviar como HTML bruto"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Quando ativado, o corpo do e-mail em HTML ser\u00e1 preservado exatamente como escrito e envolvido em um modelo de e-mail profissional."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["As tags inteligentes que fazem refer\u00eancia a campos enviados pelo usu\u00e1rio n\u00e3o ser\u00e3o escapadas no modo HTML bruto. Evite inserir valores de campos n\u00e3o confi\u00e1veis diretamente no corpo do e-mail."],"Please provide a recipient email address and subject line.":["Por favor, forne\u00e7a um endere\u00e7o de e-mail do destinat\u00e1rio e a linha de assunto."],"Email notification duplicated!":["Notifica\u00e7\u00e3o de e-mail duplicada!"],"Are you sure you want to delete this email notification?":["Tem certeza de que deseja excluir esta notifica\u00e7\u00e3o por e-mail?"],"Email notification deleted!":["Notifica\u00e7\u00e3o de email exclu\u00edda!"],"URL is missing Top Level Domain (TLD).":["O URL est\u00e1 sem o dom\u00ednio de n\u00edvel superior (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Este formul\u00e1rio est\u00e1 agora fechado, pois o n\u00famero m\u00e1ximo de inscri\u00e7\u00f5es foi atingido."],"Publish Your Form":["Publique seu formul\u00e1rio"],"Enable This to Instantly Publish the Form":["Ative isto para publicar o formul\u00e1rio instantaneamente"],"Style Your Instant Form Page Here":["Estilize sua p\u00e1gina de formul\u00e1rio instant\u00e2neo aqui"],"Quizzes":["Question\u00e1rios"],"%s - Description":["%s - Descri\u00e7\u00e3o"],"Choose a spam protection method for this form to prevent unwanted submissions.":["Escolha um m\u00e9todo de prote\u00e7\u00e3o contra spam para este formul\u00e1rio para evitar envios indesejados."],"Send entries to 100+ popular apps.":["Envie entradas para mais de 100 aplicativos populares."],"Build automated workflows that run instantly.":["Crie fluxos de trabalho automatizados que sejam executados instantaneamente."],"Create custom app integrations using our Custom App feature.":["Crie integra\u00e7\u00f5es de aplicativos personalizadas usando nosso recurso de Aplicativo Personalizado."],"Keep your tools in sync automatically.":["Mantenha suas ferramentas sincronizadas automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Isso instalar\u00e1 e ativar\u00e1 o OttoKit no seu site WordPress para habilitar recursos de automa\u00e7\u00e3o."],"Automate Your Forms with OttoKit":["Automatize Seus Formul\u00e1rios com OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada envio de formul\u00e1rio deve acionar algo \u2014 um alerta no Slack, um lead no CRM, um e-mail de acompanhamento ou uma nova linha no Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Crie question\u00e1rios interativos para envolver seu p\u00fablico e coletar insights."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Crie question\u00e1rios envolventes com v\u00e1rios tipos de perguntas, feedback personalizado e pontua\u00e7\u00e3o automatizada para cativar seu p\u00fablico e obter insights valiosos."],"Create interactive quizzes with multiple question types.":["Crie question\u00e1rios interativos com m\u00faltiplos tipos de perguntas."],"Provide personalized feedback based on user responses.":["Forne\u00e7a feedback personalizado com base nas respostas do usu\u00e1rio."],"Automate scoring and lead segmentation for better insights.":["Automatize a pontua\u00e7\u00e3o e a segmenta\u00e7\u00e3o de leads para obter melhores insights."],"Heading 1":["T\u00edtulo 1"],"Heading 2":["T\u00edtulo 2"],"Heading 3":["T\u00edtulo 3"],"Heading 4":["T\u00edtulo 4"],"Heading 5":["T\u00edtulo 5"],"Heading 6":["T\u00edtulo 6"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/formEditor.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"SureForms":["SureForms"],"Status":["Status"],"Form":["Formul\u00e1rio"],"Fields":["Campos"],"Image":["Imagem"],"Activated":["Ativado"],"Activate":["Ativar"],"Submit":["Enviar"],"Global Settings":["Configura\u00e7\u00f5es Globais"],"Form Title":["T\u00edtulo do Formul\u00e1rio"],"Edit":["Editar"],"Please enter a valid URL.":["Por favor, insira um URL v\u00e1lido."],"Desktop":["\u00c1rea de trabalho"],"Medium":["M\u00e9dio"],"Mobile":["M\u00f3vel"],"Repeat":["Repetir"],"Scroll":["Rolar"],"Signature":["Assinatura"],"Tablet":["Tablet"],"Upload":["Carregar"],"Basic":["B\u00e1sico"],"Form Settings":["Configura\u00e7\u00f5es do Formul\u00e1rio"],"General":["Geral"],"Style":["Estilo"],"Advanced":["Avan\u00e7ado"],"No tags available":["Sem etiquetas dispon\u00edveis"],"Device":["Dispositivo"],"Select Shortcodes":["Selecionar C\u00f3digos Curtos"],"Page Break Label":["R\u00f3tulo de Quebra de P\u00e1gina"],"Next":["Pr\u00f3ximo"],"Back":["Voltar"],"Reset":["Redefinir"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecionar Unidades"],"%s units":["%s unidades"],"Margin":["Margem"],"None":["Nenhum"],"Custom":["Personalizado"],"Please add a option props to MultiButtonsControl":["Por favor, adicione uma op\u00e7\u00e3o de propriedades ao MultiButtonsControl"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Processando\u2026"],"Select Video":["Selecionar V\u00eddeo"],"Change Video":["Alterar V\u00eddeo"],"Select Lottie Animation":["Selecionar Anima\u00e7\u00e3o Lottie"],"Change Lottie Animation":["Alterar Anima\u00e7\u00e3o Lottie"],"Upload SVG":["Carregar SVG"],"Change SVG":["Alterar SVG"],"Select Image":["Selecionar imagem"],"Change Image":["Alterar Imagem"],"Upload SVG?":["Carregar SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Fazer upload de SVG pode ser potencialmente arriscado. Tem certeza?"],"Upload Anyway":["Carregar Mesmo Assim"],"Full Width":["Largura Total"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["A instala\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Plugin activation failed, Please try again later.":["A ativa\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Integrations":["Integra\u00e7\u00f5es"],"%s Removed from Quick Action Bar.":["%s removido da Barra de A\u00e7\u00e3o R\u00e1pida."],"Add to Quick Action Bar":["Adicionar \u00e0 Barra de A\u00e7\u00f5es R\u00e1pidas"],"%s Added to Quick Action Bar.":["%s adicionado \u00e0 barra de a\u00e7\u00f5es r\u00e1pidas."],"Already Present in Quick Action Bar":["J\u00e1 presente na barra de a\u00e7\u00f5es r\u00e1pidas"],"No results found.":["Nenhum resultado encontrado."],"data object is empty":["o objeto de dados est\u00e1 vazio"],"Add blocks to Quick Action Bar":["Adicionar blocos \u00e0 Barra de A\u00e7\u00e3o R\u00e1pida"],"Re-arrange block inside Quick Action Bar":["Reorganizar bloco dentro da Barra de A\u00e7\u00e3o R\u00e1pida"],"Upgrade":["Atualizar"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar e Ativar"],"Compliance Settings":["Configura\u00e7\u00f5es de Conformidade"],"Enable GDPR Compliance":["Ativar conformidade com o GDPR"],"Never store entry data after form submission":["Nunca armazene os dados de entrada ap\u00f3s o envio do formul\u00e1rio"],"When enabled this form will never store Entries.":["Quando ativado, este formul\u00e1rio nunca armazenar\u00e1 entradas."],"Automatically delete entries":["Excluir entradas automaticamente"],"When enabled this form will automatically delete entries after a certain period of time.":["Quando ativado, este formul\u00e1rio excluir\u00e1 automaticamente as entradas ap\u00f3s um determinado per\u00edodo de tempo."],"Entries older than the days set will be deleted automatically.":["As entradas mais antigas do que os dias definidos ser\u00e3o exclu\u00eddas automaticamente."],"Custom CSS":["CSS Personalizado"],"The following CSS styles added below will only apply to this form container.":["Os estilos CSS a seguir adicionados abaixo ser\u00e3o aplicados apenas a este cont\u00eainer de formul\u00e1rio."],"Visual":["Visual"],"HTML":["HTML"],"All Data":["Todos os dados"],"Add Shortcode":["Adicionar Shortcode"],"Form input tags":["Etiquetas de entrada de formul\u00e1rio"],"Comma separated values are also accepted.":["Valores separados por v\u00edrgula tamb\u00e9m s\u00e3o aceitos."],"Email Notification":["Notifica\u00e7\u00e3o por Email"],"Name":["Nome"],"Send Email To":["Enviar Email Para"],"Subject":["Assunto"],"CC":["CC"],"BCC":["Cco"],"Reply To":["Responder a"],"Add Notification":["Adicionar Notifica\u00e7\u00e3o"],"Add Key":["Adicionar Chave"],"Add Value":["Adicionar Valor"],"Add":["Adicionar"],"Confirmation Message":["Mensagem de Confirma\u00e7\u00e3o"],"After Form Submission":["Ap\u00f3s o Envio do Formul\u00e1rio"],"Hide Form":["Ocultar Formul\u00e1rio"],"Reset Form":["Redefinir Formul\u00e1rio"],"Custom URL":["URL personalizada"],"Add Query Parameters":["Adicionar Par\u00e2metros de Consulta"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Selecione se deseja adicionar pares chave-valor para campos de formul\u00e1rio a serem inclu\u00eddos nos par\u00e2metros de consulta"],"Query Parameters":["Par\u00e2metros de Consulta"],"Please select a page.":["Por favor, selecione uma p\u00e1gina."],"Suggestion: URL should use HTTPS":["Sugest\u00e3o: a URL deve usar HTTPS"],"Success Message":["Mensagem de Sucesso"],"Redirect":["Redirecionar"],"Redirect to":["Redirecionar para"],"Page":["P\u00e1gina"],"Form Confirmation":["Confirma\u00e7\u00e3o de Formul\u00e1rio"],"Confirmation Type":["Tipo de Confirma\u00e7\u00e3o"],"Use Labels as Placeholders":["Use r\u00f3tulos como marcadores de posi\u00e7\u00e3o"],"Above setting will place the labels inside the fields as placeholders (where possible). This setting takes effect only on the live page, not in the editor preview.":["A configura\u00e7\u00e3o acima colocar\u00e1 os r\u00f3tulos dentro dos campos como marcadores de posi\u00e7\u00e3o (quando poss\u00edvel). Esta configura\u00e7\u00e3o s\u00f3 tem efeito na p\u00e1gina ao vivo, n\u00e3o na pr\u00e9-visualiza\u00e7\u00e3o do editor."],"Page Break":["Quebra de p\u00e1gina"],"Show Labels":["Mostrar R\u00f3tulos"],"First Page Label":["Etiqueta da Primeira P\u00e1gina"],"Progress Indicator":["Indicador de Progresso"],"Progress Bar":["Barra de Progresso"],"Connector":["Conector"],"Steps":["Passos"],"Next Button Text":["Texto do Bot\u00e3o Seguinte"],"Back Button Text":["Texto do Bot\u00e3o Voltar"],"Are you sure you want to close? Your unsaved changes will be lost as you have some validation errors.":["Tem certeza de que deseja fechar? Suas altera\u00e7\u00f5es n\u00e3o salvas ser\u00e3o perdidas, pois voc\u00ea tem alguns erros de valida\u00e7\u00e3o."],"There are few unsaved changes. Please save your changes to reflect the updates.":["H\u00e1 algumas altera\u00e7\u00f5es n\u00e3o salvas. Por favor, salve suas altera\u00e7\u00f5es para refletir as atualiza\u00e7\u00f5es."],"Form Behavior":["Comportamento do Formul\u00e1rio"],"Clear":["Limpar"],"Select Color":["Selecionar Cor"],"Primary Color":["Cor Prim\u00e1ria"],"Text Color":["Cor do Texto"],"Text Color on Primary":["Cor do Texto no Prim\u00e1rio"],"Field Spacing":["Espa\u00e7amento de Campo"],"Small":["Pequeno"],"Large":["Grande"],"Left":["Esquerda"],"Center":["Centro"],"Right":["Certo"],"Google reCAPTCHA":["Google reCAPTCHA"],"CloudFlare Turnstile":["CloudFlare Turnstile"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invis\u00edvel"],"reCAPTCHA v3":["reCAPTCHA v3"],"Date Picker":["Seletor de Data"],"Time Picker":["Seletor de Hora"],"Hidden":["Oculto"],"Slider":["Controle deslizante"],"Rating":["Avalia\u00e7\u00e3o"],"Upgrade to Unlock These Fields":["Atualize para Desbloquear Estes Campos"],"Add Block":["Adicionar Bloco"],"Customize with SureForms":["Personalize com SureForms"],"Page break":["Quebra de p\u00e1gina"],"Previous":["Anterior"],"Thank you":["Obrigado"],"Form submitted successfully!":["Formul\u00e1rio enviado com sucesso!"],"Instant Form":["Formul\u00e1rio Instant\u00e2neo"],"Enable Instant Form":["Ativar Formul\u00e1rio Instant\u00e2neo"],"Enable Preview":["Ativar visualiza\u00e7\u00e3o"],"Show Title":["T\u00edtulo do Show"],"Site Logo":["Logotipo do Site"],"Banner Background":["Fundo do Banner"],"Color":["Cor"],"Upload Image":["Carregar Imagem"],"Background Color":["Cor de Fundo"],"Use banner as page background":["Usar banner como fundo de p\u00e1gina"],"Form Width":["Largura do Formul\u00e1rio"],"URL":["URL"],"URL Slug":["Slug de URL"],"The last part of the URL.":["A \u00faltima parte do URL."],"Learn more.":["Saiba mais."],"SureForms Description":["Descri\u00e7\u00e3o do SureForms"],"Form Options":["Op\u00e7\u00f5es de Formul\u00e1rio"],"Form Shortcode":["C\u00f3digo Curto do Formul\u00e1rio"],"Paste this shortcode on the page or post to render this form.":["Cole este shortcode na p\u00e1gina ou postagem para renderizar este formul\u00e1rio."],"Spam Protection":["Prote\u00e7\u00e3o contra Spam"],"Auto":["Carro"],"Normal":["Normal"],"%":["%"],"Top":["Topo"],"Bottom":["Inferior"],"Solid":["S\u00f3lido"],"Width":["Largura"],"Size":["Tamanho"],"EM":["EM"],"Padding":["Preenchimento"],"Color 1":["Cor 1"],"Color 2":["Cor 2"],"Type":["Digite"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Localiza\u00e7\u00e3o 1"],"Location 2":["Localiza\u00e7\u00e3o 2"],"Angle":["\u00c2ngulo"],"Classic":["Cl\u00e1ssico"],"Gradient":["Gradiente"],"Background":["Fundo"],"Cover":["Cobertura"],"Contain":["Conter"],"Overlay":["Sobreposi\u00e7\u00e3o"],"No Repeat":["Sem repeti\u00e7\u00e3o"],"Overlay Opacity":["Opacidade da Sobreposi\u00e7\u00e3o"],"Class names should be separated by spaces. Each class name must not start with a digit, hyphen, or underscore. They can only include letters (including Unicode characters), numbers, hyphens, and underscores.":["Os nomes das classes devem ser separados por espa\u00e7os. Cada nome de classe n\u00e3o deve come\u00e7ar com um d\u00edgito, h\u00edfen ou sublinhado. Eles podem incluir apenas letras (incluindo caracteres Unicode), n\u00fameros, h\u00edfens e sublinhados."],"Conversational Layout":["Layout Conversacional"],"Unlock Conversational Forms":["Desbloquear Formul\u00e1rios Conversacionais"],"With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience.":["Com o Plano SureForms Pro, voc\u00ea pode transformar seus formul\u00e1rios em layouts conversacionais envolventes para uma experi\u00eancia do usu\u00e1rio perfeita."],"Premium":["Premium"],"Overlay Type":["Tipo de Sobreposi\u00e7\u00e3o"],"Image Overlay Color":["Cor de Sobreposi\u00e7\u00e3o da Imagem"],"Image Position":["Posi\u00e7\u00e3o da Imagem"],"Attachment":["Anexo"],"Fixed":["Fixo"],"Blend Mode":["Modo de Mesclagem"],"Multiply":["Multiplicar"],"Screen":["Tela"],"Darken":["Escurecer"],"Lighten":["Iluminar"],"Color Dodge":["Esquiva de Cor"],"Saturation":["Satura\u00e7\u00e3o"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repita-y"],"PX":["PX"],"Button":["Bot\u00e3o"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Conectar com OttoKit"],"SUREFORMS PREMIUM FIELDS":["CAMPOS PREMIUM DO SUREFORMS"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["O endere\u00e7o de 'Email de Remetente' atual n\u00e3o corresponde ao nome de dom\u00ednio do seu site (%1$s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endere\u00e7o de Remetente que corresponda ao dom\u00ednio do seu site (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["O endere\u00e7o de 'Email de Remetente' atual n\u00e3o corresponde ao nome de dom\u00ednio do seu site (%s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam."],"We strongly recommend that you install the free ":["Recomendamos fortemente que voc\u00ea instale o gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! O Assistente de Configura\u00e7\u00e3o facilita a corre\u00e7\u00e3o dos seus e-mails."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativamente, tente usar um endere\u00e7o de remetente que corresponda ao dom\u00ednio do seu site (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Por favor, insira um endere\u00e7o de e-mail v\u00e1lido. Suas notifica\u00e7\u00f5es n\u00e3o ser\u00e3o enviadas se o campo n\u00e3o for preenchido corretamente."],"From Name":["De Nome"],"From Email":["De Email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["O endere\u00e7o de 'Email de Remetente' atual pode n\u00e3o corresponder ao nome de dom\u00ednio do seu site (%1$s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endere\u00e7o de Remetente que corresponda ao dom\u00ednio do seu site (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["O endere\u00e7o de 'Email de Remetente' atual pode n\u00e3o corresponder ao nome de dom\u00ednio do seu site (%s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam."],"Border Radius":["Raio da Borda"],"Form Theme":["Tema do Formul\u00e1rio"],"Instant Form Padding":["Preenchimento Instant\u00e2neo de Formul\u00e1rio"],"Instant Form Border Radius":["Raio de Borda do Formul\u00e1rio Instant\u00e2neo"],"Select Gradient":["Selecionar Gradiente"],"Upgrade Now":["Atualize agora"],"SureTriggers":["SureTriggers"],"Entries older than the selected days will be deleted.":["As entradas mais antigas que os dias selecionados ser\u00e3o exclu\u00eddas."],"Entries Time Period":["Per\u00edodo de Tempo das Entradas"],"Custom CSS Panel":["Painel de CSS Personalizado"],"Notifications can use only one From Email so please enter a single address.":["As notifica\u00e7\u00f5es podem usar apenas um \u00fanico endere\u00e7o de e-mail de remetente, portanto, insira um \u00fanico endere\u00e7o."],"Email Notifications":["Notifica\u00e7\u00f5es de Email"],"Actions":["A\u00e7\u00f5es"],"Duplicate":["Duplicar"],"Delete":["Excluir"],"Select Page to redirect":["Selecione a p\u00e1gina para redirecionar"],"Search for a page":["Procurar uma p\u00e1gina"],"Select a page":["Selecione uma p\u00e1gina"],"reCAPTCHA v2":["reCAPTCHA v2"],"Save":["Salvar"],"Login":["Entrar"],"Register":["Registrar"],"Date":["Data"],"Advanced Settings":["Configura\u00e7\u00f5es Avan\u00e7adas"],"Form Restriction":["Restri\u00e7\u00e3o de Formul\u00e1rio"],"Maximum Number of Entries":["N\u00famero M\u00e1ximo de Entradas"],"Maximum Entries":["Entradas M\u00e1ximas"],"The Time Period setting works according to your WordPress site's time zone. Click here<\/a> to open your WordPress General Settings, where you can check and update it.":["A configura\u00e7\u00e3o do Per\u00edodo de Tempo funciona de acordo com o fuso hor\u00e1rio do seu site WordPress. Clique aqui<\/a> para abrir as Configura\u00e7\u00f5es Gerais do WordPress, onde voc\u00ea pode verificar e atualiz\u00e1-lo."],"Click here":["Clique aqui"],"Response Description After Maximum Entries":["Descri\u00e7\u00e3o da Resposta Ap\u00f3s o M\u00e1ximo de Entradas"],"All changes will be saved automatically when you press back.":["Todas as altera\u00e7\u00f5es ser\u00e3o salvas automaticamente quando voc\u00ea pressionar voltar."],"Repeater":["Repetidor"],"OttoKit Settings":["Configura\u00e7\u00f5es do OttoKit"],"Get Started":["Come\u00e7ar"],"Connect Native Integrations with SureForms":["Conecte Integra\u00e7\u00f5es Nativas com SureForms"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato esperado para e-mails - email@sureforms.com ou John Doe "],"delete":["excluir"],"Please type \"%s\" in the input box":["Por favor, digite \"%s\" na caixa de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, digite \"%s\" na caixa abaixo:"],"Type \"%s\"":["Digite \"%s\""],"Payment":["Pagamento"],"%s - Order ID":["%s - ID do Pedido"],"%s - Amount":["%s - Quantidade"],"%s - Customer Email":["%s - Email do Cliente"],"%s - Customer Name":["%s - Nome do Cliente"],"%s - Status":["%s - Status"],"Add custom CSS rules to style this specific form independently of global styles.":["Adicione regras CSS personalizadas para estilizar este formul\u00e1rio espec\u00edfico independentemente dos estilos globais."],"Spam Protection Type":["Tipo de Prote\u00e7\u00e3o contra Spam"],"Select Security Type":["Selecione o Tipo de Seguran\u00e7a"],"Note: Using different reCAPTCHA versions (V2 checkbox and V3) on the same page will create conflicts between the versions. Kindly avoid using different versions on the same page.":["Nota: Usar diferentes vers\u00f5es do reCAPTCHA (V2 checkbox e V3) na mesma p\u00e1gina criar\u00e1 conflitos entre as vers\u00f5es. Por favor, evite usar diferentes vers\u00f5es na mesma p\u00e1gina."],"Select Version":["Selecionar Vers\u00e3o"],"Please configure the API keys correctly from the settings":["Por favor, configure as chaves da API corretamente nas configura\u00e7\u00f5es"],"Control email alerts sent to admins or users after a form submission.":["Controle os alertas de e-mail enviados aos administradores ou usu\u00e1rios ap\u00f3s o envio de um formul\u00e1rio."],"Customize the confirmation message or redirect the users after submitting the form.":["Personalize a mensagem de confirma\u00e7\u00e3o ou redirecione os usu\u00e1rios ap\u00f3s enviar o formul\u00e1rio."],"Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.":["Defina limites sobre quantas vezes um formul\u00e1rio pode ser enviado e gerencie op\u00e7\u00f5es de conformidade, incluindo GDPR e reten\u00e7\u00e3o de dados."],"Go to OttoKit Settings":["V\u00e1 para as Configura\u00e7\u00f5es do OttoKit"],"Connect SureForms with your favorite apps to automate tasks and sync data seamlessly.":["Conecte o SureForms com seus aplicativos favoritos para automatizar tarefas e sincronizar dados perfeitamente."],"Unlock powerful integrations in the Premimum plan to automate your workflows and connect SureForms directly with your favorite tools.":["Desbloqueie integra\u00e7\u00f5es poderosas no plano Premium para automatizar seus fluxos de trabalho e conectar o SureForms diretamente com suas ferramentas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms.":["Envie envios de formul\u00e1rios diretamente para CRMs, e-mail e plataformas de marketing."],"Automate repetitive tasks with seamless data syncing.":["Automatize tarefas repetitivas com sincroniza\u00e7\u00e3o de dados perfeita."],"Access exclusive native integrations for faster workflows.":["Acesse integra\u00e7\u00f5es nativas exclusivas para fluxos de trabalho mais r\u00e1pidos."],"PDF Generation":["Gera\u00e7\u00e3o de PDF"],"Generate and customize PDF copies of form submissions.":["Gerar e personalizar c\u00f3pias em PDF das submiss\u00f5es de formul\u00e1rios."],"Generate Submission PDFs":["Gerar PDFs de Submiss\u00e3o"],"Turn every form entry into a polished PDF file, making it perfect for reports, records, or sharing.":["Transforme cada entrada de formul\u00e1rio em um arquivo PDF refinado, tornando-o perfeito para relat\u00f3rios, registros ou compartilhamento."],"Automatically generate PDFs from your form submissions.":["Gerar automaticamente PDFs a partir das suas submiss\u00f5es de formul\u00e1rios."],"Customize PDF templates with your branding.":["Personalize modelos de PDF com sua marca."],"Download or email PDFs instantly.":["Baixe ou envie PDFs por e-mail instantaneamente."],"User Registration":["Registro de Usu\u00e1rio"],"Onboard new users or update existing accounts through beautiful looking forms.":["Integre novos usu\u00e1rios ou atualize contas existentes atrav\u00e9s de formul\u00e1rios visualmente atraentes."],"Register Users with SureForms":["Registrar Usu\u00e1rios com SureForms"],"Streamline the entire user onboarding process for your sites with seamless form-powered logins and registrations.":["Simplifique todo o processo de integra\u00e7\u00e3o de usu\u00e1rios para seus sites com logins e registros perfeitos alimentados por formul\u00e1rios."],"Register new users directly via your form submissions.":["Registre novos usu\u00e1rios diretamente atrav\u00e9s das suas submiss\u00f5es de formul\u00e1rio."],"Create or update existing accounts by mapping form data to user fields.":["Crie ou atualize contas existentes mapeando os dados do formul\u00e1rio para os campos do usu\u00e1rio."],"Assign roles and control access automatically.":["Atribua fun\u00e7\u00f5es e controle o acesso automaticamente."],"Post Feed":["Feed de Publica\u00e7\u00f5es"],"Transform your form submission into WordPress posts.":["Transforme o envio do seu formul\u00e1rio em publica\u00e7\u00f5es do WordPress."],"Automatically turn form submissions into WordPress posts, pages, or custom post types. Save big on time and let your forms publish content directly.":["Transforme automaticamente envios de formul\u00e1rios em posts, p\u00e1ginas ou tipos de post personalizados no WordPress. Economize tempo e deixe seus formul\u00e1rios publicarem conte\u00fado diretamente."],"Create posts, pages, or CPTs from your form entries.":["Crie posts, p\u00e1ginas ou CPTs a partir das suas entradas de formul\u00e1rio."],"Map form fields to your post fields easily.":["Mapeie os campos do formul\u00e1rio para os campos da sua postagem facilmente."],"Automate the content publishing flow with few simple steps.":["Automatize o fluxo de publica\u00e7\u00e3o de conte\u00fado com alguns passos simples."],"Automations":["Automatiza\u00e7\u00f5es"],"Unlock Advanced Styling":["Desbloquear Estilo Avan\u00e7ado"],"Get full control over your form's look with custom colors, fonts, and layouts.":["Tenha controle total sobre a apar\u00eancia do seu formul\u00e1rio com cores, fontes e layouts personalizados."],"Button Alignment":["Alinhamento do Bot\u00e3o"],"Add Custom CSS Class(es)":["Adicionar Classe(s) CSS Personalizada(s)"],"Set the total number of submissions allowed for this form.":["Defina o n\u00famero total de envios permitidos para este formul\u00e1rio."],"Save & Progress":["Salvar e Progredir"],"Allow users to save their progress and continue form completion later.":["Permitir que os usu\u00e1rios salvem seu progresso e continuem o preenchimento do formul\u00e1rio mais tarde."],"Save & Progress in SureForms":["Salvar & Progresso no SureForms"],"Give your users the flexibility to complete forms at their own pace by allowing them to save progress and return anytime.":["D\u00ea aos seus usu\u00e1rios a flexibilidade de preencher formul\u00e1rios no seu pr\u00f3prio ritmo, permitindo que salvem o progresso e retornem a qualquer momento."],"Let users pause long or multi-step forms and continue later.":["Permita que os usu\u00e1rios pausem formul\u00e1rios longos ou com v\u00e1rias etapas e continuem mais tarde."],"Reduce form abandonment with convenient resume links and access their progress from anywhere.":["Reduza o abandono de formul\u00e1rios com links de retomada convenientes e acesse o progresso de qualquer lugar."],"Improve user experience for lengthy, complex, or multi-page forms.":["Melhore a experi\u00eancia do usu\u00e1rio para formul\u00e1rios longos, complexos ou de v\u00e1rias p\u00e1ginas."],"This form is not yet available. Please check back after the scheduled start time.":["Este formul\u00e1rio ainda n\u00e3o est\u00e1 dispon\u00edvel. Por favor, verifique novamente ap\u00f3s o hor\u00e1rio de in\u00edcio programado."],"This form is no longer accepting submissions. The submission period has ended.":["Este formul\u00e1rio n\u00e3o est\u00e1 mais aceitando envios. O per\u00edodo de envio terminou."],"The start date and time must be before the end date and time.":["A data e hora de in\u00edcio devem ser anteriores \u00e0 data e hora de t\u00e9rmino."],"Form Scheduling":["Agendamento de Formul\u00e1rio"],"Enable Form Scheduling":["Ativar agendamento de formul\u00e1rios"],"Set a time period during which this form will be available for submissions.":["Defina um per\u00edodo de tempo durante o qual este formul\u00e1rio estar\u00e1 dispon\u00edvel para submiss\u00f5es."],"Start Date & Time":["Data e Hora de In\u00edcio"],"End Date & Time":["Data e Hora de T\u00e9rmino"],"Response Description Before Start Date":["Descri\u00e7\u00e3o da Resposta Antes da Data de In\u00edcio"],"Response Description After End Date":["Descri\u00e7\u00e3o da Resposta Ap\u00f3s a Data Final"],"Conditional Confirmations":["Confirma\u00e7\u00f5es Condicionais"],"Set up the message or redirect users will see after submitting the form.":["Configure a mensagem ou redirecione os usu\u00e1rios que ver\u00e3o ap\u00f3s enviar o formul\u00e1rio."],"Show the right message to the right user based on how they respond. Personalize confirmations with smart conditions and guide users to the next best step automatically.":["Mostre a mensagem certa para o usu\u00e1rio certo com base em como eles respondem. Personalize confirma\u00e7\u00f5es com condi\u00e7\u00f5es inteligentes e guie os usu\u00e1rios para o pr\u00f3ximo melhor passo automaticamente."],"Display different confirmation messages based on form responses.":["Exibir diferentes mensagens de confirma\u00e7\u00e3o com base nas respostas do formul\u00e1rio."],"Redirect users to specific pages or URLs conditionally.":["Redirecione os usu\u00e1rios para p\u00e1ginas ou URLs espec\u00edficos condicionalmente."],"Create personalized thank-you messages without extra forms.":["Crie mensagens de agradecimento personalizadas sem formul\u00e1rios extras."],"Lost Password":["Senha Perdida"],"Reset Password":["Redefinir Senha"],"Select a spam protection service. Configure API keys in Global Settings before enabling.":["Selecione um servi\u00e7o de prote\u00e7\u00e3o contra spam. Configure as chaves de API nas Configura\u00e7\u00f5es Globais antes de ativar."],"Send as Raw HTML":["Enviar como HTML bruto"],"When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.":["Quando ativado, o corpo do e-mail em HTML ser\u00e1 preservado exatamente como escrito e envolvido em um modelo de e-mail profissional."],"Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.":["As tags inteligentes que fazem refer\u00eancia a campos enviados pelo usu\u00e1rio n\u00e3o ser\u00e3o escapadas no modo HTML bruto. Evite inserir valores de campos n\u00e3o confi\u00e1veis diretamente no corpo do e-mail."],"Please provide a recipient email address and subject line.":["Por favor, forne\u00e7a um endere\u00e7o de e-mail do destinat\u00e1rio e a linha de assunto."],"Email notification duplicated!":["Notifica\u00e7\u00e3o de e-mail duplicada!"],"Are you sure you want to delete this email notification?":["Tem certeza de que deseja excluir esta notifica\u00e7\u00e3o por e-mail?"],"Email notification deleted!":["Notifica\u00e7\u00e3o de email exclu\u00edda!"],"URL is missing Top Level Domain (TLD).":["O URL est\u00e1 sem o dom\u00ednio de n\u00edvel superior (TLD)."],"This form is now closed as the maximum number of entries has been received.":["Este formul\u00e1rio est\u00e1 agora fechado, pois o n\u00famero m\u00e1ximo de inscri\u00e7\u00f5es foi atingido."],"Publish Your Form":["Publique seu formul\u00e1rio"],"Enable This to Instantly Publish the Form":["Ative isto para publicar o formul\u00e1rio instantaneamente"],"Style Your Instant Form Page Here":["Estilize sua p\u00e1gina de formul\u00e1rio instant\u00e2neo aqui"],"Quizzes":["Question\u00e1rios"],"%s - Description":["%s - Descri\u00e7\u00e3o"],"Send entries to 100+ popular apps.":["Envie entradas para mais de 100 aplicativos populares."],"Build automated workflows that run instantly.":["Crie fluxos de trabalho automatizados que sejam executados instantaneamente."],"Create custom app integrations using our Custom App feature.":["Crie integra\u00e7\u00f5es de aplicativos personalizadas usando nosso recurso de Aplicativo Personalizado."],"Keep your tools in sync automatically.":["Mantenha suas ferramentas sincronizadas automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Isso instalar\u00e1 e ativar\u00e1 o OttoKit no seu site WordPress para habilitar recursos de automa\u00e7\u00e3o."],"Automate Your Forms with OttoKit":["Automatize Seus Formul\u00e1rios com OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada envio de formul\u00e1rio deve acionar algo \u2014 um alerta no Slack, um lead no CRM, um e-mail de acompanhamento ou uma nova linha no Google Sheets."],"Create interactive quizzes to engage your audience and gather insights.":["Crie question\u00e1rios interativos para envolver seu p\u00fablico e coletar insights."],"Design engaging quizzes with various question types, personalized feedback, and automated scoring to captivate your audience and gain valuable insights.":["Crie question\u00e1rios envolventes com v\u00e1rios tipos de perguntas, feedback personalizado e pontua\u00e7\u00e3o automatizada para cativar seu p\u00fablico e obter insights valiosos."],"Create interactive quizzes with multiple question types.":["Crie question\u00e1rios interativos com m\u00faltiplos tipos de perguntas."],"Provide personalized feedback based on user responses.":["Forne\u00e7a feedback personalizado com base nas respostas do usu\u00e1rio."],"Automate scoring and lead segmentation for better insights.":["Automatize a pontua\u00e7\u00e3o e a segmenta\u00e7\u00e3o de leads para obter melhores insights."],"Heading 1":["T\u00edtulo 1"],"Heading 2":["T\u00edtulo 2"],"Heading 3":["T\u00edtulo 3"],"Heading 4":["T\u00edtulo 4"],"Heading 5":["T\u00edtulo 5"],"Heading 6":["T\u00edtulo 6"],"Form settings saved.":["Configura\u00e7\u00f5es do formul\u00e1rio salvas."],"The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature.":["O limite de entrada depende de entradas armazenadas para contar as submiss\u00f5es. Enquanto as Configura\u00e7\u00f5es de Conformidade tiverem \"Nunca armazenar dados de entrada ap\u00f3s o envio do formul\u00e1rio\" ativado, esse limite n\u00e3o ser\u00e1 aplicado. Desative essa op\u00e7\u00e3o ou remova o limite de entrada para usar este recurso."],"Settings saved, but post attributes (password \/ title \/ content) failed to update. Retry to persist them.":["Configura\u00e7\u00f5es salvas, mas os atributos da postagem (senha \/ t\u00edtulo \/ conte\u00fado) n\u00e3o foram atualizados. Tente novamente para persistir."],"Failed to save form settings.":["Falha ao salvar as configura\u00e7\u00f5es do formul\u00e1rio."],"Saving\u2026":["Salvando\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Quando ativado, este formul\u00e1rio n\u00e3o armazenar\u00e1 o IP do usu\u00e1rio, o nome do navegador e o nome do dispositivo nas entradas."],"Failed to save. Please try again.":["Falha ao salvar. Por favor, tente novamente."],"reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.":["As chaves da API reCAPTCHA para a vers\u00e3o selecionada n\u00e3o est\u00e3o configuradas. Defina-as nas Configura\u00e7\u00f5es Globais."],"Please select a reCAPTCHA version.":["Por favor, selecione uma vers\u00e3o do reCAPTCHA."],"hCaptcha API keys are not configured. Set them in Global Settings.":["As chaves da API do hCaptcha n\u00e3o est\u00e3o configuradas. Defina-as nas Configura\u00e7\u00f5es Globais."],"Cloudflare Turnstile API keys are not configured. Set them in Global Settings.":["As chaves da API do Cloudflare Turnstile n\u00e3o est\u00e3o configuradas. Defina-as nas Configura\u00e7\u00f5es Globais."],"Form data":["Dados do formul\u00e1rio"],"Some fields need attention":["Alguns campos precisam de aten\u00e7\u00e3o"],"Unsaved changes":["Altera\u00e7\u00f5es n\u00e3o salvas"],"A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.":["Um endere\u00e7o de e-mail do destinat\u00e1rio e uma linha de assunto s\u00e3o necess\u00e1rios antes que esta notifica\u00e7\u00e3o possa ser salva. Corrija os campos destacados ou descarte suas altera\u00e7\u00f5es para voltar."],"You have unsaved changes for this notification. Discard them to go back, or stay to save them.":["Voc\u00ea tem altera\u00e7\u00f5es n\u00e3o salvas para esta notifica\u00e7\u00e3o. Descarte-as para voltar ou permane\u00e7a para salv\u00e1-las."],"Discard & go back":["Descartar e voltar"],"Stay & fix":["Fique e conserte"],"Keep editing":["Continue editando"],"Please provide a recipient email address.":["Por favor, forne\u00e7a um endere\u00e7o de e-mail do destinat\u00e1rio."],"Please provide a subject line.":["Por favor, forne\u00e7a uma linha de assunto."],"Please provide a custom URL.":["Por favor, forne\u00e7a um URL personalizado."],"You have unsaved changes. Discard them to continue, or stay to save your changes.":["Voc\u00ea tem altera\u00e7\u00f5es n\u00e3o salvas. Descarte-as para continuar ou permane\u00e7a para salvar suas altera\u00e7\u00f5es."],"Discard & continue":["Descartar e continuar"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-pt_PT-46b85b18ab0a35677f7beff46af30190.json b/languages/sureforms-pt_PT-46b85b18ab0a35677f7beff46af30190.json new file mode 100644 index 000000000..b261a5529 --- /dev/null +++ b/languages/sureforms-pt_PT-46b85b18ab0a35677f7beff46af30190.json @@ -0,0 +1 @@ +{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/htmlFormDetector.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Converted form":["Forma convertida"],"SureForms could not authenticate this request. Please reload the editor and try again.":["SureForms n\u00e3o conseguiu autenticar esta solicita\u00e7\u00e3o. Por favor, recarregue o editor e tente novamente."],"%s \u2014 Converted form":["%s \u2014 Forma convertida"],"Form converted to SureForms using AI. Review the new form for any tweaks.":["Formul\u00e1rio convertido para SureForms usando IA. Revise o novo formul\u00e1rio para quaisquer ajustes."],"Form converted to SureForms.":["Formul\u00e1rio convertido para SureForms."],"You do not have permission to convert this form.":["Voc\u00ea n\u00e3o tem permiss\u00e3o para converter este formul\u00e1rio."],"This form is too large to convert. Try simplifying the markup or building the form manually.":["Este formul\u00e1rio \u00e9 muito grande para converter. Tente simplificar a marca\u00e7\u00e3o ou construir o formul\u00e1rio manualmente."],"SureForms could not derive any fields from this form.":["O SureForms n\u00e3o conseguiu derivar nenhum campo deste formul\u00e1rio."],"The SureForms AI service could not process this form. Please try again or build the form manually.":["O servi\u00e7o SureForms AI n\u00e3o conseguiu processar este formul\u00e1rio. Por favor, tente novamente ou construa o formul\u00e1rio manualmente."],"SureForms received an unexpected response. Please try again.":["SureForms recebeu uma resposta inesperada. Por favor, tente novamente."],"Could not convert this form to SureForms. Please try again.":["N\u00e3o foi poss\u00edvel converter este formul\u00e1rio para SureForms. Por favor, tente novamente."],"Converting\u2026":["A converter\u2026"],"Convert to SureForms":["Converter para SureForms"]}}} \ No newline at end of file diff --git a/languages/sureforms-pt_PT-4b62e3f004dea2c587b5a3069263d994.json b/languages/sureforms-pt_PT-4b62e3f004dea2c587b5a3069263d994.json index 5193e1963..11dec6f36 100644 --- a/languages/sureforms-pt_PT-4b62e3f004dea2c587b5a3069263d994.json +++ b/languages/sureforms-pt_PT-4b62e3f004dea2c587b5a3069263d994.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Configura\u00e7\u00f5es"],"Search":["Pesquisar"],"Fields":["Campos"],"Image":["Imagem"],"Submit":["Enviar"],"Required":["Obrigat\u00f3rio"],"Form Title":["T\u00edtulo do Formul\u00e1rio"],"Show":["Mostrar"],"Hide":["Esconder"],"Edit Form":["Editar Formul\u00e1rio"],"Icon":["\u00cdcone"],"Desktop":["\u00c1rea de trabalho"],"Medium":["M\u00e9dio"],"Mobile":["M\u00f3vel"],"Repeat":["Repetir"],"Scroll":["Rolar"],"Tablet":["Tablet"],"Basic":["B\u00e1sico"],"(no title)":["(sem t\u00edtulo)"],"Select a Form":["Selecione um Formul\u00e1rio"],"No forms found\u2026":["Nenhum formul\u00e1rio encontrado\u2026"],"Choose":["Escolher"],"Create New":["Criar Novo"],"Change Form":["Alterar Formul\u00e1rio"],"This form has been deleted or is unavailable.":["Este formul\u00e1rio foi exclu\u00eddo ou est\u00e1 indispon\u00edvel."],"Form Settings":["Configura\u00e7\u00f5es do Formul\u00e1rio"],"Show Form Title on this Page":["Mostrar t\u00edtulo do formul\u00e1rio nesta p\u00e1gina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Nota: Para editar SureForms, consulte o Editor de SureForms -"],"Field preview":["Pr\u00e9-visualiza\u00e7\u00e3o do campo"],"General":["Geral"],"Style":["Estilo"],"Advanced":["Avan\u00e7ado"],"No tags available":["Sem etiquetas dispon\u00edveis"],"Device":["Dispositivo"],"Select Shortcodes":["Selecionar C\u00f3digos Curtos"],"Page Break Label":["R\u00f3tulo de Quebra de P\u00e1gina"],"Next":["Pr\u00f3ximo"],"Back":["Voltar"],"Reset":["Redefinir"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecionar Unidades"],"%s units":["%s unidades"],"Margin":["Margem"],"Attributes":["Atributos"],"Input Pattern":["Padr\u00e3o de Entrada"],"None":["Nenhum"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personalizado"],"Custom Mask":["M\u00e1scara Personalizada"],"Please check the documentation to manage custom input pattern ":["Por favor, verifique a documenta\u00e7\u00e3o para gerenciar o padr\u00e3o de entrada personalizado"],"here":["aqui"],"Default Value":["Valor Padr\u00e3o"],"Error Message":["Mensagem de Erro"],"Help Text":["Texto de Ajuda"],"Number Format":["Formato de N\u00famero"],"US Style (Eg: 9,999.99)":["Estilo dos EUA (Ex: 9.999,99)"],"EU Style (Eg: 9.999,99)":["Estilo da UE (Ex: 9.999,99)"],"Minimum Value":["Valor M\u00ednimo"],"Maximum Value":["Valor M\u00e1ximo"],"Please check the Minimum and Maximum value":["Por favor, verifique o valor M\u00ednimo e M\u00e1ximo"],"Enable Email Confirmation":["Ativar Confirma\u00e7\u00e3o de E-mail"],"Checked by Default":["Marcado por padr\u00e3o"],"Error message":["Mensagem de erro"],"Checked by default":["Marcado por padr\u00e3o"],"Please add a option props to MultiButtonsControl":["Por favor, adicione uma op\u00e7\u00e3o de propriedades ao MultiButtonsControl"],"Icon Library":["Biblioteca de \u00cdcones"],"Close":["Fechar"],"All Icons":["Todas as \u00cdcones"],"Other":["Outro"],"No Icons Found":["Nenhum \u00edcone encontrado"],"Insert Icon":["Inserir \u00cdcone"],"Change Icon":["Alterar \u00cdcone"],"Choose Icon":["Escolher \u00cdcone"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Processando\u2026"],"Select Video":["Selecionar V\u00eddeo"],"Change Video":["Alterar V\u00eddeo"],"Select Lottie Animation":["Selecionar Anima\u00e7\u00e3o Lottie"],"Change Lottie Animation":["Alterar Anima\u00e7\u00e3o Lottie"],"Upload SVG":["Carregar SVG"],"Change SVG":["Alterar SVG"],"Select Image":["Selecionar imagem"],"Change Image":["Alterar Imagem"],"Upload SVG?":["Carregar SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Fazer upload de SVG pode ser potencialmente arriscado. Tem certeza?"],"Upload Anyway":["Carregar Mesmo Assim"],"Bulk Add":["Adicionar em Massa"],"Bulk Add Options":["Adicionar Op\u00e7\u00f5es em Massa"],"Enter each option on a new line.":["Digite cada op\u00e7\u00e3o em uma nova linha."],"Insert Options":["Inserir Op\u00e7\u00f5es"],"Full Width":["Largura Total"],"Option Type":["Tipo de Op\u00e7\u00e3o"],"Edit Options":["Editar Op\u00e7\u00f5es"],"Add New Option":["Adicionar nova op\u00e7\u00e3o"],"ADD":["ADICIONAR"],"Enable Auto Country Detection":["Ativar Detec\u00e7\u00e3o Autom\u00e1tica de Pa\u00eds"],"%s Width":["Largura %s"],"Upgrade":["Atualizar"],"Clear":["Limpar"],"Select Color":["Selecionar Cor"],"Primary Color":["Cor Prim\u00e1ria"],"Text Color":["Cor do Texto"],"Field Spacing":["Espa\u00e7amento de Campo"],"Small":["Pequeno"],"Large":["Grande"],"Left":["Esquerda"],"Center":["Centro"],"Right":["Certo"],"Color":["Cor"],"Background Color":["Cor de Fundo"],"Auto":["Carro"],"Default":["Padr\u00e3o"],"Normal":["Normal"],"%":["%"],"Top":["Topo"],"Bottom":["Inferior"],"Width":["Largura"],"Size":["Tamanho"],"EM":["EM"],"Padding":["Preenchimento"],"Color 1":["Cor 1"],"Color 2":["Cor 2"],"Type":["Digite"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Localiza\u00e7\u00e3o 1"],"Location 2":["Localiza\u00e7\u00e3o 2"],"Angle":["\u00c2ngulo"],"Classic":["Cl\u00e1ssico"],"Gradient":["Gradiente"],"Horizontal":["Horizontal"],"Vertical":["Vertical"],"Background":["Fundo"],"Cover":["Cobertura"],"Contain":["Conter"],"Layout":["Layout"],"Overlay":["Sobreposi\u00e7\u00e3o"],"No Repeat":["Sem repeti\u00e7\u00e3o"],"Overlay Opacity":["Opacidade da Sobreposi\u00e7\u00e3o"],"Conditional Logic":["L\u00f3gica Condicional"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Fa\u00e7a upgrade para o Plano Starter do SureForms para criar formul\u00e1rios din\u00e2micos que se adaptam com base nas entradas do usu\u00e1rio, oferecendo uma experi\u00eancia de formul\u00e1rio personalizada e eficiente."],"Enable Conditional Logic":["Ativar L\u00f3gica Condicional"],"this field if":["este campo se"],"Configure Conditions":["Configurar Condi\u00e7\u00f5es"],"Premium":["Premium"],"Overlay Type":["Tipo de Sobreposi\u00e7\u00e3o"],"Image Overlay Color":["Cor de Sobreposi\u00e7\u00e3o da Imagem"],"Image Position":["Posi\u00e7\u00e3o da Imagem"],"Attachment":["Anexo"],"Fixed":["Fixo"],"Blend Mode":["Modo de Mesclagem"],"Multiply":["Multiplicar"],"Screen":["Tela"],"Darken":["Escurecer"],"Lighten":["Iluminar"],"Color Dodge":["Esquiva de Cor"],"Saturation":["Satura\u00e7\u00e3o"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repita-y"],"PX":["PX"],"Button":["Bot\u00e3o"],"Prefix Label":["R\u00f3tulo de Prefixo"],"Suffix Label":["R\u00f3tulo de Sufixo"],"Border Radius":["Raio da Borda"],"Form Theme":["Tema do Formul\u00e1rio"],"Select Gradient":["Selecionar Gradiente"],"Unlock Conditional Logic Editor":["Desbloquear Editor de L\u00f3gica Condicional"],"Rich Text Editor":["Editor de Texto Rico"],"Read Only":["Apenas leitura"],"Select Country":["Selecionar Pa\u00eds"],"Default Country":["Pa\u00eds Padr\u00e3o"],"Subscription":["Assinatura"],"One Time":["Uma Vez"],"Unique Entry":["Entrada \u00danica"],"Maximum Characters":["M\u00e1ximo de caracteres"],"Textarea Height":["Altura da \u00c1rea de Texto"],"Minimum Selections":["Sele\u00e7\u00f5es M\u00ednimas"],"Maximum Selections":["Sele\u00e7\u00f5es M\u00e1ximas"],"Add Numeric Values to Options":["Adicionar valores num\u00e9ricos \u00e0s op\u00e7\u00f5es"],"Single Choice Only":["Apenas uma escolha"],"Enable Dropdown Search":["Ativar Pesquisa em Dropdown"],"Allow Multiple":["Permitir M\u00faltiplos"],"%1$s fields are required. Please configure these fields in the block settings.":["Os campos %1$s s\u00e3o obrigat\u00f3rios. Por favor, configure esses campos nas configura\u00e7\u00f5es do bloco."],"%1$s field is required. Please configure this field in the block settings.":["O campo %1$s \u00e9 obrigat\u00f3rio. Por favor, configure este campo nas configura\u00e7\u00f5es do bloco."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Voc\u00ea precisa configurar uma conta de pagamento para coletar pagamentos deste formul\u00e1rio. Por favor, configure seu provedor de pagamento para continuar."],"Configure Payment Account":["Configurar Conta de Pagamento"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Este \u00e9 um espa\u00e7o reservado para o bloco de Pagamento. Os campos de pagamento reais para o(s) provedor(es) de pagamento configurado(s) s\u00f3 aparecer\u00e3o quando voc\u00ea visualizar ou publicar o formul\u00e1rio."],"2 Payments":["2 Pagamentos"],"3 Payments":["3 Pagamentos"],"4 Payments":["4 Pagamentos"],"5 Payments":["5 Pagamentos"],"Never":["Nunca"],"Stop Subscription After":["Parar Assinatura Ap\u00f3s"],"Choose when to automatically stop the subscription":["Escolha quando parar automaticamente a assinatura"],"Number of Payments":["N\u00famero de Pagamentos"],"Enter a number between 1 to 100":["Insira um n\u00famero entre 1 e 100"],"Form Field":["Campo de Formul\u00e1rio"],"Payment Type":["Tipo de Pagamento"],"Subscription Plan Name":["Nome do Plano de Assinatura"],"Billing Interval":["Intervalo de Cobran\u00e7a"],"Daily":["Diariamente"],"Weekly":["Semanalmente"],"Monthly":["Mensal"],"Quarterly":["Trimestral"],"Yearly":["Anual"],"Amount Type":["Tipo de Quantia"],"Fixed Amount":["Quantia Fixa"],"Dynamic Amount":["Montante Din\u00e2mico"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Escolha entre cobrar um valor fixo ou cobrar o valor com base na entrada do usu\u00e1rio em outros campos do formul\u00e1rio."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Defina o valor exato que deseja cobrar. Os usu\u00e1rios n\u00e3o poder\u00e3o alter\u00e1-lo"],"Choose Amount Field":["Escolher Campo de Quantidade"],"Select a field\u2026":["Selecione um campo\u2026"],"Minimum Amount":["Quantidade M\u00ednima"],"Set the minimum amount users can enter (0 for no minimum)":["Defina o valor m\u00ednimo que os usu\u00e1rios podem inserir (0 para sem m\u00ednimo)"],"Customer Name Field (Required)":["Campo Nome do Cliente (Obrigat\u00f3rio)"],"Customer Name Field (Optional)":["Campo Nome do Cliente (Opcional)"],"Select the input field that contains the customer name (Required for subscriptions)":["Selecione o campo de entrada que cont\u00e9m o nome do cliente (Obrigat\u00f3rio para assinaturas)"],"Select the input field that contains the customer name":["Selecione o campo de entrada que cont\u00e9m o nome do cliente"],"Customer Email Field (Required)":["Campo de Email do Cliente (Obrigat\u00f3rio)"],"Select the email field that contains the customer email":["Selecione o campo de email que cont\u00e9m o email do cliente"],"Payment":["Pagamento"],"%s - Order ID":["%s - ID do Pedido"],"%s - Amount":["%s - Quantidade"],"%s - Customer Email":["%s - Email do Cliente"],"%s - Customer Name":["%s - Nome do Cliente"],"%s - Status":["%s - Status"],"Button Alignment":["Alinhamento do Bot\u00e3o"],"Placeholder":["Espa\u00e7o reservado"],"Preselect this option":["Pr\u00e9-selecione esta op\u00e7\u00e3o"],"Restrict Country Codes":["Restringir C\u00f3digos de Pa\u00eds"],"Restriction Type":["Tipo de Restri\u00e7\u00e3o"],"Allow":["Permitir"],"Block":["Bloquear"],"Select Allowed Countries":["Selecionar Pa\u00edses Permitidos"],"Choose countries\u2026":["Escolha pa\u00edses\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Escolha quais c\u00f3digos de pa\u00eds os usu\u00e1rios podem selecionar no campo de n\u00famero de telefone. Deixe em branco para permitir todos os c\u00f3digos de pa\u00eds."],"Select Blocked Countries":["Selecionar Pa\u00edses Bloqueados"],"These countries will be hidden from the dropdown.":["Esses pa\u00edses ser\u00e3o ocultados do menu suspenso."],"Bulk Edit":["Edi\u00e7\u00e3o em Massa"],"Select Layout":["Selecionar Layout"],"Number of Columns":["N\u00famero de Colunas"],"Validation Message for Duplicate":["Mensagem de Valida\u00e7\u00e3o para Duplicado"],"Click here to insert a form":["Clique aqui para inserir um formul\u00e1rio"],"Inherit Form's Original Style":["Herdar o Estilo Original do Formul\u00e1rio"],"Text on Primary":["Texto no Prim\u00e1rio"],"%s - Description":["%s - Descri\u00e7\u00e3o"],"Upgrade to Unlock":["Atualize para Desbloquear"],"Custom (Premium)":["Personalizado (Premium)"],"Select a theme style for this form embed.":["Selecione um estilo de tema para este formul\u00e1rio incorporado."],"Colors":["Cores"],"Advanced Styling":["Estilo Avan\u00e7ado"],"Unlock Custom Styling":["Desbloquear Estilo Personalizado"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Alterne para o Modo Personalizado para ter controle total sobre o design e o espa\u00e7amento do seu formul\u00e1rio."],"Full color control (buttons, fields, text)":["Controle total de cores (bot\u00f5es, campos, texto)"],"Row and column gap control":["Controle de espa\u00e7amento entre linhas e colunas"],"Field spacing and layout precision":["Precis\u00e3o de espa\u00e7amento e layout de campo"],"Complete button styling":["Estiliza\u00e7\u00e3o completa do bot\u00e3o"],"Payment Description":["Descri\u00e7\u00e3o do Pagamento"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Mostrado nos recibos de pagamento e no seu painel de pagamento (Stripe e PayPal). Deixe em branco para usar o padr\u00e3o."],"Slug":["Lesma"],"Auto-generated on save":["Gerado automaticamente ao salvar"],"This slug is already used by another field. It will revert to the previous value.":["Este slug j\u00e1 est\u00e1 sendo usado por outro campo. Ele voltar\u00e1 ao valor anterior."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Alterar o slug pode quebrar envios de formul\u00e1rios, l\u00f3gica condicional, integra\u00e7\u00f5es ou qualquer outra funcionalidade que atualmente fa\u00e7a refer\u00eancia a este slug. Voc\u00ea precisar\u00e1 atualizar todas essas refer\u00eancias manualmente."],"Field Slug":["Slug do Campo"],"Location Services":["Servi\u00e7os de Localiza\u00e7\u00e3o"],"Unlock Address Autocomplete":["Desbloquear Autocompletar Endere\u00e7o"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Atualize para habilitar o Autocomplete de Endere\u00e7o do Google com visualiza\u00e7\u00e3o interativa do mapa, tornando a entrada de endere\u00e7os mais r\u00e1pida e precisa para seus usu\u00e1rios."],"Enable Google Autocomplete":["Ativar o Autocomplete do Google"],"Show Interactive Map":["Mostrar Mapa Interativo"],"Payments Per Page":["Pagamentos Por P\u00e1gina"],"Show Subscriptions Section":["Mostrar se\u00e7\u00e3o de assinaturas"],"Show a dedicated subscriptions section above payment history.":["Mostrar uma se\u00e7\u00e3o dedicada a assinaturas acima do hist\u00f3rico de pagamentos."],"Payment Dashboard":["Painel de Pagamentos"],"View your payments and manage subscriptions in a single dashboard.":["Veja seus pagamentos e gerencie assinaturas em um \u00fanico painel."],"Dynamic Default Value":["Valor Padr\u00e3o Din\u00e2mico"],"Minimum Characters":["M\u00ednimo de Caracteres"],"Minimum characters cannot exceed Maximum characters.":["Os caracteres m\u00ednimos n\u00e3o podem exceder os caracteres m\u00e1ximos."],"Both":["Ambos"],"One-Time Label":["Etiqueta \u00danica"],"Label shown to users for the one-time payment option.":["R\u00f3tulo mostrado aos usu\u00e1rios para a op\u00e7\u00e3o de pagamento \u00fanico."],"Subscription Label":["Etiqueta de Assinatura"],"Label shown to users for the subscription option.":["R\u00f3tulo mostrado aos usu\u00e1rios para a op\u00e7\u00e3o de assinatura."],"Default Selection":["Sele\u00e7\u00e3o Padr\u00e3o"],"Which option is pre-selected when the form loads.":["Qual op\u00e7\u00e3o \u00e9 pr\u00e9-selecionada quando o formul\u00e1rio \u00e9 carregado."],"One-Time Amount Type":["Tipo de Quantia \u00danica"],"Set how the one-time payment amount is determined.":["Defina como o valor do pagamento \u00fanico \u00e9 determinado."],"One-Time Fixed Amount":["Valor Fixo \u00danico"],"Amount charged for a one-time payment.":["Valor cobrado por um pagamento \u00fanico."],"One-Time Amount Field":["Campo de Valor \u00danico"],"Pick a form field whose value determines the one-time payment amount.":["Escolha um campo de formul\u00e1rio cujo valor determina o montante do pagamento \u00fanico."],"One-Time Minimum Amount":["Montante M\u00ednimo \u00danico"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Valor m\u00ednimo que os usu\u00e1rios podem inserir para pagamento \u00fanico (0 para sem m\u00ednimo)."],"Subscription Amount Type":["Tipo de Valor da Assinatura"],"Set how the subscription amount is determined.":["Defina como o valor da assinatura \u00e9 determinado."],"Subscription Fixed Amount":["Montante Fixo da Assinatura"],"Recurring amount charged per billing interval.":["Valor recorrente cobrado por intervalo de faturamento."],"Subscription Amount Field":["Campo de Valor da Assinatura"],"Pick a form field whose value determines the subscription amount.":["Escolha um campo de formul\u00e1rio cujo valor determina o valor da assinatura."],"Subscription Minimum Amount":["Montante M\u00ednimo de Subscri\u00e7\u00e3o"],"Minimum amount users can enter for subscription (0 for no minimum).":["Valor m\u00ednimo que os usu\u00e1rios podem inserir para a assinatura (0 para sem m\u00ednimo)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Escolha um campo do seu formul\u00e1rio, como um n\u00famero, lista suspensa, m\u00faltipla escolha ou oculto, cujo valor deve determinar o valor do pagamento."]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/blocks.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Settings":["Configura\u00e7\u00f5es"],"Search":["Pesquisar"],"Fields":["Campos"],"Image":["Imagem"],"Submit":["Enviar"],"Required":["Obrigat\u00f3rio"],"Form Title":["T\u00edtulo do Formul\u00e1rio"],"Show":["Mostrar"],"Hide":["Esconder"],"Edit Form":["Editar Formul\u00e1rio"],"Icon":["\u00cdcone"],"Desktop":["\u00c1rea de trabalho"],"Medium":["M\u00e9dio"],"Mobile":["M\u00f3vel"],"Repeat":["Repetir"],"Scroll":["Rolar"],"Tablet":["Tablet"],"Basic":["B\u00e1sico"],"(no title)":["(sem t\u00edtulo)"],"Select a Form":["Selecione um Formul\u00e1rio"],"No forms found\u2026":["Nenhum formul\u00e1rio encontrado\u2026"],"Choose":["Escolher"],"Create New":["Criar Novo"],"Change Form":["Alterar Formul\u00e1rio"],"This form has been deleted or is unavailable.":["Este formul\u00e1rio foi exclu\u00eddo ou est\u00e1 indispon\u00edvel."],"Form Settings":["Configura\u00e7\u00f5es do Formul\u00e1rio"],"Show Form Title on this Page":["Mostrar t\u00edtulo do formul\u00e1rio nesta p\u00e1gina"],"Note: For editing SureForms, please refer to the SureForms Editor - ":["Nota: Para editar SureForms, consulte o Editor de SureForms -"],"Field preview":["Pr\u00e9-visualiza\u00e7\u00e3o do campo"],"General":["Geral"],"Style":["Estilo"],"Advanced":["Avan\u00e7ado"],"No tags available":["Sem etiquetas dispon\u00edveis"],"Device":["Dispositivo"],"Select Shortcodes":["Selecionar C\u00f3digos Curtos"],"Page Break Label":["R\u00f3tulo de Quebra de P\u00e1gina"],"Next":["Pr\u00f3ximo"],"Back":["Voltar"],"Reset":["Redefinir"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Pixel":["Pixel"],"Em":["Em"],"Select Units":["Selecionar Unidades"],"%s units":["%s unidades"],"Margin":["Margem"],"Attributes":["Atributos"],"Input Pattern":["Padr\u00e3o de Entrada"],"None":["Nenhum"],"(###) ###-####":["(###) ###-####"],"(##) ####-####":["(##) ####-####"],"27\/08\/2024":["27\/08\/2024"],"23:59:59":["23:59:59"],"27\/08\/2024 23:59:59":["27\/08\/2024 23:59:59"],"Custom":["Personalizado"],"Custom Mask":["M\u00e1scara Personalizada"],"Please check the documentation to manage custom input pattern ":["Por favor, verifique a documenta\u00e7\u00e3o para gerenciar o padr\u00e3o de entrada personalizado"],"here":["aqui"],"Default Value":["Valor Padr\u00e3o"],"Error Message":["Mensagem de Erro"],"Help Text":["Texto de Ajuda"],"Number Format":["Formato de N\u00famero"],"US Style (Eg: 9,999.99)":["Estilo dos EUA (Ex: 9.999,99)"],"EU Style (Eg: 9.999,99)":["Estilo da UE (Ex: 9.999,99)"],"Minimum Value":["Valor M\u00ednimo"],"Maximum Value":["Valor M\u00e1ximo"],"Please check the Minimum and Maximum value":["Por favor, verifique o valor M\u00ednimo e M\u00e1ximo"],"Enable Email Confirmation":["Ativar Confirma\u00e7\u00e3o de E-mail"],"Checked by Default":["Marcado por padr\u00e3o"],"Error message":["Mensagem de erro"],"Checked by default":["Marcado por padr\u00e3o"],"Please add a option props to MultiButtonsControl":["Por favor, adicione uma op\u00e7\u00e3o de propriedades ao MultiButtonsControl"],"Icon Library":["Biblioteca de \u00cdcones"],"Close":["Fechar"],"All Icons":["Todas as \u00cdcones"],"Other":["Outro"],"No Icons Found":["Nenhum \u00edcone encontrado"],"Insert Icon":["Inserir \u00cdcone"],"Change Icon":["Alterar \u00cdcone"],"Choose Icon":["Escolher \u00cdcone"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Processing\u2026":["Processando\u2026"],"Select Video":["Selecionar V\u00eddeo"],"Change Video":["Alterar V\u00eddeo"],"Select Lottie Animation":["Selecionar Anima\u00e7\u00e3o Lottie"],"Change Lottie Animation":["Alterar Anima\u00e7\u00e3o Lottie"],"Upload SVG":["Carregar SVG"],"Change SVG":["Alterar SVG"],"Select Image":["Selecionar imagem"],"Change Image":["Alterar Imagem"],"Upload SVG?":["Carregar SVG?"],"Upload SVG can be potentially risky. Are you sure?":["Fazer upload de SVG pode ser potencialmente arriscado. Tem certeza?"],"Upload Anyway":["Carregar Mesmo Assim"],"Bulk Add":["Adicionar em Massa"],"Bulk Add Options":["Adicionar Op\u00e7\u00f5es em Massa"],"Enter each option on a new line.":["Digite cada op\u00e7\u00e3o em uma nova linha."],"Insert Options":["Inserir Op\u00e7\u00f5es"],"Full Width":["Largura Total"],"Option Type":["Tipo de Op\u00e7\u00e3o"],"Edit Options":["Editar Op\u00e7\u00f5es"],"Add New Option":["Adicionar nova op\u00e7\u00e3o"],"ADD":["ADICIONAR"],"Enable Auto Country Detection":["Ativar Detec\u00e7\u00e3o Autom\u00e1tica de Pa\u00eds"],"%s Width":["Largura %s"],"Upgrade":["Atualizar"],"Clear":["Limpar"],"Select Color":["Selecionar Cor"],"Primary Color":["Cor Prim\u00e1ria"],"Text Color":["Cor do Texto"],"Field Spacing":["Espa\u00e7amento de Campo"],"Small":["Pequeno"],"Large":["Grande"],"Left":["Esquerda"],"Center":["Centro"],"Right":["Certo"],"Color":["Cor"],"Background Color":["Cor de Fundo"],"Auto":["Carro"],"Default":["Padr\u00e3o"],"Normal":["Normal"],"%":["%"],"Top":["Topo"],"Bottom":["Inferior"],"Width":["Largura"],"Size":["Tamanho"],"EM":["EM"],"Padding":["Preenchimento"],"Color 1":["Cor 1"],"Color 2":["Cor 2"],"Type":["Digite"],"Linear":["Linear"],"Radial":["Radial"],"Location 1":["Localiza\u00e7\u00e3o 1"],"Location 2":["Localiza\u00e7\u00e3o 2"],"Angle":["\u00c2ngulo"],"Classic":["Cl\u00e1ssico"],"Gradient":["Gradiente"],"Horizontal":["Horizontal"],"Vertical":["Vertical"],"Background":["Fundo"],"Cover":["Cobertura"],"Contain":["Conter"],"Layout":["Layout"],"Overlay":["Sobreposi\u00e7\u00e3o"],"No Repeat":["Sem repeti\u00e7\u00e3o"],"Overlay Opacity":["Opacidade da Sobreposi\u00e7\u00e3o"],"Conditional Logic":["L\u00f3gica Condicional"],"Upgrade to the SureForms Starter Plan to create dynamic forms that adapt based on user input, offering a personalised and efficient form experience.":["Fa\u00e7a upgrade para o Plano Starter do SureForms para criar formul\u00e1rios din\u00e2micos que se adaptam com base nas entradas do usu\u00e1rio, oferecendo uma experi\u00eancia de formul\u00e1rio personalizada e eficiente."],"Enable Conditional Logic":["Ativar L\u00f3gica Condicional"],"this field if":["este campo se"],"Configure Conditions":["Configurar Condi\u00e7\u00f5es"],"Premium":["Premium"],"Overlay Type":["Tipo de Sobreposi\u00e7\u00e3o"],"Image Overlay Color":["Cor de Sobreposi\u00e7\u00e3o da Imagem"],"Image Position":["Posi\u00e7\u00e3o da Imagem"],"Attachment":["Anexo"],"Fixed":["Fixo"],"Blend Mode":["Modo de Mesclagem"],"Multiply":["Multiplicar"],"Screen":["Tela"],"Darken":["Escurecer"],"Lighten":["Iluminar"],"Color Dodge":["Esquiva de Cor"],"Saturation":["Satura\u00e7\u00e3o"],"Repeat-x":["Repetir-x"],"Repeat-y":["Repita-y"],"PX":["PX"],"Button":["Bot\u00e3o"],"Prefix Label":["R\u00f3tulo de Prefixo"],"Suffix Label":["R\u00f3tulo de Sufixo"],"Border Radius":["Raio da Borda"],"Form Theme":["Tema do Formul\u00e1rio"],"Select Gradient":["Selecionar Gradiente"],"Unlock Conditional Logic Editor":["Desbloquear Editor de L\u00f3gica Condicional"],"Rich Text Editor":["Editor de Texto Rico"],"Read Only":["Apenas leitura"],"Select Country":["Selecionar Pa\u00eds"],"Default Country":["Pa\u00eds Padr\u00e3o"],"Subscription":["Assinatura"],"One Time":["Uma Vez"],"Unique Entry":["Entrada \u00danica"],"Maximum Characters":["M\u00e1ximo de caracteres"],"Textarea Height":["Altura da \u00c1rea de Texto"],"Minimum Selections":["Sele\u00e7\u00f5es M\u00ednimas"],"Maximum Selections":["Sele\u00e7\u00f5es M\u00e1ximas"],"Add Numeric Values to Options":["Adicionar valores num\u00e9ricos \u00e0s op\u00e7\u00f5es"],"Single Choice Only":["Apenas uma escolha"],"Enable Dropdown Search":["Ativar Pesquisa em Dropdown"],"Allow Multiple":["Permitir M\u00faltiplos"],"%1$s fields are required. Please configure these fields in the block settings.":["Os campos %1$s s\u00e3o obrigat\u00f3rios. Por favor, configure esses campos nas configura\u00e7\u00f5es do bloco."],"%1$s field is required. Please configure this field in the block settings.":["O campo %1$s \u00e9 obrigat\u00f3rio. Por favor, configure este campo nas configura\u00e7\u00f5es do bloco."],"You need to configure a payment account to collect payments from this form. Please configure your payment provider to proceed.":["Voc\u00ea precisa configurar uma conta de pagamento para coletar pagamentos deste formul\u00e1rio. Por favor, configure seu provedor de pagamento para continuar."],"Configure Payment Account":["Configurar Conta de Pagamento"],"This is a placeholder for the Payment block. The actual payment fields for your configured payment provider(s) will only appear when you preview or publish the form.":["Este \u00e9 um espa\u00e7o reservado para o bloco de Pagamento. Os campos de pagamento reais para o(s) provedor(es) de pagamento configurado(s) s\u00f3 aparecer\u00e3o quando voc\u00ea visualizar ou publicar o formul\u00e1rio."],"2 Payments":["2 Pagamentos"],"3 Payments":["3 Pagamentos"],"4 Payments":["4 Pagamentos"],"5 Payments":["5 Pagamentos"],"Never":["Nunca"],"Stop Subscription After":["Parar Assinatura Ap\u00f3s"],"Choose when to automatically stop the subscription":["Escolha quando parar automaticamente a assinatura"],"Number of Payments":["N\u00famero de Pagamentos"],"Enter a number between 1 to 100":["Insira um n\u00famero entre 1 e 100"],"Form Field":["Campo de Formul\u00e1rio"],"Payment Type":["Tipo de Pagamento"],"Subscription Plan Name":["Nome do Plano de Assinatura"],"Billing Interval":["Intervalo de Cobran\u00e7a"],"Daily":["Diariamente"],"Weekly":["Semanalmente"],"Monthly":["Mensal"],"Quarterly":["Trimestral"],"Yearly":["Anual"],"Amount Type":["Tipo de Quantia"],"Fixed Amount":["Quantia Fixa"],"Dynamic Amount":["Montante Din\u00e2mico"],"Choose whether to charge a fixed amount or charge the amount based on user input in other form fields.":["Escolha entre cobrar um valor fixo ou cobrar o valor com base na entrada do usu\u00e1rio em outros campos do formul\u00e1rio."],"Set the exact amount you want to charge. Users won\u2019t be able to change it":["Defina o valor exato que deseja cobrar. Os usu\u00e1rios n\u00e3o poder\u00e3o alter\u00e1-lo"],"Choose Amount Field":["Escolher Campo de Quantidade"],"Select a field\u2026":["Selecione um campo\u2026"],"Minimum Amount":["Quantidade M\u00ednima"],"Set the minimum amount users can enter (0 for no minimum)":["Defina o valor m\u00ednimo que os usu\u00e1rios podem inserir (0 para sem m\u00ednimo)"],"Customer Name Field (Required)":["Campo Nome do Cliente (Obrigat\u00f3rio)"],"Customer Name Field (Optional)":["Campo Nome do Cliente (Opcional)"],"Select the input field that contains the customer name (Required for subscriptions)":["Selecione o campo de entrada que cont\u00e9m o nome do cliente (Obrigat\u00f3rio para assinaturas)"],"Select the input field that contains the customer name":["Selecione o campo de entrada que cont\u00e9m o nome do cliente"],"Customer Email Field (Required)":["Campo de Email do Cliente (Obrigat\u00f3rio)"],"Select the email field that contains the customer email":["Selecione o campo de email que cont\u00e9m o email do cliente"],"Payment":["Pagamento"],"%s - Order ID":["%s - ID do Pedido"],"%s - Amount":["%s - Quantidade"],"%s - Customer Email":["%s - Email do Cliente"],"%s - Customer Name":["%s - Nome do Cliente"],"%s - Status":["%s - Status"],"Button Alignment":["Alinhamento do Bot\u00e3o"],"Placeholder":["Espa\u00e7o reservado"],"Preselect this option":["Pr\u00e9-selecione esta op\u00e7\u00e3o"],"Restrict Country Codes":["Restringir C\u00f3digos de Pa\u00eds"],"Restriction Type":["Tipo de Restri\u00e7\u00e3o"],"Allow":["Permitir"],"Block":["Bloquear"],"Select Allowed Countries":["Selecionar Pa\u00edses Permitidos"],"Choose countries\u2026":["Escolha pa\u00edses\u2026"],"Choose which country codes users can select in the phone number field. Leave empty to allow all country codes.":["Escolha quais c\u00f3digos de pa\u00eds os usu\u00e1rios podem selecionar no campo de n\u00famero de telefone. Deixe em branco para permitir todos os c\u00f3digos de pa\u00eds."],"Select Blocked Countries":["Selecionar Pa\u00edses Bloqueados"],"These countries will be hidden from the dropdown.":["Esses pa\u00edses ser\u00e3o ocultados do menu suspenso."],"Bulk Edit":["Edi\u00e7\u00e3o em Massa"],"Select Layout":["Selecionar Layout"],"Number of Columns":["N\u00famero de Colunas"],"Validation Message for Duplicate":["Mensagem de Valida\u00e7\u00e3o para Duplicado"],"Click here to insert a form":["Clique aqui para inserir um formul\u00e1rio"],"Inherit Form's Original Style":["Herdar o Estilo Original do Formul\u00e1rio"],"Text on Primary":["Texto no Prim\u00e1rio"],"%s - Description":["%s - Descri\u00e7\u00e3o"],"Upgrade to Unlock":["Atualize para Desbloquear"],"Custom (Premium)":["Personalizado (Premium)"],"Select a theme style for this form embed.":["Selecione um estilo de tema para este formul\u00e1rio incorporado."],"Colors":["Cores"],"Advanced Styling":["Estilo Avan\u00e7ado"],"Unlock Custom Styling":["Desbloquear Estilo Personalizado"],"Switch to Custom Mode to take full control of your form's design and spacing.":["Alterne para o Modo Personalizado para ter controle total sobre o design e o espa\u00e7amento do seu formul\u00e1rio."],"Full color control (buttons, fields, text)":["Controle total de cores (bot\u00f5es, campos, texto)"],"Row and column gap control":["Controle de espa\u00e7amento entre linhas e colunas"],"Field spacing and layout precision":["Precis\u00e3o de espa\u00e7amento e layout de campo"],"Complete button styling":["Estiliza\u00e7\u00e3o completa do bot\u00e3o"],"Payment Description":["Descri\u00e7\u00e3o do Pagamento"],"Shown on payment receipts and in your payment dashboard (Stripe and PayPal). Leave blank to use the default.":["Mostrado nos recibos de pagamento e no seu painel de pagamento (Stripe e PayPal). Deixe em branco para usar o padr\u00e3o."],"Slug":["Lesma"],"Auto-generated on save":["Gerado automaticamente ao salvar"],"This slug is already used by another field. It will revert to the previous value.":["Este slug j\u00e1 est\u00e1 sendo usado por outro campo. Ele voltar\u00e1 ao valor anterior."],"Changing the slug may break form submissions, conditional logic, integrations, or any other feature currently referencing this slug. You will need to update all such references manually.":["Alterar o slug pode quebrar envios de formul\u00e1rios, l\u00f3gica condicional, integra\u00e7\u00f5es ou qualquer outra funcionalidade que atualmente fa\u00e7a refer\u00eancia a este slug. Voc\u00ea precisar\u00e1 atualizar todas essas refer\u00eancias manualmente."],"Field Slug":["Slug do Campo"],"Location Services":["Servi\u00e7os de Localiza\u00e7\u00e3o"],"Unlock Address Autocomplete":["Desbloquear Autocompletar Endere\u00e7o"],"Upgrade to enable Google Address Autocomplete with interactive map preview, making address entry faster and more accurate for your users.":["Atualize para habilitar o Autocomplete de Endere\u00e7o do Google com visualiza\u00e7\u00e3o interativa do mapa, tornando a entrada de endere\u00e7os mais r\u00e1pida e precisa para seus usu\u00e1rios."],"Enable Google Autocomplete":["Ativar o Autocomplete do Google"],"Show Interactive Map":["Mostrar Mapa Interativo"],"Payments Per Page":["Pagamentos Por P\u00e1gina"],"Show Subscriptions Section":["Mostrar se\u00e7\u00e3o de assinaturas"],"Show a dedicated subscriptions section above payment history.":["Mostrar uma se\u00e7\u00e3o dedicada a assinaturas acima do hist\u00f3rico de pagamentos."],"Payment Dashboard":["Painel de Pagamentos"],"View your payments and manage subscriptions in a single dashboard.":["Veja seus pagamentos e gerencie assinaturas em um \u00fanico painel."],"Dynamic Default Value":["Valor Padr\u00e3o Din\u00e2mico"],"Minimum Characters":["M\u00ednimo de Caracteres"],"Minimum characters cannot exceed Maximum characters.":["Os caracteres m\u00ednimos n\u00e3o podem exceder os caracteres m\u00e1ximos."],"Both":["Ambos"],"One-Time Label":["Etiqueta \u00danica"],"Label shown to users for the one-time payment option.":["R\u00f3tulo mostrado aos usu\u00e1rios para a op\u00e7\u00e3o de pagamento \u00fanico."],"Subscription Label":["Etiqueta de Assinatura"],"Label shown to users for the subscription option.":["R\u00f3tulo mostrado aos usu\u00e1rios para a op\u00e7\u00e3o de assinatura."],"Default Selection":["Sele\u00e7\u00e3o Padr\u00e3o"],"Which option is pre-selected when the form loads.":["Qual op\u00e7\u00e3o \u00e9 pr\u00e9-selecionada quando o formul\u00e1rio \u00e9 carregado."],"One-Time Amount Type":["Tipo de Quantia \u00danica"],"Set how the one-time payment amount is determined.":["Defina como o valor do pagamento \u00fanico \u00e9 determinado."],"One-Time Fixed Amount":["Valor Fixo \u00danico"],"Amount charged for a one-time payment.":["Valor cobrado por um pagamento \u00fanico."],"One-Time Amount Field":["Campo de Valor \u00danico"],"Pick a form field whose value determines the one-time payment amount.":["Escolha um campo de formul\u00e1rio cujo valor determina o montante do pagamento \u00fanico."],"One-Time Minimum Amount":["Montante M\u00ednimo \u00danico"],"Minimum amount users can enter for one-time payment (0 for no minimum).":["Valor m\u00ednimo que os usu\u00e1rios podem inserir para pagamento \u00fanico (0 para sem m\u00ednimo)."],"Subscription Amount Type":["Tipo de Valor da Assinatura"],"Set how the subscription amount is determined.":["Defina como o valor da assinatura \u00e9 determinado."],"Subscription Fixed Amount":["Montante Fixo da Assinatura"],"Recurring amount charged per billing interval.":["Valor recorrente cobrado por intervalo de faturamento."],"Subscription Amount Field":["Campo de Valor da Assinatura"],"Pick a form field whose value determines the subscription amount.":["Escolha um campo de formul\u00e1rio cujo valor determina o valor da assinatura."],"Subscription Minimum Amount":["Montante M\u00ednimo de Subscri\u00e7\u00e3o"],"Minimum amount users can enter for subscription (0 for no minimum).":["Valor m\u00ednimo que os usu\u00e1rios podem inserir para a assinatura (0 para sem m\u00ednimo)."],"Pick a field from your form like a number, dropdown, multichoice, or hidden whose value should decide the payment amount.":["Escolha um campo do seu formul\u00e1rio, como um n\u00famero, lista suspensa, m\u00faltipla escolha ou oculto, cujo valor deve determinar o valor do pagamento."],"Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.":["Use uma tag inteligente como {get_input:country}. A primeira op\u00e7\u00e3o cujo t\u00edtulo corresponder ao valor resolvido ser\u00e1 pr\u00e9-selecionada."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.":["Use uma tag inteligente como {get_input:colors} e passe valores separados por pipe na URL (por exemplo ?colors=Red|Blue). Toda op\u00e7\u00e3o cujo t\u00edtulo corresponder a um valor ser\u00e1 marcada. Voc\u00ea tamb\u00e9m pode encadear v\u00e1rias tags inteligentes separadas por pipes."],"Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.":["Use uma tag inteligente como {get_input:colors} e passe valores separados por pipe na URL (por exemplo ?colors=Red|Blue). Toda op\u00e7\u00e3o cujo r\u00f3tulo corresponder a um valor ser\u00e1 pr\u00e9-selecionada. Voc\u00ea tamb\u00e9m pode encadear v\u00e1rias tags inteligentes separadas por pipes."],"Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.":["Use uma tag inteligente como {get_input:country}. A primeira op\u00e7\u00e3o cujo r\u00f3tulo corresponder ao valor resolvido ser\u00e1 pr\u00e9-selecionada."]}}} \ No newline at end of file diff --git a/languages/sureforms-pt_PT-51635fe6489fc8288d603fe596c755ca.json b/languages/sureforms-pt_PT-51635fe6489fc8288d603fe596c755ca.json index 814255611..1cb968d49 100644 --- a/languages/sureforms-pt_PT-51635fe6489fc8288d603fe596c755ca.json +++ b/languages/sureforms-pt_PT-51635fe6489fc8288d603fe596c755ca.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Painel de Controle"],"Settings":["Configura\u00e7\u00f5es"],"Entries":["Entradas"],"Activated":["Ativado"],"Activate":["Ativar"],"Monday":["Segunda-feira"],"Forms":["Formul\u00e1rios"],"GitHub":["GitHub"],"General":["Geral"],"Other":["Outro"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["A instala\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Plugin activation failed, Please try again later.":["A ativa\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Integrations":["Integra\u00e7\u00f5es"],"What's New?":["O que h\u00e1 de novo?"],"Core":["N\u00facleo"],"Unlicensed":["Sem licen\u00e7a"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar e Ativar"],"Send Email To":["Enviar Email Para"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invis\u00edvel"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Valida\u00e7\u00f5es"],"Spam Protection":["Prote\u00e7\u00e3o contra Spam"],"Email Summaries":["Resumos de Email"],"Tuesday":["ter\u00e7a-feira"],"Wednesday":["Quarta-feira"],"Thursday":["Quinta-feira"],"Friday":["Sexta-feira"],"Saturday":["S\u00e1bado"],"Sunday":["Domingo"],"Test Email":["Email de teste"],"Schedule Reports":["Agendar Relat\u00f3rios"],"IP Logging":["Registro de IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Se esta op\u00e7\u00e3o estiver ativada, o endere\u00e7o IP do usu\u00e1rio ser\u00e1 salvo com os dados do formul\u00e1rio"],"Confirmation Email Mismatch Message":["Mensagem de Incompatibilidade de E-mail de Confirma\u00e7\u00e3o"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s representa o valor m\u00ednimo de entrada. Por exemplo: \"O valor m\u00ednimo \u00e9 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s representa o valor m\u00e1ximo de entrada. Por exemplo: \"O valor m\u00e1ximo \u00e9 100.\""],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s representa as sele\u00e7\u00f5es m\u00ednimas necess\u00e1rias. Por exemplo: \"S\u00e3o necess\u00e1rias no m\u00ednimo 2 sele\u00e7\u00f5es.\""],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s representa o n\u00famero m\u00e1ximo de sele\u00e7\u00f5es permitidas. Por exemplo: \"S\u00e3o permitidas no m\u00e1ximo 4 sele\u00e7\u00f5es.\""],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s representa as escolhas m\u00ednimas necess\u00e1rias. Por exemplo: \u201c\u00c9 necess\u00e1ria no m\u00ednimo 1 sele\u00e7\u00e3o.\u201d"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s representa o n\u00famero m\u00e1ximo de escolhas permitidas. Por exemplo: \"S\u00e3o permitidas no m\u00e1ximo 3 sele\u00e7\u00f5es.\""]," Error Message":["Mensagem de Erro"],"Auto":["Carro"],"Light":["Luz"],"Dark":["Escuro"],"Turnstile":["Catraca"],"Honeypot":["Pote de mel"],"Get Keys":["Obter Chaves"],"Documentation":["Documenta\u00e7\u00e3o"],"Site Key":["Chave do Site"],"Secret Key":["Chave Secreta"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Modo de Apar\u00eancia"],"Enable Honeypot Security":["Ativar Seguran\u00e7a Honeypot"],"Enable Honeypot Security for better spam protection":["Ative a Seguran\u00e7a Honeypot para melhor prote\u00e7\u00e3o contra spam"],"This field cannot be left blank.":["Este campo n\u00e3o pode ficar em branco."],"OttoKit":["OttoKit"],"Connect with OttoKit":["Conectar com OttoKit"],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Pronto para ir al\u00e9m do plano gratuito?"],"Upgrade now":["Atualize agora"],"and unlock the full power of SureForms!":["e desbloqueie todo o poder do SureForms!"],"Upgrade SureForms":["Atualizar SureForms"],"Upgrade Now":["Atualize agora"],"Form Validation":["Valida\u00e7\u00e3o de Formul\u00e1rio"],"Required Error Messages":["Mensagens de Erro Obrigat\u00f3rias"],"Other Error Messages":["Outras Mensagens de Erro"],"Input Field Unique":["Campo de Entrada \u00danico"],"Email Field Unique":["Campo de Email \u00danico"],"Invalid URL":["URL inv\u00e1lido"],"Phone Field Unique":["Campo de Telefone \u00danico"],"Invalid Field Number Block":["Bloco de N\u00famero de Campo Inv\u00e1lido"],"Invalid Email":["Email inv\u00e1lido"],"Number Minimum Value":["Valor M\u00ednimo do N\u00famero"],"Number Maximum Value":["Valor M\u00e1ximo do N\u00famero"],"Dropdown Minimum Selections":["M\u00ednimo de Sele\u00e7\u00f5es no Dropdown"],"Dropdown Maximum Selections":["Sele\u00e7\u00f5es M\u00e1ximas do Dropdown"],"Multiple Choice Minimum Selections":["M\u00faltipla Escolha M\u00ednima de Sele\u00e7\u00f5es"],"Multiple Choice Maximum Selections":["Sele\u00e7\u00f5es M\u00e1ximas de M\u00faltipla Escolha"],"Input Field":["Campo de Entrada"],"Email Field":["Campo de Email"],"URL Field":["Campo de URL"],"Phone Field":["Campo de Telefone"],"Textarea Field":["Campo de \u00c1rea de Texto"],"Checkbox Field":["Campo de Caixa de Sele\u00e7\u00e3o"],"Dropdown Field":["Campo suspenso"],"Multiple Choice Field":["Campo de Escolha M\u00faltipla"],"Address Field":["Campo de Endere\u00e7o"],"Number Field":["Campo Num\u00e9rico"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Para ativar o recurso reCAPTCHA no seu SureForms, ative a op\u00e7\u00e3o reCAPTCHA nas configura\u00e7\u00f5es dos seus blocos e selecione a vers\u00e3o. Adicione a chave secreta e a chave do site do Google reCAPTCHA aqui. O reCAPTCHA ser\u00e1 adicionado \u00e0 sua p\u00e1gina no front-end."],"Enter your %s here":["Insira seu %s aqui"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Para ativar o hCAPTCHA, adicione sua chave do site e chave secreta. Configure essas configura\u00e7\u00f5es dentro do formul\u00e1rio individual."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Para ativar o Cloudflare Turnstile, adicione sua chave do site e chave secreta. Configure essas configura\u00e7\u00f5es dentro do formul\u00e1rio individual."],"Save":["Salvar"],"Anonymous Analytics":["An\u00e1lise An\u00f4nima"],"Learn More":["Saiba mais"],"Admin Notification":["Notifica\u00e7\u00e3o do Administrador"],"Enable Admin Notification":["Ativar Notifica\u00e7\u00e3o de Administrador"],"Admin notifications keep you informed about new form entries since your last visit.":["As notifica\u00e7\u00f5es de administrador mant\u00eam voc\u00ea informado sobre novas entradas de formul\u00e1rio desde sua \u00faltima visita."],"Continue":["Continuar"],"Get Started":["Come\u00e7ar"],"Integration":["Integra\u00e7\u00e3o"],"Connect Native Integrations with SureForms":["Conecte Integra\u00e7\u00f5es Nativas com SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Desbloqueie integra\u00e7\u00f5es poderosas no plano Premium para automatizar seus fluxos de trabalho e conectar o SureForms diretamente com suas ferramentas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms":["Envie envios de formul\u00e1rios diretamente para CRMs, e-mail e plataformas de marketing"],"Automate repetitive tasks with seamless data syncing":["Automatize tarefas repetitivas com sincroniza\u00e7\u00e3o de dados perfeita"],"Access exclusive native integrations for faster workflows":["Acesse integra\u00e7\u00f5es nativas exclusivas para fluxos de trabalho mais r\u00e1pidos"],"Payments":["Pagamentos"],"Stripe account disconnected successfully.":["Conta Stripe desconectada com sucesso."],"Failed to create webhook.":["Falha ao criar webhook."],"Failed to connect to Stripe.":["Falha ao conectar-se ao Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Base de Conhecimento"],"What\u2019s New":["O que h\u00e1 de novo"],"delete":["excluir"],"Please type \"%s\" in the input box":["Por favor, digite \"%s\" na caixa de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, digite \"%s\" na caixa abaixo:"],"Type \"%s\"":["Digite \"%s\""],"Go to OttoKit Settings":["V\u00e1 para as Configura\u00e7\u00f5es do OttoKit"],"USD - US Dollar":["USD - D\u00f3lar dos EUA"],"Payment Mode":["Modo de Pagamento"],"Test Mode":["Modo de Teste"],"Live Mode":["Modo ao Vivo"],"General Settings":["Configura\u00e7\u00f5es Gerais"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Configure resumos de e-mail, alertas de administrador e prefer\u00eancias de dados para gerenciar seus formul\u00e1rios com facilidade."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personalize as mensagens de erro padr\u00e3o exibidas quando os usu\u00e1rios enviam entradas de formul\u00e1rio inv\u00e1lidas ou incompletas."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Ative a prote\u00e7\u00e3o contra spam para seus formul\u00e1rios usando servi\u00e7os CAPTCHA ou seguran\u00e7a honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Conecte e gerencie seus gateways de pagamento para aceitar transa\u00e7\u00f5es com seguran\u00e7a atrav\u00e9s de seus formul\u00e1rios."],"1% transaction and payment gateway fees apply.":["Aplicam-se taxas de 1% para transa\u00e7\u00f5es e gateways de pagamento."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Aplicam-se taxas de transa\u00e7\u00e3o e de gateway de pagamento de 2,9%. Ative a licen\u00e7a para reduzir as taxas de transa\u00e7\u00e3o."],"2.9% transaction and payment gateway fees apply.":["Aplicam-se taxas de transa\u00e7\u00e3o e de gateway de pagamento de 2,9%."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Por favor, visite %1$s, exclua um webhook n\u00e3o utilizado e, em seguida, clique abaixo para tentar novamente."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms n\u00e3o p\u00f4de criar um webhook porque sua conta Stripe ficou sem slots gratuitos. Webhooks s\u00e3o necess\u00e1rios para receber atualiza\u00e7\u00f5es sobre pagamentos."],"Stripe Dashboard":["Painel do Stripe"],"Creating\u2026":["Criando\u2026"],"Create Webhook":["Criar Webhook"],"Successfully connected to Stripe!":["Conectado com sucesso ao Stripe!"],"Invalid response from server. Please try again.":["Resposta inv\u00e1lida do servidor. Por favor, tente novamente."],"Failed to disconnect Stripe account.":["Falha ao desconectar a conta do Stripe."],"Webhook created successfully!":["Webhook criado com sucesso!"],"Select Currency":["Selecionar moeda"],"Select the default currency for payment forms.":["Selecione a moeda padr\u00e3o para os formul\u00e1rios de pagamento."],"Connection Status":["Status da Conex\u00e3o"],"Disconnect Stripe Account":["Desconectar Conta do Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Tem certeza de que deseja desconectar sua conta do Stripe? Isso interromper\u00e1 todos os pagamentos, assinaturas e transa\u00e7\u00f5es de formul\u00e1rio ativas conectadas a esta conta."],"Disconnect":["Desconectar"],"Disconnecting\u2026":["Desconectando\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook conectado com sucesso, todos os eventos do Stripe est\u00e3o sendo rastreados."],"Connect your Stripe account to start accepting payments through your forms.":["Conecte sua conta Stripe para come\u00e7ar a aceitar pagamentos atrav\u00e9s de seus formul\u00e1rios."],"Connect to Stripe":["Conectar ao Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Conecte-se com seguran\u00e7a ao Stripe com apenas alguns cliques para come\u00e7ar a aceitar pagamentos!"],"Payment Methods":["M\u00e9todos de Pagamento"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["O modo de teste permite processar pagamentos sem cobran\u00e7as reais. Mude para o modo ao vivo para transa\u00e7\u00f5es reais."],"General Payment Settings":["Configura\u00e7\u00f5es Gerais de Pagamento"],"These settings apply to all payment gateways.":["Essas configura\u00e7\u00f5es se aplicam a todos os gateways de pagamento."],"Stripe Settings":["Configura\u00e7\u00f5es do Stripe"],"Left ($100)":["Esquerda ($100)"],"Right (100$)":["Certo (100$)"],"Left Space ($ 100)":["Espa\u00e7o Esquerdo ($ 100)"],"Right Space (100 $)":["Espa\u00e7o Direito (100 $)"],"Currency Sign Position":["Posi\u00e7\u00e3o do Sinal de Moeda"],"Select the position of the currency symbol relative to the amount.":["Selecione a posi\u00e7\u00e3o do s\u00edmbolo da moeda em rela\u00e7\u00e3o ao valor."],"Learn":["Aprender"],"Enable email summaries":["Ativar resumos de e-mail"],"Enable IP logging":["Ativar registro de IP"],"Turn on Admin Notification from here.":["Ative a Notifica\u00e7\u00e3o de Administrador daqui."],"Send entries to 100+ popular apps.":["Envie entradas para mais de 100 aplicativos populares."],"Build automated workflows that run instantly.":["Crie fluxos de trabalho automatizados que sejam executados instantaneamente."],"Create custom app integrations using our Custom App feature.":["Crie integra\u00e7\u00f5es de aplicativos personalizadas usando nosso recurso de Aplicativo Personalizado."],"Keep your tools in sync automatically.":["Mantenha suas ferramentas sincronizadas automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Isso instalar\u00e1 e ativar\u00e1 o OttoKit no seu site WordPress para habilitar recursos de automa\u00e7\u00e3o."],"Automate Your Forms with OttoKit":["Automatize Seus Formul\u00e1rios com OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada envio de formul\u00e1rio deve acionar algo \u2014 um alerta no Slack, um lead no CRM, um e-mail de acompanhamento ou uma nova linha no Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configure as permiss\u00f5es do cliente de IA e as configura\u00e7\u00f5es do servidor MCP."],"View documentation":["Ver documenta\u00e7\u00e3o"],"Copy to clipboard":["Copiar para a \u00e1rea de transfer\u00eancia"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) ou %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["C\u00f3digo Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (projeto) ou ~\/.claude.json (global)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (projeto) ou settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml ou config.json"],"Your client's MCP configuration file":["O arquivo de configura\u00e7\u00e3o MCP do seu cliente"],"Connect Your AI Client":["Conecte seu cliente de IA"],"AI Client":["Cliente de IA"],"Create an Application Password \u2014 ":["Criar uma Senha de Aplicativo \u2014"],"Open Application Passwords":["Abrir Senhas de Aplicativos"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Ou use este comando CLI para adicionar o servidor rapidamente (voc\u00ea ainda precisar\u00e1 definir as vari\u00e1veis de ambiente):"],"Copy the JSON config below into: ":["Copie a configura\u00e7\u00e3o JSON abaixo em:"],"Replace \"your-application-password\" with the password from Step 1.":["Substitua \"your-application-password\" pela senha do Passo 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 o endpoint MCP do seu site. WP_API_USERNAME \u2014 seu nome de usu\u00e1rio do WordPress. WP_API_PASSWORD \u2014 a senha do aplicativo que voc\u00ea gerou."],"View setup docs":["Ver documentos de configura\u00e7\u00e3o"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["O plugin MCP Adapter est\u00e1 instalado, mas n\u00e3o est\u00e1 ativo. Ative-o para configurar as defini\u00e7\u00f5es do MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["O plugin MCP Adapter \u00e9 necess\u00e1rio para conectar clientes de IA aos seus formul\u00e1rios. Baixe e instale-o do GitHub, depois ative-o."],"Download the latest release from":["Baixe a vers\u00e3o mais recente de"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Instale o plugin atrav\u00e9s de Plugins > Adicionar Novo Plugin > Enviar Plugin."],"Activate the MCP Adapter plugin.":["Ativar o plugin do Adaptador MCP."],"Activating\u2026":["Ativando\u2026"],"Activate MCP Adapter":["Ativar Adaptador MCP"],"Download MCP Adapter":["Baixar Adaptador MCP"],"Experimental":["Experimental"],"Enable Abilities":["Ativar habilidades"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registre as habilidades do SureForms com a API de Habilidades do WordPress. Quando ativado, os clientes de IA podem listar, ler, criar, editar e excluir seus formul\u00e1rios e entradas. Quando desativado, nenhuma habilidade \u00e9 registrada e os clientes de IA n\u00e3o podem realizar nenhuma a\u00e7\u00e3o em seus formul\u00e1rios."],"Abilities API \u2014 Edit":["API de Habilidades \u2014 Editar"],"Enable Edit Abilities":["Ativar habilidades de edi\u00e7\u00e3o"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Quando ativado, os clientes de IA podem criar novos formul\u00e1rios, atualizar t\u00edtulos, campos e configura\u00e7\u00f5es de formul\u00e1rios, duplicar formul\u00e1rios e modificar status de entradas. Quando desativado, essas habilidades s\u00e3o desregistradas e os clientes de IA s\u00f3 podem ler seus dados."],"Abilities API \u2014 Delete":["API de Habilidades \u2014 Excluir"],"Enable Delete Abilities":["Ativar habilidades de exclus\u00e3o"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Quando ativado, os clientes de IA podem excluir permanentemente formul\u00e1rios e entradas. Os dados exclu\u00eddos n\u00e3o podem ser recuperados. Quando desativado, as habilidades de exclus\u00e3o s\u00e3o desregistradas e os clientes de IA n\u00e3o podem remover nenhum dado."],"MCP Server":["Servidor MCP"],"Enable MCP Server":["Ativar Servidor MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Cria um endpoint SureForms MCP dedicado ao qual clientes de IA como Claude podem se conectar. Quando desativado, o endpoint \u00e9 removido e clientes de IA externos n\u00e3o podem descobrir ou chamar nenhuma habilidade do SureForms."],"Learn more":["Saiba mais"],"MCP Adapter Required":["Adaptador MCP Necess\u00e1rio"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configure a chave da API do Google Maps para preenchimento autom\u00e1tico de endere\u00e7o e visualiza\u00e7\u00e3o do mapa."],"Help shape the future of SureForms":["Ajude a moldar o futuro do SureForms"],"Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ":["Compartilhe como voc\u00ea usa o plugin para que possamos desenvolver funcionalidades que importam, corrigir problemas mais rapidamente e tomar decis\u00f5es mais inteligentes."],"Enable Google Address Autocomplete":["Ativar o preenchimento autom\u00e1tico de endere\u00e7os do Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Fa\u00e7a upgrade para o Plano de Neg\u00f3cios SureForms para adicionar a autocompleta\u00e7\u00e3o de endere\u00e7os com tecnologia do Google e visualiza\u00e7\u00e3o interativa de mapa aos seus formul\u00e1rios."],"Auto-suggest addresses as users type for faster, error-free submissions":["Sugira automaticamente endere\u00e7os \u00e0 medida que os usu\u00e1rios digitam para envios mais r\u00e1pidos e sem erros"],"Show an interactive map preview with draggable pin for precise locations":["Mostrar uma pr\u00e9-visualiza\u00e7\u00e3o de mapa interativo com um pino arrast\u00e1vel para locais precisos"],"Automatically populate address fields like city, state, and postal code":["Preencher automaticamente campos de endere\u00e7o como cidade, estado e c\u00f3digo postal"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/settings.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Painel de Controle"],"Settings":["Configura\u00e7\u00f5es"],"Entries":["Entradas"],"Activated":["Ativado"],"Activate":["Ativar"],"Monday":["Segunda-feira"],"Forms":["Formul\u00e1rios"],"New Form Submission - %s":["Nova Submiss\u00e3o de Formul\u00e1rio - %s"],"GitHub":["GitHub"],"(no title)":["(sem t\u00edtulo)"],"General":["Geral"],"No tags available":["Sem etiquetas dispon\u00edveis"],"Generic tags":["Etiquetas gen\u00e9ricas"],"Other":["Outro"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"Install":["Instalar"],"Plugin Installation failed, Please try again later.":["A instala\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Plugin activation failed, Please try again later.":["A ativa\u00e7\u00e3o do plugin falhou, por favor, tente novamente mais tarde."],"Integrations":["Integra\u00e7\u00f5es"],"What's New?":["O que h\u00e1 de novo?"],"Core":["N\u00facleo"],"Unlicensed":["Sem licen\u00e7a"],"Connecting\u2026":["Conectando\u2026"],"Install & Activate":["Instalar e Ativar"],"Compliance Settings":["Configura\u00e7\u00f5es de Conformidade"],"Enable GDPR Compliance":["Ativar conformidade com o GDPR"],"Never store entry data after form submission":["Nunca armazene os dados de entrada ap\u00f3s o envio do formul\u00e1rio"],"When enabled this form will never store Entries.":["Quando ativado, este formul\u00e1rio nunca armazenar\u00e1 entradas."],"Automatically delete entries":["Excluir entradas automaticamente"],"When enabled this form will automatically delete entries after a certain period of time.":["Quando ativado, este formul\u00e1rio excluir\u00e1 automaticamente as entradas ap\u00f3s um determinado per\u00edodo de tempo."],"Entries older than the days set will be deleted automatically.":["As entradas mais antigas do que os dias definidos ser\u00e3o exclu\u00eddas automaticamente."],"Visual":["Visual"],"HTML":["HTML"],"All Data":["Todos os dados"],"Add Shortcode":["Adicionar Shortcode"],"Form input tags":["Etiquetas de entrada de formul\u00e1rio"],"Comma separated values are also accepted.":["Valores separados por v\u00edrgula tamb\u00e9m s\u00e3o aceitos."],"Email Notification":["Notifica\u00e7\u00e3o por Email"],"Name":["Nome"],"Send Email To":["Enviar Email Para"],"Subject":["Assunto"],"CC":["CC"],"BCC":["Cco"],"Reply To":["Responder a"],"Add Key":["Adicionar Chave"],"Add Value":["Adicionar Valor"],"Add":["Adicionar"],"Confirmation Message":["Mensagem de Confirma\u00e7\u00e3o"],"After Form Submission":["Ap\u00f3s o Envio do Formul\u00e1rio"],"Hide Form":["Ocultar Formul\u00e1rio"],"Reset Form":["Redefinir Formul\u00e1rio"],"Custom URL":["URL personalizada"],"Add Query Parameters":["Adicionar Par\u00e2metros de Consulta"],"Select if you want to add key-value pairs for form fields to include in query parameters":["Selecione se deseja adicionar pares chave-valor para campos de formul\u00e1rio a serem inclu\u00eddos nos par\u00e2metros de consulta"],"Query Parameters":["Par\u00e2metros de Consulta"],"Success Message":["Mensagem de Sucesso"],"Redirect":["Redirecionar"],"Redirect to":["Redirecionar para"],"Page":["P\u00e1gina"],"Form Confirmation":["Confirma\u00e7\u00e3o de Formul\u00e1rio"],"Confirmation Type":["Tipo de Confirma\u00e7\u00e3o"],"Google reCAPTCHA":["Google reCAPTCHA"],"hCaptcha":["hCaptcha"],"reCAPTCHA v2 Invisible":["reCAPTCHA v2 Invis\u00edvel"],"reCAPTCHA v3":["reCAPTCHA v3"],"Validations":["Valida\u00e7\u00f5es"],"Spam Protection":["Prote\u00e7\u00e3o contra Spam"],"Email Summaries":["Resumos de Email"],"Tuesday":["ter\u00e7a-feira"],"Wednesday":["Quarta-feira"],"Thursday":["Quinta-feira"],"Friday":["Sexta-feira"],"Saturday":["S\u00e1bado"],"Sunday":["Domingo"],"Test Email":["Email de teste"],"Schedule Reports":["Agendar Relat\u00f3rios"],"IP Logging":["Registro de IP"],"If this option is turned on, the user's IP address will be saved with the form data":["Se esta op\u00e7\u00e3o estiver ativada, o endere\u00e7o IP do usu\u00e1rio ser\u00e1 salvo com os dados do formul\u00e1rio"],"Confirmation Email Mismatch Message":["Mensagem de Incompatibilidade de E-mail de Confirma\u00e7\u00e3o"],"%s represents the minimum input value. For example: \"Minimum value is 10.\"":["%s representa o valor m\u00ednimo de entrada. Por exemplo: \"O valor m\u00ednimo \u00e9 10.\""],"%s represents the maximum input value. For example: \"Maximum value is 100.\"":["%s representa o valor m\u00e1ximo de entrada. Por exemplo: \"O valor m\u00e1ximo \u00e9 100.\""],"%s represents the minimum selections needed. For example: \u201cMinimum 2 selections are required.\u201d":["%s representa as sele\u00e7\u00f5es m\u00ednimas necess\u00e1rias. Por exemplo: \"S\u00e3o necess\u00e1rias no m\u00ednimo 2 sele\u00e7\u00f5es.\""],"%s represents the maximum selections allowed. For example: \u201cMaximum 4 selections are allowed.\u201d":["%s representa o n\u00famero m\u00e1ximo de sele\u00e7\u00f5es permitidas. Por exemplo: \"S\u00e3o permitidas no m\u00e1ximo 4 sele\u00e7\u00f5es.\""],"%s represents the minimum choices needed. For example: \u201cMinimum 1 selection is required.\u201d":["%s representa as escolhas m\u00ednimas necess\u00e1rias. Por exemplo: \u201c\u00c9 necess\u00e1ria no m\u00ednimo 1 sele\u00e7\u00e3o.\u201d"],"%s represents the maximum choices allowed. For example: \u201cMaximum 3 selections are allowed.\u201d":["%s representa o n\u00famero m\u00e1ximo de escolhas permitidas. Por exemplo: \"S\u00e3o permitidas no m\u00e1ximo 3 sele\u00e7\u00f5es.\""]," Error Message":["Mensagem de Erro"],"Auto":["Carro"],"Light":["Luz"],"Dark":["Escuro"],"Turnstile":["Catraca"],"Honeypot":["Pote de mel"],"Get Keys":["Obter Chaves"],"Documentation":["Documenta\u00e7\u00e3o"],"Site Key":["Chave do Site"],"Secret Key":["Chave Secreta"],"Cloudflare Turnstile":["Cloudflare Turnstile"],"Appearance Mode":["Modo de Apar\u00eancia"],"Enable Honeypot Security":["Ativar Seguran\u00e7a Honeypot"],"Enable Honeypot Security for better spam protection":["Ative a Seguran\u00e7a Honeypot para melhor prote\u00e7\u00e3o contra spam"],"OttoKit":["OttoKit"],"Connect with OttoKit":["Conectar com OttoKit"],"The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["O endere\u00e7o de 'Email de Remetente' atual n\u00e3o corresponde ao nome de dom\u00ednio do seu site (%1$s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endere\u00e7o de Remetente que corresponda ao dom\u00ednio do seu site (admin@%2$s)."],"The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["O endere\u00e7o de 'Email de Remetente' atual n\u00e3o corresponde ao nome de dom\u00ednio do seu site (%s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam."],"We strongly recommend that you install the free ":["Recomendamos fortemente que voc\u00ea instale o gratuito"]," plugin! The Setup Wizard makes it easy to fix your emails. ":["plugin! O Assistente de Configura\u00e7\u00e3o facilita a corre\u00e7\u00e3o dos seus e-mails."]," Alternately, try using a From Address that matches your website domain (admin@%s).":["Alternativamente, tente usar um endere\u00e7o de remetente que corresponda ao dom\u00ednio do seu site (admin@%s)."],"Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.":["Por favor, insira um endere\u00e7o de e-mail v\u00e1lido. Suas notifica\u00e7\u00f5es n\u00e3o ser\u00e3o enviadas se o campo n\u00e3o for preenchido corretamente."],"From Name":["De Nome"],"From Email":["De Email"],"The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).":["O endere\u00e7o de 'Email de Remetente' atual pode n\u00e3o corresponder ao nome de dom\u00ednio do seu site (%1$s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endere\u00e7o de Remetente que corresponda ao dom\u00ednio do seu site (admin@%2$s)."],"The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ":["O endere\u00e7o de 'Email de Remetente' atual pode n\u00e3o corresponder ao nome de dom\u00ednio do seu site (%s). Isso pode fazer com que seus e-mails de notifica\u00e7\u00e3o sejam bloqueados ou marcados como spam."],"reCAPTCHA":["reCAPTCHA"],"Ready to go beyond free plan?":["Pronto para ir al\u00e9m do plano gratuito?"],"Upgrade now":["Atualize agora"],"and unlock the full power of SureForms!":["e desbloqueie todo o poder do SureForms!"],"Upgrade SureForms":["Atualizar SureForms"],"Upgrade Now":["Atualize agora"],"Entries older than the selected days will be deleted.":["As entradas mais antigas que os dias selecionados ser\u00e3o exclu\u00eddas."],"Entries Time Period":["Per\u00edodo de Tempo das Entradas"],"Notifications can use only one From Email so please enter a single address.":["As notifica\u00e7\u00f5es podem usar apenas um \u00fanico endere\u00e7o de e-mail de remetente, portanto, insira um \u00fanico endere\u00e7o."],"Select Page to redirect":["Selecione a p\u00e1gina para redirecionar"],"Search for a page":["Procurar uma p\u00e1gina"],"Select a page":["Selecione uma p\u00e1gina"],"Form Validation":["Valida\u00e7\u00e3o de Formul\u00e1rio"],"Required Error Messages":["Mensagens de Erro Obrigat\u00f3rias"],"Other Error Messages":["Outras Mensagens de Erro"],"Input Field Unique":["Campo de Entrada \u00danico"],"Email Field Unique":["Campo de Email \u00danico"],"Invalid URL":["URL inv\u00e1lido"],"Phone Field Unique":["Campo de Telefone \u00danico"],"Invalid Field Number Block":["Bloco de N\u00famero de Campo Inv\u00e1lido"],"Invalid Email":["Email inv\u00e1lido"],"Number Minimum Value":["Valor M\u00ednimo do N\u00famero"],"Number Maximum Value":["Valor M\u00e1ximo do N\u00famero"],"Dropdown Minimum Selections":["M\u00ednimo de Sele\u00e7\u00f5es no Dropdown"],"Dropdown Maximum Selections":["Sele\u00e7\u00f5es M\u00e1ximas do Dropdown"],"Multiple Choice Minimum Selections":["M\u00faltipla Escolha M\u00ednima de Sele\u00e7\u00f5es"],"Multiple Choice Maximum Selections":["Sele\u00e7\u00f5es M\u00e1ximas de M\u00faltipla Escolha"],"Input Field":["Campo de Entrada"],"Email Field":["Campo de Email"],"URL Field":["Campo de URL"],"Phone Field":["Campo de Telefone"],"Textarea Field":["Campo de \u00c1rea de Texto"],"Checkbox Field":["Campo de Caixa de Sele\u00e7\u00e3o"],"Dropdown Field":["Campo suspenso"],"Multiple Choice Field":["Campo de Escolha M\u00faltipla"],"Address Field":["Campo de Endere\u00e7o"],"Number Field":["Campo Num\u00e9rico"],"reCAPTCHA v2":["reCAPTCHA v2"],"To enable reCAPTCHA feature on your SureForms Please enable reCAPTCHA option on your blocks setting and select version. Add google reCAPTCHA secret and site key here. reCAPTCHA will be added to your page on front-end.":["Para ativar o recurso reCAPTCHA no seu SureForms, ative a op\u00e7\u00e3o reCAPTCHA nas configura\u00e7\u00f5es dos seus blocos e selecione a vers\u00e3o. Adicione a chave secreta e a chave do site do Google reCAPTCHA aqui. O reCAPTCHA ser\u00e1 adicionado \u00e0 sua p\u00e1gina no front-end."],"Enter your %s here":["Insira seu %s aqui"],"To enable hCAPTCHA, please add your site key and secret key. Configure these settings within the individual form.":["Para ativar o hCAPTCHA, adicione sua chave do site e chave secreta. Configure essas configura\u00e7\u00f5es dentro do formul\u00e1rio individual."],"To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form.":["Para ativar o Cloudflare Turnstile, adicione sua chave do site e chave secreta. Configure essas configura\u00e7\u00f5es dentro do formul\u00e1rio individual."],"Save":["Salvar"],"Anonymous Analytics":["An\u00e1lise An\u00f4nima"],"Learn More":["Saiba mais"],"Admin Notification":["Notifica\u00e7\u00e3o do Administrador"],"Enable Admin Notification":["Ativar Notifica\u00e7\u00e3o de Administrador"],"Admin notifications keep you informed about new form entries since your last visit.":["As notifica\u00e7\u00f5es de administrador mant\u00eam voc\u00ea informado sobre novas entradas de formul\u00e1rio desde sua \u00faltima visita."],"Continue":["Continuar"],"Maximum Number of Entries":["N\u00famero M\u00e1ximo de Entradas"],"Maximum Entries":["Entradas M\u00e1ximas"],"Response Description After Maximum Entries":["Descri\u00e7\u00e3o da Resposta Ap\u00f3s o M\u00e1ximo de Entradas"],"Get Started":["Come\u00e7ar"],"Integration":["Integra\u00e7\u00e3o"],"Connect Native Integrations with SureForms":["Conecte Integra\u00e7\u00f5es Nativas com SureForms"],"Unlock powerful integrations in the Premium plan to automate your workflows and connect SureForms directly with your favourite tools.":["Desbloqueie integra\u00e7\u00f5es poderosas no plano Premium para automatizar seus fluxos de trabalho e conectar o SureForms diretamente com suas ferramentas favoritas."],"Send form submissions straight to CRMs, email, and marketing platforms":["Envie envios de formul\u00e1rios diretamente para CRMs, e-mail e plataformas de marketing"],"Automate repetitive tasks with seamless data syncing":["Automatize tarefas repetitivas com sincroniza\u00e7\u00e3o de dados perfeita"],"Access exclusive native integrations for faster workflows":["Acesse integra\u00e7\u00f5es nativas exclusivas para fluxos de trabalho mais r\u00e1pidos"],"Expected format for emails - email@sureforms.com or John Doe ":["Formato esperado para e-mails - email@sureforms.com ou John Doe "],"Payments":["Pagamentos"],"Stripe account disconnected successfully.":["Conta Stripe desconectada com sucesso."],"Failed to create webhook.":["Falha ao criar webhook."],"Failed to connect to Stripe.":["Falha ao conectar-se ao Stripe."],"Webhook":["Webhook"],"Knowledge Base":["Base de Conhecimento"],"What\u2019s New":["O que h\u00e1 de novo"],"delete":["excluir"],"Please type \"%s\" in the input box":["Por favor, digite \"%s\" na caixa de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, digite \"%s\" na caixa abaixo:"],"Type \"%s\"":["Digite \"%s\""],"Go to OttoKit Settings":["V\u00e1 para as Configura\u00e7\u00f5es do OttoKit"],"USD - US Dollar":["USD - D\u00f3lar dos EUA"],"Payment Mode":["Modo de Pagamento"],"Test Mode":["Modo de Teste"],"Live Mode":["Modo ao Vivo"],"General Settings":["Configura\u00e7\u00f5es Gerais"],"Set up email summaries, admin alerts, and data preferences to manage your forms with ease.":["Configure resumos de e-mail, alertas de administrador e prefer\u00eancias de dados para gerenciar seus formul\u00e1rios com facilidade."],"Customize default error messages shown when users submit invalid or incomplete form entries.":["Personalize as mensagens de erro padr\u00e3o exibidas quando os usu\u00e1rios enviam entradas de formul\u00e1rio inv\u00e1lidas ou incompletas."],"Enable spam protection for your forms using CAPTCHA services or honeypot security.":["Ative a prote\u00e7\u00e3o contra spam para seus formul\u00e1rios usando servi\u00e7os CAPTCHA ou seguran\u00e7a honeypot."],"Connect and manage your payment gateways to securely accept transactions through your forms.":["Conecte e gerencie seus gateways de pagamento para aceitar transa\u00e7\u00f5es com seguran\u00e7a atrav\u00e9s de seus formul\u00e1rios."],"1% transaction and payment gateway fees apply.":["Aplicam-se taxas de 1% para transa\u00e7\u00f5es e gateways de pagamento."],"2.9% transaction and payment gateway fees apply. Activate license to reduce transaction fees.":["Aplicam-se taxas de transa\u00e7\u00e3o e de gateway de pagamento de 2,9%. Ative a licen\u00e7a para reduzir as taxas de transa\u00e7\u00e3o."],"2.9% transaction and payment gateway fees apply.":["Aplicam-se taxas de transa\u00e7\u00e3o e de gateway de pagamento de 2,9%."],"Please visit %1$s, delete an unused webhook, then click below to retry.":["Por favor, visite %1$s, exclua um webhook n\u00e3o utilizado e, em seguida, clique abaixo para tentar novamente."],"SureForms could not create a webhook because your Stripe account has run out of free slots. Webhooks are needed to receive updates about payments.":["SureForms n\u00e3o p\u00f4de criar um webhook porque sua conta Stripe ficou sem slots gratuitos. Webhooks s\u00e3o necess\u00e1rios para receber atualiza\u00e7\u00f5es sobre pagamentos."],"Stripe Dashboard":["Painel do Stripe"],"Creating\u2026":["Criando\u2026"],"Create Webhook":["Criar Webhook"],"Successfully connected to Stripe!":["Conectado com sucesso ao Stripe!"],"Invalid response from server. Please try again.":["Resposta inv\u00e1lida do servidor. Por favor, tente novamente."],"Failed to disconnect Stripe account.":["Falha ao desconectar a conta do Stripe."],"Webhook created successfully!":["Webhook criado com sucesso!"],"Select Currency":["Selecionar moeda"],"Select the default currency for payment forms.":["Selecione a moeda padr\u00e3o para os formul\u00e1rios de pagamento."],"Connection Status":["Status da Conex\u00e3o"],"Disconnect Stripe Account":["Desconectar Conta do Stripe"],"Are you sure you want to disconnect your Stripe account? This will stop all active payments, subscriptions, and form transactions connected to this account.":["Tem certeza de que deseja desconectar sua conta do Stripe? Isso interromper\u00e1 todos os pagamentos, assinaturas e transa\u00e7\u00f5es de formul\u00e1rio ativas conectadas a esta conta."],"Disconnect":["Desconectar"],"Disconnecting\u2026":["Desconectando\u2026"],"Webhook successfully connected, all Stripe events are being tracked.":["Webhook conectado com sucesso, todos os eventos do Stripe est\u00e3o sendo rastreados."],"Connect your Stripe account to start accepting payments through your forms.":["Conecte sua conta Stripe para come\u00e7ar a aceitar pagamentos atrav\u00e9s de seus formul\u00e1rios."],"Connect to Stripe":["Conectar ao Stripe"],"Securely connect to Stripe with just a few clicks to begin accepting payments! ":["Conecte-se com seguran\u00e7a ao Stripe com apenas alguns cliques para come\u00e7ar a aceitar pagamentos!"],"Set the total number of submissions allowed for this form.":["Defina o n\u00famero total de envios permitidos para este formul\u00e1rio."],"Payment Methods":["M\u00e9todos de Pagamento"],"Test mode allows you to process payments without real charges. Switch to Live mode for actual transactions.":["O modo de teste permite processar pagamentos sem cobran\u00e7as reais. Mude para o modo ao vivo para transa\u00e7\u00f5es reais."],"General Payment Settings":["Configura\u00e7\u00f5es Gerais de Pagamento"],"These settings apply to all payment gateways.":["Essas configura\u00e7\u00f5es se aplicam a todos os gateways de pagamento."],"Stripe Settings":["Configura\u00e7\u00f5es do Stripe"],"Left ($100)":["Esquerda ($100)"],"Right (100$)":["Certo (100$)"],"Left Space ($ 100)":["Espa\u00e7o Esquerdo ($ 100)"],"Right Space (100 $)":["Espa\u00e7o Direito (100 $)"],"Currency Sign Position":["Posi\u00e7\u00e3o do Sinal de Moeda"],"Select the position of the currency symbol relative to the amount.":["Selecione a posi\u00e7\u00e3o do s\u00edmbolo da moeda em rela\u00e7\u00e3o ao valor."],"Learn":["Aprender"],"Enable email summaries":["Ativar resumos de e-mail"],"Enable IP logging":["Ativar registro de IP"],"Turn on Admin Notification from here.":["Ative a Notifica\u00e7\u00e3o de Administrador daqui."],"Send entries to 100+ popular apps.":["Envie entradas para mais de 100 aplicativos populares."],"Build automated workflows that run instantly.":["Crie fluxos de trabalho automatizados que sejam executados instantaneamente."],"Create custom app integrations using our Custom App feature.":["Crie integra\u00e7\u00f5es de aplicativos personalizadas usando nosso recurso de Aplicativo Personalizado."],"Keep your tools in sync automatically.":["Mantenha suas ferramentas sincronizadas automaticamente."],"This will install and activate OttoKit on your WordPress site to enable automation features.":["Isso instalar\u00e1 e ativar\u00e1 o OttoKit no seu site WordPress para habilitar recursos de automa\u00e7\u00e3o."],"Automate Your Forms with OttoKit":["Automatize Seus Formul\u00e1rios com OttoKit"],"Every form submission should trigger something \u2014 a Slack alert, a CRM lead, a follow-up email, or a new row in Google Sheets.":["Cada envio de formul\u00e1rio deve acionar algo \u2014 um alerta no Slack, um lead no CRM, um e-mail de acompanhamento ou uma nova linha no Google Sheets."],"MCP":["MCP"],"Configure AI client permissions and MCP server settings.":["Configure as permiss\u00f5es do cliente de IA e as configura\u00e7\u00f5es do servidor MCP."],"View documentation":["Ver documenta\u00e7\u00e3o"],"Copy to clipboard":["Copiar para a \u00e1rea de transfer\u00eancia"],"Claude Desktop":["Claude Desktop"],"~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows)":["~\/Library\/Application Support\/Claude\/claude_desktop_config.json (macOS) ou %APPDATA%\\Claude\\claude_desktop_config.json (Windows)"],"Claude Code":["C\u00f3digo Claude"],".mcp.json (project) or ~\/.claude.json (global)":[".mcp.json (projeto) ou ~\/.claude.json (global)"],"Cursor":["Cursor"],"~\/.cursor\/mcp.json":["~\/.cursor\/mcp.json"],"VS Code (Copilot)":["VS Code (Copilot)"],".vscode\/mcp.json (project) or settings.json > mcp.servers (global)":[".vscode\/mcp.json (projeto) ou settings.json > mcp.servers (global)"],"~\/.continue\/config.yaml or config.json":["~\/.continue\/config.yaml ou config.json"],"Your client's MCP configuration file":["O arquivo de configura\u00e7\u00e3o MCP do seu cliente"],"Connect Your AI Client":["Conecte seu cliente de IA"],"AI Client":["Cliente de IA"],"Create an Application Password \u2014 ":["Criar uma Senha de Aplicativo \u2014"],"Open Application Passwords":["Abrir Senhas de Aplicativos"],"Or use this CLI command to add the server quickly (you will still need to set the environment variables):":["Ou use este comando CLI para adicionar o servidor rapidamente (voc\u00ea ainda precisar\u00e1 definir as vari\u00e1veis de ambiente):"],"Copy the JSON config below into: ":["Copie a configura\u00e7\u00e3o JSON abaixo em:"],"Replace \"your-application-password\" with the password from Step 1.":["Substitua \"your-application-password\" pela senha do Passo 1."],"WP_API_URL \u2014 your site's MCP endpoint. WP_API_USERNAME \u2014 your WordPress username. WP_API_PASSWORD \u2014 the application password you generated.":["WP_API_URL \u2014 o endpoint MCP do seu site. WP_API_USERNAME \u2014 seu nome de usu\u00e1rio do WordPress. WP_API_PASSWORD \u2014 a senha do aplicativo que voc\u00ea gerou."],"View setup docs":["Ver documentos de configura\u00e7\u00e3o"],"The MCP Adapter plugin is installed but not active. Activate it to configure MCP settings.":["O plugin MCP Adapter est\u00e1 instalado, mas n\u00e3o est\u00e1 ativo. Ative-o para configurar as defini\u00e7\u00f5es do MCP."],"The MCP Adapter plugin is required to connect AI clients to your forms. Download and install it from GitHub, then activate it.":["O plugin MCP Adapter \u00e9 necess\u00e1rio para conectar clientes de IA aos seus formul\u00e1rios. Baixe e instale-o do GitHub, depois ative-o."],"Download the latest release from":["Baixe a vers\u00e3o mais recente de"],"Install the plugin via Plugins > Add New Plugin > Upload Plugin.":["Instale o plugin atrav\u00e9s de Plugins > Adicionar Novo Plugin > Enviar Plugin."],"Activate the MCP Adapter plugin.":["Ativar o plugin do Adaptador MCP."],"Activating\u2026":["Ativando\u2026"],"Activate MCP Adapter":["Ativar Adaptador MCP"],"Download MCP Adapter":["Baixar Adaptador MCP"],"Experimental":["Experimental"],"Enable Abilities":["Ativar habilidades"],"Register SureForms abilities with the WordPress Abilities API. When enabled, AI clients can list, read, create, edit, and delete your forms and entries. When disabled, no abilities are registered and AI clients cannot perform any actions on your forms.":["Registre as habilidades do SureForms com a API de Habilidades do WordPress. Quando ativado, os clientes de IA podem listar, ler, criar, editar e excluir seus formul\u00e1rios e entradas. Quando desativado, nenhuma habilidade \u00e9 registrada e os clientes de IA n\u00e3o podem realizar nenhuma a\u00e7\u00e3o em seus formul\u00e1rios."],"Abilities API \u2014 Edit":["API de Habilidades \u2014 Editar"],"Enable Edit Abilities":["Ativar habilidades de edi\u00e7\u00e3o"],"When enabled, AI clients can create new forms, update form titles, fields, and settings, duplicate forms, and modify entry statuses. When disabled, these abilities are unregistered and AI clients can only read your data.":["Quando ativado, os clientes de IA podem criar novos formul\u00e1rios, atualizar t\u00edtulos, campos e configura\u00e7\u00f5es de formul\u00e1rios, duplicar formul\u00e1rios e modificar status de entradas. Quando desativado, essas habilidades s\u00e3o desregistradas e os clientes de IA s\u00f3 podem ler seus dados."],"Abilities API \u2014 Delete":["API de Habilidades \u2014 Excluir"],"Enable Delete Abilities":["Ativar habilidades de exclus\u00e3o"],"When enabled, AI clients can permanently delete forms and entries. Deleted data cannot be recovered. When disabled, delete abilities are unregistered and AI clients cannot remove any data.":["Quando ativado, os clientes de IA podem excluir permanentemente formul\u00e1rios e entradas. Os dados exclu\u00eddos n\u00e3o podem ser recuperados. Quando desativado, as habilidades de exclus\u00e3o s\u00e3o desregistradas e os clientes de IA n\u00e3o podem remover nenhum dado."],"MCP Server":["Servidor MCP"],"Enable MCP Server":["Ativar Servidor MCP"],"Creates a dedicated SureForms MCP endpoint that AI clients like Claude can connect to. When disabled, the endpoint is removed and external AI clients cannot discover or call any SureForms abilities.":["Cria um endpoint SureForms MCP dedicado ao qual clientes de IA como Claude podem se conectar. Quando desativado, o endpoint \u00e9 removido e clientes de IA externos n\u00e3o podem descobrir ou chamar nenhuma habilidade do SureForms."],"Learn more":["Saiba mais"],"MCP Adapter Required":["Adaptador MCP Necess\u00e1rio"],"Heading 1":["T\u00edtulo 1"],"Heading 2":["T\u00edtulo 2"],"Heading 3":["T\u00edtulo 3"],"Heading 4":["T\u00edtulo 4"],"Heading 5":["T\u00edtulo 5"],"Heading 6":["T\u00edtulo 6"],"Google Maps":["Google Maps"],"Configure Google Maps API key for address autocomplete and map preview.":["Configure a chave da API do Google Maps para preenchimento autom\u00e1tico de endere\u00e7o e visualiza\u00e7\u00e3o do mapa."],"Help shape the future of SureForms":["Ajude a moldar o futuro do SureForms"],"Enable Google Address Autocomplete":["Ativar o preenchimento autom\u00e1tico de endere\u00e7os do Google"],"Upgrade to the SureForms Business Plan to add Google-powered address autocomplete with interactive map preview to your forms.":["Fa\u00e7a upgrade para o Plano de Neg\u00f3cios SureForms para adicionar a autocompleta\u00e7\u00e3o de endere\u00e7os com tecnologia do Google e visualiza\u00e7\u00e3o interativa de mapa aos seus formul\u00e1rios."],"Auto-suggest addresses as users type for faster, error-free submissions":["Sugira automaticamente endere\u00e7os \u00e0 medida que os usu\u00e1rios digitam para envios mais r\u00e1pidos e sem erros"],"Show an interactive map preview with draggable pin for precise locations":["Mostrar uma pr\u00e9-visualiza\u00e7\u00e3o de mapa interativo com um pino arrast\u00e1vel para locais precisos"],"Automatically populate address fields like city, state, and postal code":["Preencher automaticamente campos de endere\u00e7o como cidade, estado e c\u00f3digo postal"],"This form is now closed as we've received all the entries.":["Este formul\u00e1rio est\u00e1 agora fechado, pois recebemos todas as inscri\u00e7\u00f5es."],"Thank you for contacting us! We will be in touch with you shortly.":["Obrigado por nos contatar! Entraremos em contato com voc\u00ea em breve."],"Saving\u2026":["Salvando\u2026"],"When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.":["Quando ativado, este formul\u00e1rio n\u00e3o armazenar\u00e1 o IP do usu\u00e1rio, o nome do navegador e o nome do dispositivo nas entradas."],"Form data":["Dados do formul\u00e1rio"],"Unsaved changes":["Altera\u00e7\u00f5es n\u00e3o salvas"],"Keep editing":["Continue editando"],"Global Defaults":["Configura\u00e7\u00f5es Globais"],"Form Restrictions":["Restri\u00e7\u00f5es de Formul\u00e1rio"],"Configure default settings that apply to newly created forms.":["Configurar as configura\u00e7\u00f5es padr\u00e3o que se aplicam a formul\u00e1rios rec\u00e9m-criados."],"Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ":["Recolha informa\u00e7\u00f5es n\u00e3o sens\u00edveis do seu site, como a vers\u00e3o do PHP e as funcionalidades utilizadas, para nos ajudar a corrigir erros mais rapidamente, tomar decis\u00f5es mais inteligentes e desenvolver funcionalidades que realmente importam para voc\u00ea. "],"Failed to load pages. Please refresh and try again.":["Falha ao carregar as p\u00e1ginas. Por favor, atualize e tente novamente."],"Failed to load settings. Please refresh and try again.":["Falha ao carregar as configura\u00e7\u00f5es. Por favor, atualize e tente novamente."],"Form Validation fields cannot be left blank.":["Os campos de valida\u00e7\u00e3o de formul\u00e1rio n\u00e3o podem ficar em branco."],"Recipient email is required when email summaries are enabled.":["O e-mail do destinat\u00e1rio \u00e9 necess\u00e1rio quando os resumos por e-mail est\u00e3o ativados."],"Please enter a valid recipient email.":["Por favor, insira um email de destinat\u00e1rio v\u00e1lido."],"Settings saved.":["Configura\u00e7\u00f5es salvas."],"Failed to save settings.":["Falha ao salvar as configura\u00e7\u00f5es."],"Some settings failed to save. Please retry.":["Algumas configura\u00e7\u00f5es n\u00e3o foram salvas. Por favor, tente novamente."],"Some fields have unsaved changes. Discard them to continue, or stay to save your edits.":["Alguns campos t\u00eam altera\u00e7\u00f5es n\u00e3o salvas. Descarte-as para continuar ou permane\u00e7a para salvar suas edi\u00e7\u00f5es."],"Discard & switch":["Descartar e mudar"],"Quill heading picker: default paragraph style\u0004Normal":["Normal"]}}} \ No newline at end of file diff --git a/languages/sureforms-pt_PT-8cf77722f0a349f4f2e7f56437f288f9.json b/languages/sureforms-pt_PT-8cf77722f0a349f4f2e7f56437f288f9.json index c1281ed42..3f172a74f 100644 --- a/languages/sureforms-pt_PT-8cf77722f0a349f4f2e7f56437f288f9.json +++ b/languages/sureforms-pt_PT-8cf77722f0a349f4f2e7f56437f288f9.json @@ -1 +1 @@ -{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Painel de Controle"],"Settings":["Configura\u00e7\u00f5es"],"Entries":["Entradas"],"Move to Trash":["Mover para a Lixeira"],"Export":["Exportar"],"Trash":["Lixo"],"Published":["Publicado"],"Restore":["Restaurar"],"Delete Permanently":["Excluir permanentemente"],"Clear Filter":["Limpar Filtro"],"Activated":["Ativado"],"Edit":["Editar"],"Import Form":["Formul\u00e1rio de Importa\u00e7\u00e3o"],"Add New Form":["Adicionar Novo Formul\u00e1rio"],"View Form":["Ver Formul\u00e1rio"],"Forms":["Formul\u00e1rios"],"Shortcode":["C\u00f3digo curto"],"(no title)":["(sem t\u00edtulo)"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"What's New?":["O que h\u00e1 de novo?"],"Core":["N\u00facleo"],"Unlicensed":["Sem licen\u00e7a"],"Page":["P\u00e1gina"],"No Date":["Sem data"],"Invalid Date":["Data Inv\u00e1lida"],"Ready to go beyond free plan?":["Pronto para ir al\u00e9m do plano gratuito?"],"Upgrade now":["Atualize agora"],"and unlock the full power of SureForms!":["e desbloqueie todo o poder do SureForms!"],"Upgrade SureForms":["Atualizar SureForms"],"Clear Filters":["Limpar Filtros"],"Select Date Range":["Selecionar Intervalo de Datas"],"Actions":["A\u00e7\u00f5es"],"Duplicate":["Duplicar"],"All Forms":["Todas as Formas"],"Date & Time":["Data e Hora"],"Payments":["Pagamentos"],"Knowledge Base":["Base de Conhecimento"],"What\u2019s New":["O que h\u00e1 de novo"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/yyyy - dd\/mm\/yyyy"],"out of":["fora de"],"No entries found":["Nenhuma entrada encontrada"],"delete":["excluir"],"Please type \"%s\" in the input box":["Por favor, digite \"%s\" na caixa de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, digite \"%s\" na caixa abaixo:"],"Type \"%s\"":["Digite \"%s\""],"No results found":["Nenhum resultado encontrado"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["N\u00e3o conseguimos encontrar nenhum registro que corresponda aos seus filtros. Tente ajustar os filtros ou redefini-los para ver todos os resultados."],"Please select a file to import.":["Por favor, selecione um arquivo para importar."],"Invalid JSON file format.":["Formato de arquivo JSON inv\u00e1lido."],"Failed to read file.":["Falha ao ler o arquivo."],"Import failed.":["Falha na importa\u00e7\u00e3o."],"An error occurred during import.":["Ocorreu um erro durante a importa\u00e7\u00e3o."],"Import Forms":["Importar Formul\u00e1rios"],"Please select a valid JSON file.":["Por favor, selecione um arquivo JSON v\u00e1lido."],"Drag and drop or browse files":["Arraste e solte ou procure arquivos"],"Importing\u2026":["Importando\u2026"],"Drafts":["Rascunhos"],"Search forms\u2026":["Formul\u00e1rios de pesquisa\u2026"],"No forms found":["Nenhum formul\u00e1rio encontrado"],"Title":["T\u00edtulo"],"Copied!":["Copiado!"],"Copy Shortcode":["Copiar C\u00f3digo Curto"],"No Forms":["Sem formul\u00e1rios"],"Hi there, let's get you started":["Ol\u00e1, vamos come\u00e7ar"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Parece que voc\u00ea ainda n\u00e3o criou nenhum formul\u00e1rio. Comece a construir com o SureForms e lance formul\u00e1rios poderosos em apenas alguns cliques."],"Design forms with our Gutenberg-native builder.":["Projete formul\u00e1rios com nosso criador nativo do Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Use a IA para gerar formul\u00e1rios instantaneamente a partir de um prompt simples."],"Build engaging conversational, calculation, and multi-step forms.":["Crie formul\u00e1rios envolventes de conversa\u00e7\u00e3o, c\u00e1lculo e de m\u00faltiplas etapas."],"Create Form":["Criar Formul\u00e1rio"],"An error occurred while fetching forms.":["Ocorreu um erro ao buscar formul\u00e1rios."],"%d form moved to trash.":["%d formul\u00e1rio movido para a lixeira."],"%d form restored.":["%d formul\u00e1rio restaurado."],"%d form permanently deleted.":["%d formul\u00e1rio exclu\u00eddo permanentemente."],"An error occurred while performing the action.":["Ocorreu um erro ao realizar a a\u00e7\u00e3o."],"%d form imported successfully.":["%d formul\u00e1rio importado com sucesso."],"%d form will be moved to trash and can be restored later.":["%d formul\u00e1rio ser\u00e1 movido para a lixeira e poder\u00e1 ser restaurado mais tarde."],"Delete Form":["Excluir Formul\u00e1rio"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Tem certeza de que deseja excluir permanentemente o formul\u00e1rio %d? Esta a\u00e7\u00e3o n\u00e3o pode ser desfeita."],"Restore Form":["Restaurar Formul\u00e1rio"],"%d form will be restored from trash.":["%d formul\u00e1rio ser\u00e1 restaurado da lixeira."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Tem certeza de que deseja excluir permanentemente este formul\u00e1rio? Esta a\u00e7\u00e3o n\u00e3o pode ser desfeita."],"This form will be moved to trash and can be restored later.":["Este formul\u00e1rio ser\u00e1 movido para a lixeira e poder\u00e1 ser restaurado mais tarde."],"An error occurred while duplicating the form.":["Ocorreu um erro ao duplicar o formul\u00e1rio."],"This will create a copy of \"%s\" with all its settings.":["Isso criar\u00e1 uma c\u00f3pia de \"%s\" com todas as suas configura\u00e7\u00f5es."],"Learn":["Aprender"],"Export failed: no data received.":["Falha na exporta\u00e7\u00e3o: nenhum dado recebido."],"Select a SureForms export file (.json) to import.":["Selecione um arquivo de exporta\u00e7\u00e3o do SureForms (.json) para importar."],"Drop a form file (.json) here":["Solte um arquivo de formul\u00e1rio (.json) aqui"],"(Draft)":["(Rascunho)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Crie formul\u00e1rios instant\u00e2neos e compartilhe-os com um link\u2014sem necessidade de incorpora\u00e7\u00e3o."],"Form \"%s\" duplicated successfully.":["Formul\u00e1rio \"%s\" duplicado com sucesso."],"Error loading forms":["Erro ao carregar formul\u00e1rios"],"Move form to trash?":["Mover formul\u00e1rio para a lixeira?"],"Delete form?":["Excluir formul\u00e1rio?"],"Duplicate form?":["Duplicar formul\u00e1rio?"]}}} \ No newline at end of file +{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/forms.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Painel de Controle"],"Settings":["Configura\u00e7\u00f5es"],"Entries":["Entradas"],"Move to Trash":["Mover para a Lixeira"],"Export":["Exportar"],"Trash":["Lixo"],"Published":["Publicado"],"Restore":["Restaurar"],"Delete Permanently":["Excluir permanentemente"],"Clear Filter":["Limpar Filtro"],"Activated":["Ativado"],"Edit":["Editar"],"Import Form":["Formul\u00e1rio de Importa\u00e7\u00e3o"],"Add New Form":["Adicionar Novo Formul\u00e1rio"],"View Form":["Ver Formul\u00e1rio"],"Forms":["Formul\u00e1rios"],"Shortcode":["C\u00f3digo curto"],"(no title)":["(sem t\u00edtulo)"],"Confirm":["Confirmar"],"Cancel":["Cancelar"],"What's New?":["O que h\u00e1 de novo?"],"Core":["N\u00facleo"],"Unlicensed":["Sem licen\u00e7a"],"Page":["P\u00e1gina"],"No Date":["Sem data"],"Invalid Date":["Data Inv\u00e1lida"],"Ready to go beyond free plan?":["Pronto para ir al\u00e9m do plano gratuito?"],"Upgrade now":["Atualize agora"],"and unlock the full power of SureForms!":["e desbloqueie todo o poder do SureForms!"],"Upgrade SureForms":["Atualizar SureForms"],"Clear Filters":["Limpar Filtros"],"Select Date Range":["Selecionar Intervalo de Datas"],"Actions":["A\u00e7\u00f5es"],"Duplicate":["Duplicar"],"All Forms":["Todas as Formas"],"Date & Time":["Data e Hora"],"Payments":["Pagamentos"],"Knowledge Base":["Base de Conhecimento"],"What\u2019s New":["O que h\u00e1 de novo"],"mm\/dd\/yyyy - mm\/dd\/yyyy":["dd\/mm\/yyyy - dd\/mm\/yyyy"],"out of":["fora de"],"No entries found":["Nenhuma entrada encontrada"],"delete":["excluir"],"Please type \"%s\" in the input box":["Por favor, digite \"%s\" na caixa de entrada"],"To confirm, type \"%s\" in the box below:":["Para confirmar, digite \"%s\" na caixa abaixo:"],"Type \"%s\"":["Digite \"%s\""],"No results found":["Nenhum resultado encontrado"],"We couldn't find any records matching your filters. Try adjusting the filters or resetting them to see all results.":["N\u00e3o conseguimos encontrar nenhum registro que corresponda aos seus filtros. Tente ajustar os filtros ou redefini-los para ver todos os resultados."],"Please select a file to import.":["Por favor, selecione um arquivo para importar."],"Invalid JSON file format.":["Formato de arquivo JSON inv\u00e1lido."],"Failed to read file.":["Falha ao ler o arquivo."],"Import failed.":["Falha na importa\u00e7\u00e3o."],"An error occurred during import.":["Ocorreu um erro durante a importa\u00e7\u00e3o."],"Import Forms":["Importar Formul\u00e1rios"],"Please select a valid JSON file.":["Por favor, selecione um arquivo JSON v\u00e1lido."],"Drag and drop or browse files":["Arraste e solte ou procure arquivos"],"Importing\u2026":["Importando\u2026"],"Drafts":["Rascunhos"],"Search forms\u2026":["Formul\u00e1rios de pesquisa\u2026"],"No forms found":["Nenhum formul\u00e1rio encontrado"],"Title":["T\u00edtulo"],"Copied!":["Copiado!"],"Copy Shortcode":["Copiar C\u00f3digo Curto"],"No Forms":["Sem formul\u00e1rios"],"Hi there, let's get you started":["Ol\u00e1, vamos come\u00e7ar"],"It looks like you haven't created any forms yet. Start building with SureForms and launch powerful forms in just a few clicks.":["Parece que voc\u00ea ainda n\u00e3o criou nenhum formul\u00e1rio. Comece a construir com o SureForms e lance formul\u00e1rios poderosos em apenas alguns cliques."],"Design forms with our Gutenberg-native builder.":["Projete formul\u00e1rios com nosso criador nativo do Gutenberg."],"Use AI to generate forms instantly from a simple prompt.":["Use a IA para gerar formul\u00e1rios instantaneamente a partir de um prompt simples."],"Build engaging conversational, calculation, and multi-step forms.":["Crie formul\u00e1rios envolventes de conversa\u00e7\u00e3o, c\u00e1lculo e de m\u00faltiplas etapas."],"Create Form":["Criar Formul\u00e1rio"],"An error occurred while fetching forms.":["Ocorreu um erro ao buscar formul\u00e1rios."],"%d form moved to trash.":["%d formul\u00e1rio movido para a lixeira."],"%d form restored.":["%d formul\u00e1rio restaurado."],"%d form permanently deleted.":["%d formul\u00e1rio exclu\u00eddo permanentemente."],"An error occurred while performing the action.":["Ocorreu um erro ao realizar a a\u00e7\u00e3o."],"%d form imported successfully.":["%d formul\u00e1rio importado com sucesso."],"%d form will be moved to trash and can be restored later.":["%d formul\u00e1rio ser\u00e1 movido para a lixeira e poder\u00e1 ser restaurado mais tarde."],"Delete Form":["Excluir Formul\u00e1rio"],"Are you sure you want to permanently delete %d form? This action cannot be undone.":["Tem certeza de que deseja excluir permanentemente o formul\u00e1rio %d? Esta a\u00e7\u00e3o n\u00e3o pode ser desfeita."],"Restore Form":["Restaurar Formul\u00e1rio"],"%d form will be restored from trash.":["%d formul\u00e1rio ser\u00e1 restaurado da lixeira."],"Are you sure you want to permanently delete this form? This action cannot be undone.":["Tem certeza de que deseja excluir permanentemente este formul\u00e1rio? Esta a\u00e7\u00e3o n\u00e3o pode ser desfeita."],"This form will be moved to trash and can be restored later.":["Este formul\u00e1rio ser\u00e1 movido para a lixeira e poder\u00e1 ser restaurado mais tarde."],"An error occurred while duplicating the form.":["Ocorreu um erro ao duplicar o formul\u00e1rio."],"This will create a copy of \"%s\" with all its settings.":["Isso criar\u00e1 uma c\u00f3pia de \"%s\" com todas as suas configura\u00e7\u00f5es."],"Learn":["Aprender"],"Export failed: no data received.":["Falha na exporta\u00e7\u00e3o: nenhum dado recebido."],"Select a SureForms export file (.json) to import.":["Selecione um arquivo de exporta\u00e7\u00e3o do SureForms (.json) para importar."],"Drop a form file (.json) here":["Solte um arquivo de formul\u00e1rio (.json) aqui"],"(Draft)":["(Rascunho)"],"Build instant forms and share them with a link\u2014no embedding needed.":["Crie formul\u00e1rios instant\u00e2neos e compartilhe-os com um link\u2014sem necessidade de incorpora\u00e7\u00e3o."],"Form \"%s\" duplicated successfully.":["Formul\u00e1rio \"%s\" duplicado com sucesso."],"Error loading forms":["Erro ao carregar formul\u00e1rios"],"Move form to trash?":["Mover formul\u00e1rio para a lixeira?"],"Delete form?":["Excluir formul\u00e1rio?"],"Duplicate form?":["Duplicar formul\u00e1rio?"],"Switch to Draft":["Alternar para Rascunho"],"%d form switched to draft.":["%d formul\u00e1rio alterado para rascunho."],"Switch form to draft?":["Alterar formul\u00e1rio para rascunho?"],"%d form will be switched to draft and will no longer be publicly accessible.":["%d formul\u00e1rio ser\u00e1 alterado para rascunho e n\u00e3o estar\u00e1 mais acess\u00edvel ao p\u00fablico."],"This form will be switched to draft and will no longer be publicly accessible.":["Este formul\u00e1rio ser\u00e1 alterado para rascunho e n\u00e3o estar\u00e1 mais acess\u00edvel ao p\u00fablico."]}}} \ No newline at end of file diff --git a/languages/sureforms-pt_PT-e2cfcb2408d95abf73e3ead4a0965656.json b/languages/sureforms-pt_PT-e2cfcb2408d95abf73e3ead4a0965656.json new file mode 100644 index 000000000..82c4d203e --- /dev/null +++ b/languages/sureforms-pt_PT-e2cfcb2408d95abf73e3ead4a0965656.json @@ -0,0 +1 @@ +{"translation-revision-date":"2025-01-02T08:44:42+00:00","generator":"WP-CLI\/2.12.0","source":"assets\/build\/partialEntriesEmptyState.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"en","plural-forms":"nplurals=2; plural=(n != 1);"},"Dashboard":["Painel de Controle"],"Settings":["Configura\u00e7\u00f5es"],"Entries":["Entradas"],"Activated":["Ativado"],"Forms":["Formul\u00e1rios"],"What's New?":["O que h\u00e1 de novo?"],"Core":["N\u00facleo"],"Unlicensed":["Sem licen\u00e7a"],"Ready to go beyond free plan?":["Pronto para ir al\u00e9m do plano gratuito?"],"Upgrade now":["Atualize agora"],"and unlock the full power of SureForms!":["e desbloqueie todo o poder do SureForms!"],"Upgrade SureForms":["Atualizar SureForms"],"Payments":["Pagamentos"],"Knowledge Base":["Base de Conhecimento"],"What\u2019s New":["O que h\u00e1 de novo"],"Learn":["Aprender"],"Upgrade to SureForms":["Atualize para SureForms"],"Partial Entries Placeholder":["Espa\u00e7o reservado para entradas parciais"],"Capture in-progress form data the moment visitors stop typing \u2014 no submit required":["Capture os dados do formul\u00e1rio em andamento no momento em que os visitantes pararem de digitar \u2014 sem necessidade de envio"],"Recover abandoned submissions and follow up with prospects you would otherwise lose":["Recupere envios abandonados e fa\u00e7a o acompanhamento com potenciais clientes que voc\u00ea perderia de outra forma"],"Let visitors pick up where they left off with secure, shareable resume links":["Permita que os visitantes retomem de onde pararam com links de curr\u00edculo seguros e compartilh\u00e1veis"],"Stop Losing Leads to Abandoned Forms":["Pare de perder leads para formul\u00e1rios abandonados"],"See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:":["Veja o que os visitantes digitaram antes de sa\u00edrem. Fa\u00e7a upgrade para o SureForms Premium para desbloquear Entradas Parciais:"]}}} \ No newline at end of file diff --git a/languages/sureforms-pt_PT.mo b/languages/sureforms-pt_PT.mo index 91f4b5e02..11ec6ed96 100644 Binary files a/languages/sureforms-pt_PT.mo and b/languages/sureforms-pt_PT.mo differ diff --git a/languages/sureforms-pt_PT.po b/languages/sureforms-pt_PT.po index f43f78853..4400ee7c5 100644 --- a/languages/sureforms-pt_PT.po +++ b/languages/sureforms-pt_PT.po @@ -14,9 +14,9 @@ msgstr "" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -43,13 +43,14 @@ msgstr "Uma maneira simples, mas poderosa, de criar formulários modernos para o msgid "https://sureforms.com/" msgstr "https://sureforms.com/" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -58,15 +59,16 @@ msgstr "https://sureforms.com/" msgid "Dashboard" msgstr "Painel de Controle" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -74,21 +76,22 @@ msgstr "Painel de Controle" msgid "Settings" msgstr "Configurações" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "Novo Formulário" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -97,7 +100,7 @@ msgid "Entries" msgstr "Entradas" #. Translators: Post Title. -#: admin/admin.php:843 +#: admin/admin.php:869 #, php-format msgid "Edit %1$s" msgstr "Editar %1$s" @@ -111,25 +114,25 @@ msgstr "Editar %1$s" #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "A verificação do nonce falhou." #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 +#: admin/admin.php:1504 #, php-format msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "Por favor, %1$sative%2$s sua cópia do %3$s para obter novos recursos, acessar suporte, receber notificações de atualizações e muito mais." #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 +#: admin/admin.php:1522 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "O SureForms %1$s requer um mínimo de %2$s %3$s para funcionar corretamente. Por favor, atualize para a versão mais recente %4$saqui%5$s." -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 @@ -197,7 +200,7 @@ msgstr "Lixo" msgid "Published" msgstr "Publicado" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "Visualizar" @@ -286,17 +289,18 @@ msgstr "Nenhum plugin especificado" msgid "Plugin Successfully Activated" msgstr "Plugin ativado com sucesso" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "Ativando..." -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -305,17 +309,17 @@ msgstr "Ativando..." msgid "Activated" msgstr "Ativado" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "Ativar" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "Instalando..." -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "Instalado" @@ -323,14 +327,14 @@ msgstr "Instalado" msgid "You do not have permission to access this page." msgstr "Você não tem permissão para acessar esta página." -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "Nonce inválido." @@ -339,7 +343,7 @@ msgid "Form ID is required." msgstr "O ID do formulário é obrigatório." #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1001 msgid "Invalid form ID." msgstr "ID de formulário inválido." @@ -591,28 +595,23 @@ msgstr "Houve um erro ao tentar enviar seu formulário. Por favor, tente novamen msgid "Test Email Sent Successfully." msgstr "Email de teste enviado com sucesso." -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "Nenhum formulário encontrado." #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "Segunda-feira" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" -msgstr "Erro ao salvar configurações!" - -#: inc/global-settings/global-settings.php:122 #: assets/build/formEditor.js:172 msgid "Global Settings" msgstr "Configurações Globais" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "Configurações salvas com sucesso." @@ -626,7 +625,6 @@ msgid "Advanced Fields" msgstr "Campos Avançados" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "Este campo é obrigatório." @@ -638,7 +636,7 @@ msgstr "O valor precisa ser único." msgid "Sorry, you are not allowed to perform this action." msgstr "Desculpe, você não tem permissão para realizar esta ação." -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "Avalie SureForms" @@ -685,7 +683,7 @@ msgstr "Esconder" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "Editar Formulário" @@ -709,37 +707,38 @@ msgstr "Criar" msgid "Import Form" msgstr "Formulário de Importação" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "Adicionar Novo Formulário" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "Nenhum registro encontrado" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "É aqui que as entradas do seu formulário aparecerão" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "Ver Formulário" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "Ver Formulários" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -747,32 +746,37 @@ msgstr "Ver Formulários" msgid "Forms" msgstr "Formulários" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "Formulários de Pesquisa" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "Formulários dos Pais:" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "Nenhum formulário encontrado na Lixeira." -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "Formulário publicado." -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "Formulário atualizado." -#: inc/post-types.php:977 +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 msgid "Admin Notification Email" msgstr "Email de Notificação do Administrador" #. translators: %s: Form title smart tag -#: inc/post-types.php:984 +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 #, php-format msgid "New Form Submission - %s" msgstr "Nova Submissão de Formulário - %s" @@ -8236,7 +8240,7 @@ msgstr "Social" msgid "Travel" msgstr "Viagem" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "Formulário em Branco" @@ -8266,6 +8270,7 @@ msgstr "Feito com ♡ %s" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "(sem título)" @@ -8292,7 +8297,7 @@ msgstr "Alterar Formulário" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "Este formulário foi excluído ou está indisponível." @@ -8338,6 +8343,7 @@ msgstr "Avançado" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "Sem etiquetas disponíveis" @@ -8382,6 +8388,7 @@ msgstr "Redefinir" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "Etiquetas genéricas" @@ -8761,6 +8768,7 @@ msgstr "Integrações" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8773,6 +8781,7 @@ msgstr "O que há de novo?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8785,6 +8794,7 @@ msgstr "Núcleo" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -8793,52 +8803,52 @@ msgid "Unlicensed" msgstr "Sem licença" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 #, js-format msgid "%s Removed from Quick Action Bar." msgstr "%s removido da Barra de Ação Rápida." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "Adicionar à Barra de Ações Rápidas" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 #, js-format msgid "%s Added to Quick Action Bar." msgstr "%s adicionado à barra de ações rápidas." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "Já presente na barra de ações rápidas" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "Nenhum resultado encontrado." -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "o objeto de dados está vazio" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "Adicionar blocos à Barra de Ação Rápida" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "Reorganizar bloco dentro da Barra de Ação Rápida" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -8864,30 +8874,37 @@ msgid "Install & Activate" msgstr "Instalar e Ativar" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Compliance Settings" msgstr "Configurações de Conformidade" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "Ativar conformidade com o GDPR" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "Nunca armazene os dados de entrada após o envio do formulário" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "Quando ativado, este formulário nunca armazenará entradas." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "Excluir entradas automaticamente" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "Quando ativado, este formulário excluirá automaticamente as entradas após um determinado período de tempo." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "As entradas mais antigas do que os dias definidos serão excluídas automaticamente." @@ -8900,34 +8917,42 @@ msgid "The following CSS styles added below will only apply to this form contain msgstr "Os estilos CSS a seguir adicionados abaixo serão aplicados apenas a este contêiner de formulário." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "Visual" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "HTML" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "Todos os dados" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "Adicionar Shortcode" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "Etiquetas de entrada de formulário" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Comma separated values are also accepted." msgstr "Valores separados por vírgula também são aceitos." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "Notificação por Email" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Name" msgstr "Nome" @@ -8937,18 +8962,22 @@ msgid "Send Email To" msgstr "Enviar Email Para" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Subject" msgstr "Assunto" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "CC" msgstr "CC" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "BCC" msgstr "Cco" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reply To" msgstr "Responder a" @@ -8957,54 +8986,57 @@ msgid "Add Notification" msgstr "Adicionar Notificação" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." -msgstr "Notificação por email desativada com sucesso." - -#: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." -msgstr "Notificação por email ativada com sucesso." - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "Adicionar Chave" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "Adicionar Valor" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "Adicionar" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "Mensagem de Confirmação" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "Após o Envio do Formulário" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "Ocultar Formulário" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "Redefinir Formulário" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "URL personalizada" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "Adicionar Parâmetros de Consulta" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "Selecione se deseja adicionar pares chave-valor para campos de formulário a serem incluídos nos parâmetros de consulta" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "Parâmetros de Consulta" @@ -9017,14 +9049,17 @@ msgid "Suggestion: URL should use HTTPS" msgstr "Sugestão: a URL deve usar HTTPS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Success Message" msgstr "Mensagem de Sucesso" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect" msgstr "Redirecionar" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Redirect to" msgstr "Redirecionar para" @@ -9032,14 +9067,17 @@ msgstr "Redirecionar para" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "Página" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form Confirmation" msgstr "Confirmação de Formulário" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "Tipo de Confirmação" @@ -9181,7 +9219,7 @@ msgstr "Centro" msgid "Right" msgstr "Certo" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1178 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" @@ -9191,7 +9229,7 @@ msgstr "Google reCAPTCHA" msgid "CloudFlare Turnstile" msgstr "CloudFlare Turnstile" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1182 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" @@ -9250,7 +9288,8 @@ msgstr "Quebra de página" msgid "Previous" msgstr "Anterior" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 #: assets/build/formEditor.js:172 msgid "Thank you" msgstr "Obrigado" @@ -9483,7 +9522,7 @@ msgstr "Chave do Site" msgid "Secret Key" msgstr "Chave Secreta" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1186 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "Cloudflare Turnstile" @@ -9500,10 +9539,6 @@ msgstr "Ativar Segurança Honeypot" msgid "Enable Honeypot Security for better spam protection" msgstr "Ative a Segurança Honeypot para melhor proteção contra spam" -#: assets/build/settings.js:172 -msgid "This field cannot be left blank." -msgstr "Este campo não pode ficar em branco." - #: assets/build/templatePicker.js:172 msgid "Connect Now" msgstr "Conectar agora" @@ -10481,18 +10516,18 @@ msgstr "Desbloquear Adicionar Nota" msgid "With the SureForms Starter plan, enhance your submitted form entries by adding personalized notes for better clarity and tracking." msgstr "Com o plano SureForms Starter, melhore suas entradas de formulário enviadas adicionando notas personalizadas para maior clareza e acompanhamento." -#: inc/form-submit.php:823 +#: inc/form-submit.php:852 msgid "Email notification passed to the sending server" msgstr "Notificação por email enviada para o servidor de envio" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 +#: inc/form-submit.php:925 #, php-format msgid "Email notification recipient: %s" msgstr "Destinatário da notificação por e-mail: %s" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 +#: inc/form-submit.php:942 #, php-format msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "O servidor de e-mail não conseguiu enviar a notificação por e-mail. Destinatário: %1$s. Motivo: %2$s" @@ -10535,7 +10570,7 @@ msgstr "Desbloquear Formulários Conversacionais" msgid "With the SureForms Pro Plan, you can transform your forms into engaging conversational layouts for a seamless user experience." msgstr "Com o Plano SureForms Pro, você pode transformar seus formulários em layouts conversacionais envolventes para uma experiência do usuário perfeita." -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "Obtenha o SureForms Pro" @@ -10631,7 +10666,7 @@ msgstr "PX" msgid "Button" msgstr "Botão" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" @@ -10663,46 +10698,56 @@ msgid "SUREFORMS PREMIUM FIELDS" msgstr "CAMPOS PREMIUM DO SUREFORMS" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "O endereço de 'Email de Remetente' atual não corresponde ao nome de domínio do seu site (%1$s). Isso pode fazer com que seus e-mails de notificação sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endereço de Remetente que corresponda ao domínio do seu site (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "O endereço de 'Email de Remetente' atual não corresponde ao nome de domínio do seu site (%s). Isso pode fazer com que seus e-mails de notificação sejam bloqueados ou marcados como spam." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "We strongly recommend that you install the free " msgstr "Recomendamos fortemente que você instale o gratuito" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "plugin! O Assistente de Configuração facilita a correção dos seus e-mails." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "Alternativamente, tente usar um endereço de remetente que corresponda ao domínio do seu site (admin@%s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "Por favor, insira um endereço de e-mail válido. Suas notificações não serão enviadas se o campo não for preenchido corretamente." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Name" msgstr "De Nome" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "From Email" msgstr "De Email" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "O endereço de 'Email de Remetente' atual pode não corresponder ao nome de domínio do seu site (%1$s). Isso pode fazer com que seus e-mails de notificação sejam bloqueados ou marcados como spam. Alternativamente, tente usar um Endereço de Remetente que corresponda ao domínio do seu site (admin@%2$s)." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 #, js-format msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "O endereço de 'Email de Remetente' atual pode não corresponder ao nome de domínio do seu site (%s). Isso pode fazer com que seus e-mails de notificação sejam bloqueados ou marcados como spam." @@ -10736,24 +10781,24 @@ msgstr "Selecionar Gradiente" msgid "reCAPTCHA" msgstr "reCAPTCHA" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1122 msgid "Captcha validation failed. No error code provided." msgstr "A validação do Captcha falhou. Nenhum código de erro fornecido." -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1123 msgid "Captcha validation failed." msgstr "Falha na validação do captcha." -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1190 msgid "Unknown Captcha" msgstr "Captcha Desconhecido" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1191 msgid "Invalid captcha type." msgstr "Tipo de captcha inválido." #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 +#: inc/form-submit.php:1204 #, php-format msgid "%s verification failed. Please contact your site administrator." msgstr "A verificação de %s falhou. Por favor, entre em contato com o administrador do seu site." @@ -10776,11 +10821,11 @@ msgstr "A verificação do sitekey do HCaptcha falhou. Por favor, entre em conta msgid "%s sitekey is missing. Please contact your site administrator." msgstr "O sitekey %s está faltando. Por favor, entre em contato com o administrador do seu site." -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "SureMail" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "Modelos Iniciais" @@ -10821,6 +10866,7 @@ msgstr "Data Inválida" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10833,6 +10879,7 @@ msgstr "Pronto para ir além do plano gratuito?" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10845,6 +10892,7 @@ msgstr "Atualize agora" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10857,6 +10905,7 @@ msgstr "e desbloqueie todo o poder do SureForms!" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -10947,10 +10996,12 @@ msgid "Free" msgstr "Grátis" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "As entradas mais antigas que os dias selecionados serão excluídas." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "Período de Tempo das Entradas" @@ -10959,6 +11010,7 @@ msgid "Custom CSS Panel" msgstr "Painel de CSS Personalizado" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "As notificações podem usar apenas um único endereço de e-mail de remetente, portanto, insira um único endereço." @@ -10986,14 +11038,17 @@ msgid "Delete" msgstr "Excluir" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "Selecione a página para redirecionar" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "Procurar uma página" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "Selecione uma página" @@ -11119,6 +11174,7 @@ msgstr "Para ativar o hCAPTCHA, adicione sua chave do site e chave secreta. Conf msgid "To enable Cloudflare Turnstile, please add your site key and secret key. Configure these settings within the individual form." msgstr "Para ativar o Cloudflare Turnstile, adicione sua chave do site e chave secreta. Configure essas configurações dentro do formulário individual." +#: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Save" msgstr "Salvar" @@ -11139,8 +11195,8 @@ msgstr "Descreva o formulário que você deseja criar" msgid "We are building your form…" msgstr "Estamos construindo seu formulário…" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "SMTP" @@ -11270,28 +11326,28 @@ msgstr "Ativar Notificação de Administrador" msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "As notificações de administrador mantêm você informado sobre novas entradas de formulário desde sua última visita." -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "Usuário não autorizado." #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 +#: admin/admin.php:1774 #, php-format msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "%1$sComece por %2$scriar o seu primeiro formulário%3$s.%4$s%5$sExperimente o poder do nosso intuitivo Criador de Formulários com IA%6$s" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "SureForms está esperando por você!" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "Construir Meu Primeiro Formulário" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "Dispensar" @@ -11311,51 +11367,51 @@ msgstr "Entrar" msgid "Register" msgstr "Registrar" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "Entradas Recentes" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "( Últimos 7 dias )" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "Use lógica condicional para mostrar apenas o que importa" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "Divida seu formulário em etapas para mantê-lo simples" -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "Permita que as pessoas enviem arquivos diretamente para o seu formulário" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "Transforme as respostas em PDFs baixáveis automaticamente" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "Permita que os usuários assinem com um campo de assinatura simples" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "Conecte seu formulário a outras ferramentas usando webhooks" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "Use Formulários de Conversa para uma experiência semelhante a um chat" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "Permita que os usuários se registrem ou façam login através do seu formulário" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "Crie formulários que criem contas de usuário no WordPress" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "Adicione cálculos para totalizar automaticamente pontuações ou preços" @@ -11585,21 +11641,21 @@ msgstr "Toques Finais Que Fazem a Diferença:" msgid "Build Your First Form" msgstr "Crie Seu Primeiro Formulário" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "Ação ou nome de nonce inválido." -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "Token de segurança inválido." -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "Tipo de solicitação inválido." -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "Você não tem permissão para realizar esta ação." @@ -11677,10 +11733,12 @@ msgid "Form Restriction" msgstr "Restrição de Formulário" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "Número Máximo de Entradas" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "Entradas Máximas" @@ -11698,6 +11756,7 @@ msgid "Click here" msgstr "Clique aqui" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "Descrição da Resposta Após o Máximo de Entradas" @@ -11711,7 +11770,7 @@ msgstr "Olá," msgid "Email Summary of your last week - %1$s to %2$s" msgstr "Resumo do e-mail da sua última semana - %1$s a %2$s" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "Complementos Definitivos para Elementor" @@ -11773,7 +11832,7 @@ msgstr "Explore o SureDash" msgid "Something went wrong. We have logged the error for further investigation" msgstr "Algo deu errado. Registramos o erro para investigação posterior" -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "O campo não é válido." @@ -11837,16 +11896,18 @@ msgid "SureForms Video Thumbnail" msgstr "Miniatura de Vídeo do SureForms" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Expected format for emails - email@sureforms.com or John Doe " msgstr "Formato esperado para e-mails - email@sureforms.com ou John Doe " -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -12010,47 +12071,47 @@ msgstr "O modo de teste está ativado:" msgid "Click here to enable live mode and accept payment" msgstr "Clique aqui para ativar o modo ao vivo e aceitar pagamento" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "Aumente a Entregabilidade do Seu Email Instantaneamente!" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "Acesse um serviço de entrega de e-mails poderoso e fácil de usar que garante que seus e-mails cheguem nas caixas de entrada, e não nas pastas de spam. Automatize seus fluxos de trabalho de e-mail do WordPress com confiança usando o SureMail." -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "Automatize seus fluxos de trabalho do WordPress sem esforço." -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "Conecte seus plugins do WordPress e aplicativos favoritos, automatize tarefas e sincronize dados sem esforço usando o construtor de fluxo de trabalho visual e limpo do OttoKit — sem necessidade de codificação ou configuração complexa." -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "Lance belos sites em minutos!" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "Escolha entre modelos projetados profissionalmente, importe com um clique e personalize sem esforço para combinar com sua marca." -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "Potencie o Elementor para criar sites impressionantes mais rapidamente!" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "Melhore o Elementor com widgets e modelos poderosos. Construa sites impressionantes e de alto desempenho mais rapidamente com elementos de design criativos e personalização perfeita." -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "SureRank" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "Eleve seu SEO e suba nos rankings de busca sem esforço!" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "Aumente a visibilidade do seu site com automação inteligente de SEO. Otimize o conteúdo, acompanhe o desempenho das palavras-chave e obtenha insights acionáveis, tudo dentro do WordPress." @@ -12175,49 +12236,49 @@ msgstr "%1$d pagamento(s) excluído(s) com sucesso. %2$d falhou." msgid "Failed to delete payments. Please try again." msgstr "Falha ao excluir pagamentos. Por favor, tente novamente." -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "Formulário Desconhecido" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "N/D" #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "Subscription" msgstr "Assinatura" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "Renovação" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "Uma Vez" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "Desconhecido" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -12233,7 +12294,7 @@ msgstr "É necessário um e-mail válido do cliente para pagamentos." #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -12312,7 +12373,7 @@ msgstr "Erro inesperado: %s" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "ID de assinatura não encontrado." @@ -12375,9 +12436,9 @@ msgstr "Verificação de Assinatura" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 +#: inc/payments/stripe/stripe-webhook.php:1120 #, php-format msgid "Subscription ID: %s" msgstr "ID de Assinatura: %s" @@ -12392,13 +12453,13 @@ msgstr "ID de Assinatura: %s" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 #, php-format msgid "Payment Gateway: %s" msgstr "Gateway de Pagamento: %s" @@ -12411,7 +12472,7 @@ msgstr "ID da Intenção de Pagamento: %s" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 +#: inc/payments/stripe/stripe-webhook.php:1050 #, php-format msgid "Charge ID: %s" msgstr "ID de Cobrança: %s" @@ -12421,14 +12482,14 @@ msgstr "ID de Cobrança: %s" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 +#: inc/payments/stripe/admin-stripe-handler.php:516 #, php-format msgid "Subscription Status: %s" msgstr "Status da Assinatura: %s" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 +#: inc/payments/stripe/stripe-webhook.php:1124 #, php-format msgid "Customer ID: %s" msgstr "ID do Cliente: %s" @@ -12437,8 +12498,8 @@ msgstr "ID do Cliente: %s" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 #, php-format msgid "Amount: %1$s %2$s" msgstr "Quantia: %1$s %2$s" @@ -12473,7 +12534,7 @@ msgstr "Verificação de Pagamento" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 +#: inc/payments/stripe/stripe-webhook.php:1112 #, php-format msgid "Transaction ID: %s" msgstr "ID da Transação: %s" @@ -12482,7 +12543,7 @@ msgstr "ID da Transação: %s" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 #, php-format msgid "Status: %s" msgstr "Status: %s" @@ -12850,23 +12911,23 @@ msgid "Unknown error" msgstr "Erro desconhecido" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "ID de pagamento ausente." -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "Você não tem permissão para realizar esta ação." #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "Pagamento não encontrado no banco de dados." #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "Este não é um pagamento de assinatura." @@ -12876,7 +12937,7 @@ msgid "Subscription cancellation failed." msgstr "Falha ao cancelar a assinatura." #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "Falha ao atualizar o status da assinatura no banco de dados." @@ -12885,58 +12946,58 @@ msgstr "Falha ao atualizar o status da assinatura no banco de dados." msgid "Invalid payment data." msgstr "Dados de pagamento inválidos." -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "Apenas pagamentos bem-sucedidos ou parcialmente reembolsados podem ser reembolsados." -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "Incompatibilidade de ID de transação." -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "Formato de ID de transação inválido para reembolso." -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "Falha ao processar o reembolso através da API do Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "Falha ao atualizar o registro de pagamento após o reembolso." #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "Pagamento reembolsado com sucesso." #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "Falha ao processar o reembolso. Por favor, tente novamente." -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "Falha na pausa da assinatura." -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "Cheio" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "Parcial" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 #, php-format msgid "Refund ID: %s" msgstr "ID de Reembolso: %s" @@ -12944,9 +13005,9 @@ msgstr "ID de Reembolso: %s" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 #, php-format msgid "Refund Amount: %1$s %2$s" msgstr "Montante do Reembolso: %1$s %2$s" @@ -12954,9 +13015,9 @@ msgstr "Montante do Reembolso: %1$s %2$s" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 #, php-format msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "Total reembolsado: %1$s %2$s de %3$s %4$s" @@ -12964,9 +13025,9 @@ msgstr "Total reembolsado: %1$s %2$s de %3$s %4$s" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 #, php-format msgid "Refund Status: %s" msgstr "Status do Reembolso: %s" @@ -12975,10 +13036,10 @@ msgstr "Status do Reembolso: %s" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 #, php-format msgid "Payment Status: %s" msgstr "Status do Pagamento: %s" @@ -12986,132 +13047,132 @@ msgstr "Status do Pagamento: %s" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 #, php-format msgid "Refunded by: %s" msgstr "Reembolsado por: %s" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 #, php-format msgid "Refund Notes: %s" msgstr "Notas de Reembolso: %s" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 #, php-format msgid "%s Payment Refund" msgstr "Reembolso de Pagamento %s" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 #, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "Os webhooks mantêm o SureForms sincronizado com o Stripe, atualizando automaticamente os dados de pagamento e assinatura. Por favor, %1$s Webhook." -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "configurar" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "Parâmetros de reembolso inválidos fornecidos." -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "Este pagamento não está relacionado a uma assinatura." -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "Apenas pagamentos de assinaturas ativas, bem-sucedidas ou parcialmente reembolsadas podem ser reembolsados." -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "A criação do reembolso do Stripe falhou. Por favor, verifique o seu painel do Stripe para mais detalhes." -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "O reembolso foi processado pelo Stripe, mas falhou ao atualizar os registros locais. Por favor, verifique seus registros de pagamento manualmente." -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "Pagamento da assinatura reembolsado com sucesso." #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 +#: inc/payments/stripe/admin-stripe-handler.php:977 #, php-format msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "O valor do reembolso excede o valor disponível. Máximo reembolsável: %1$s %2$s" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "O valor do reembolso deve ser maior que zero." -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "O valor do reembolso deve ser de pelo menos $0,50." -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "Não foi possível determinar o método de reembolso apropriado para este pagamento de assinatura." #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 +#: inc/payments/stripe/admin-stripe-handler.php:1256 #, php-format msgid "%s Subscription Payment Refund" msgstr "Reembolso de Pagamento de Assinatura %s" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "Este pagamento já foi totalmente reembolsado." -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "O pagamento não pôde ser encontrado no Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "O valor do reembolso excede o montante disponível para reembolso." -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "O pagamento desta assinatura não pôde ser encontrado." -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "A assinatura não pôde ser encontrada no Stripe." -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "Esta assinatura não tem pagamentos bem-sucedidos para reembolso." -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "O método de pagamento para esta assinatura é inválido." -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "Permissões insuficientes para processar reembolsos." -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "Solicitações demais. Por favor, tente novamente em um momento." -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "Erro de rede. Por favor, verifique sua conexão e tente novamente." #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 +#: inc/payments/stripe/admin-stripe-handler.php:1308 #, php-format msgid "Subscription refund failed: %s" msgstr "Falha no reembolso da assinatura: %s" @@ -13261,7 +13322,7 @@ msgstr "Cancelado em: %s" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 +#: inc/payments/stripe/stripe-webhook.php:892 #, php-format msgid "Cancellation Reason: %s" msgstr "Motivo do Cancelamento: %s" @@ -13280,24 +13341,24 @@ msgstr "Assinatura Cancelada" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "Webhook" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "Reembolso Cancelado" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:882 #, php-format msgid "Canceled Refund Amount: %1$s %2$s" msgstr "Montante de Reembolso Cancelado: %1$s %2$s" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 +#: inc/payments/stripe/stripe-webhook.php:885 #, php-format msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "Reembolso Restante: %1$s %2$s de %3$s %4$s" @@ -13306,52 +13367,52 @@ msgstr "Reembolso Restante: %1$s %2$s de %3$s %4$s" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:896 #, php-format msgid "Canceled by: %s" msgstr "Cancelado por: %s" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "Pagamento inicial da assinatura bem-sucedido" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 #, php-format msgid "Invoice ID: %s" msgstr "ID da Fatura: %s" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "Status do Pagamento: Bem-sucedido" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "Status da Assinatura: Ativa" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "Pagamento da Cobrança de Assinatura" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "Concluído" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 +#: inc/payments/stripe/stripe-webhook.php:1126 #, php-format msgid "Customer Email: %s" msgstr "Email do Cliente: %s" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 +#: inc/payments/stripe/stripe-webhook.php:1128 #, php-format msgid "Customer Name: %s" msgstr "Nome do Cliente: %s" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "Criado através do ciclo de faturamento por assinatura" @@ -13359,19 +13420,20 @@ msgstr "Criado através do ciclo de faturamento por assinatura" msgid "Edit this form" msgstr "Edite este formulário" -#: inc/post-types.php:1060 +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." msgstr "Seu formulário foi enviado com sucesso. Analisaremos seus dados e entraremos em contato em breve." #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "É necessário o ID de entrada." #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "Entrada não encontrada." @@ -13571,6 +13633,7 @@ msgstr "Selecione o campo de email que contém o email do cliente" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13583,6 +13646,7 @@ msgstr "Base de Conhecimento" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13664,6 +13728,7 @@ msgid "Go to Forms" msgstr "Ir para Formulários" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13671,6 +13736,7 @@ msgid "delete" msgstr "excluir" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13679,6 +13745,7 @@ msgid "Please type \"%s\" in the input box" msgstr "Por favor, digite \"%s\" na caixa de entrada" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -13687,6 +13754,7 @@ msgid "To confirm, type \"%s\" in the box below:" msgstr "Para confirmar, digite \"%s\" na caixa abaixo:" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14113,7 +14181,7 @@ msgstr "Use a IA para gerar formulários instantaneamente a partir de um prompt msgid "Build engaging conversational, calculation, and multi-step forms." msgstr "Crie formulários envolventes de conversação, cálculo e de múltiplas etapas." -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "Criar Formulário" @@ -14897,22 +14965,22 @@ msgstr "Aviso: A assinatura foi cancelada permanentemente. O cliente não será #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "Pausado" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 +#: inc/payments/stripe/admin-stripe-handler.php:521 #, php-format msgid "Paused by: %s" msgstr "Pausado por: %s" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "Aviso: A cobrança da assinatura foi pausada. Nenhuma cobrança ocorrerá até que a assinatura seja retomada." -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "Assinatura Pausada" @@ -14921,6 +14989,7 @@ msgid "This entry will be moved to trash and can be restored later." msgstr "Esta entrada será movida para a lixeira e poderá ser restaurada mais tarde." #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "Defina o número total de envios permitidos para este formulário." @@ -15048,7 +15117,7 @@ msgstr "É necessário o valor do campo de quantidade variável." msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "Valor do pagamento abaixo do mínimo. Mínimo: %1$s, recebido %2$s." -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "(Cópia)" @@ -15109,12 +15178,14 @@ msgstr "Isso criará uma cópia de \"%s\" com todas as suas configurações." msgid "Pay with credit or debit card" msgstr "Pague com cartão de crédito ou débito" +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 msgid "This form is not yet available. Please check back after the scheduled start time." msgstr "Este formulário ainda não está disponível. Por favor, verifique novamente após o horário de início programado." #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "Este formulário não está mais aceitando envios. O período de envio terminou." @@ -15133,7 +15204,7 @@ msgstr "O processamento de reembolsos não é suportado para o gateway %s." msgid "Number field configuration not found." msgstr "Configuração do campo numérico não encontrada." -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "Parâmetros de reembolso inválidos." @@ -15248,24 +15319,24 @@ msgid "Stripe Settings" msgstr "Configurações do Stripe" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 +#: admin/admin.php:1439 #, php-format msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "O SureForms %1$s requer o mínimo %2$s %3$s para funcionar corretamente. Por favor, atualize para a versão mais recente." -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "Atualizar agora" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "SureContact" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "Transforme e-mails em receita com um CRM feito para o seu site!" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "Envie newsletters, execute campanhas, configure automações, gerencie contatos e veja exatamente quanto de receita seus e-mails geram, tudo em um só lugar." @@ -15301,13 +15372,14 @@ msgstr "Posição do Sinal de Moeda" msgid "Select the position of the currency symbol relative to the amount." msgstr "Selecione a posição do símbolo da moeda em relação ao valor." -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -15315,40 +15387,40 @@ msgstr "Selecione a posição do símbolo da moeda em relação ao valor." msgid "Learn" msgstr "Aprender" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "Incrível! SureForms está alimentando seus formulários e submissões - vamos continuar crescendo juntos!" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "Se o SureForms foi útil, você se importaria de deixar um comentário de 5 estrelas no WordPress.org?" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "Talvez mais tarde" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "Eu já fiz" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "SureForms está pronto para potencializar seus formulários — explore o que é possível!" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "Gerencie seus formulários, acompanhe as submissões e descubra recursos como o Construtor de Formulários com IA, integrações de pagamento e muito mais no painel do SureForms." -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "Ir para o Painel" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "Eu já sei" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "Parâmetros inválidos." @@ -15510,7 +15582,7 @@ msgstr "Pelo menos um campo de formulário é necessário." msgid "Failed to generate form fields from the provided data." msgstr "Falha ao gerar campos do formulário a partir dos dados fornecidos." -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "Falha ao criar o formulário." @@ -15730,15 +15802,16 @@ msgstr "Campo de texto" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "Este formulário ainda não está disponível. Verifique novamente após o horário de início programado." +#: inc/admin/html-form-detector.php:268 #: inc/form-submit.php:99 #: inc/form-submit.php:400 #: inc/form-submit.php:445 -#: inc/form-submit.php:968 +#: inc/form-submit.php:997 #: inc/payments/front-end.php:78 #: inc/payments/front-end.php:263 #: inc/rest-api.php:98 @@ -15752,9 +15825,10 @@ msgstr "Este formulário ainda não está disponível. Verifique novamente após #: inc/rest-api.php:667 #: inc/rest-api.php:716 #: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 msgid "Security verification failed. Please refresh the page and try again." msgstr "A verificação de segurança falhou. Por favor, atualize a página e tente novamente." @@ -15787,19 +15861,19 @@ msgstr "Por favor, verifique o formulário em busca de erros." msgid "Your submission was flagged as spam. Please try again." msgstr "Sua submissão foi marcada como spam. Por favor, tente novamente." -#: inc/form-submit.php:651 +#: inc/form-submit.php:680 msgid "Unable to submit form. Please try again." msgstr "Não foi possível enviar o formulário. Por favor, tente novamente." -#: inc/form-submit.php:903 +#: inc/form-submit.php:932 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "Nenhum plugin SMTP detectado. Por favor, configure um plugin SMTP para habilitar o envio de e-mails." -#: inc/form-submit.php:904 +#: inc/form-submit.php:933 msgid "Email sending failed for an unknown reason." msgstr "O envio do e-mail falhou por uma razão desconhecida." -#: inc/form-submit.php:943 +#: inc/form-submit.php:972 msgid "No emails were sent." msgstr "Nenhum e-mail foi enviado." @@ -15984,7 +16058,7 @@ msgstr "Não foi possível criar o pagamento. Por favor, entre em contato com o msgid "Subscription canceled successfully!" msgstr "Assinatura cancelada com sucesso!" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "Assinatura pausada com sucesso!" @@ -16016,8 +16090,8 @@ msgstr "Não foi possível excluir o webhook." msgid "Unable to connect to Stripe." msgstr "Não foi possível conectar ao Stripe." -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "Este formulário está fechado. O período de envio terminou." @@ -16056,28 +16130,28 @@ msgstr "Ação inválida. Use \"ler\" ou \"não lida\"." msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "Ação inválida. Use \"trash\" ou \"restore\"." -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "Selecione pelo menos um formulário e especifique uma ação." -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "Formulário não encontrado ou não é um tipo de formulário válido." -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "Este formulário já está na lixeira." -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "Este formulário não está na lixeira." -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "Ação inválida." #. translators: %s: action name -#: inc/rest-api.php:1100 +#: inc/rest-api.php:1124 #, php-format msgid "Failed to %s this form. Please try again." msgstr "Falha ao %s este formulário. Por favor, tente novamente." @@ -16220,10 +16294,6 @@ msgstr "Informações de entrada" msgid "Resend Email Notification" msgstr "Reenviar Notificação de Email" -#: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." -msgstr "Quando ativado, este formulário não armazenará o IP do usuário, o nome do navegador ou o nome do dispositivo nas entradas." - #: assets/build/formEditor.js:172 msgid "Select a spam protection service. Configure API keys in Global Settings before enabling." msgstr "Selecione um serviço de proteção contra spam. Configure as chaves de API nas Configurações Globais antes de ativar." @@ -16691,26 +16761,27 @@ msgstr "Segredo do webhook não configurado." msgid "Invalid webhook signature." msgstr "Assinatura de webhook inválida." -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "Questionários" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "Entradas do Quiz" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "Novo" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1006 msgid "Invalid form." msgstr "Formulário inválido." -#: inc/form-submit.php:982 +#: inc/form-submit.php:1011 msgid "Too many requests. Please try again shortly." msgstr "Solicitações demais. Por favor, tente novamente em breve." @@ -16922,10 +16993,6 @@ msgstr "Política de Privacidade" msgid "Finish" msgstr "Terminar" -#: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." -msgstr "Escolha um método de proteção contra spam para este formulário para evitar envios indesejados." - #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Send entries to 100+ popular apps." @@ -17005,6 +17072,7 @@ msgstr "Crie Questionários Envolventes com SureForms" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "Transforme seus formulários em questionários poderosos. Faça upgrade para o SureForms para desbloquear capacidades de questionário:" +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/surveyEmptyState.js:172 msgid "Upgrade to SureForms" @@ -17222,39 +17290,45 @@ msgstr "Perfeito para educação, treinamento e curiosidades divertidas" msgid "Select this to create a quiz with scored questions and graded results." msgstr "Selecione isto para criar um questionário com perguntas pontuadas e resultados avaliados." -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "Relatórios de Pesquisa" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "Título 1" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "Título 2" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "Título 3" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "Título 4" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "Título 5" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "Título 6" @@ -17271,7 +17345,7 @@ msgid "Cancellation not supported for this gateway." msgstr "Cancelamento não suportado para este gateway." #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "Assinatura cancelada com sucesso." @@ -17488,10 +17562,6 @@ msgstr "Configure a chave da API do Google Maps para preenchimento automático d msgid "Help shape the future of SureForms" msgstr "Ajude a moldar o futuro do SureForms" -#: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " -msgstr "Compartilhe como você usa o plugin para que possamos desenvolver funcionalidades que importam, corrigir problemas mais rapidamente e tomar decisões mais inteligentes." - #: assets/build/settings.js:172 msgid "Enable Google Address Autocomplete" msgstr "Ativar o preenchimento automático de endereços do Google" @@ -17576,16 +17646,16 @@ msgstr "Złoty polonês" msgid "Dynamic Default Value" msgstr "Valor Padrão Dinâmico" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "Ei! Parece que você está criando um formulário. Construa um formulário pronto para uso em menos de 30 segundos com o SureForms AI, sem necessidade de configuração extra." -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "Publicação inválida." -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "Você não pode editar esta postagem." @@ -17624,7 +17694,7 @@ msgid "Error creating SureForms Form." msgstr "Erro ao criar o formulário SureForms." #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 #, php-format msgid "Please enter at least %s characters." @@ -17782,22 +17852,374 @@ msgstr "A resposta da IA estava vazia. Por favor, refine seu prompt e tente nova msgid "Unable to build form fields from the AI response." msgstr "Não foi possível criar campos de formulário a partir da resposta da IA." -#: inc/post-types.php:205 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "Entradas Parciais" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." +msgstr "Este formulário está agora fechado, pois recebemos todas as inscrições." + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." +msgstr "Aba de configurações inválida." + +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "Obrigado por nos contatar! Entraremos em contato com você em breve." + +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "Use a ação de restauração para recuperar um formulário descartado antes de alterá-lo para rascunho." + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "Este formulário já é um rascunho." + +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "Você não tem permissão para editar este formulário." + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "ID de formulário inválido." + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "Configurações do formulário salvas." + +#: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "O limite de entrada depende de entradas armazenadas para contar as submissões. Enquanto as Configurações de Conformidade tiverem \"Nunca armazenar dados de entrada após o envio do formulário\" ativado, esse limite não será aplicado. Desative essa opção ou remova o limite de entrada para usar este recurso." + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "Espaço reservado para entradas parciais" + +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "Texto de espaço reservado mostrado dentro do campo de entrada/área de texto vazia ou como a primeira opção vazia em um menu suspenso." + +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "Matriz de campos produzida pelo analisador do lado do editor." + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "HTML bruto da fonte . Necessário quando a confiança do analisador é baixa para que possamos entregar a marcação ao middleware de IA." + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "Descritor de estilo de melhor esforço (cores hexadecimais) extraído de estilos embutidos no de origem." + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "Você não tem permissão para converter formulários HTML." + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "Forma convertida" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "O formulário HTML é muito grande para converter. Por favor, simplifique a marcação ou construa o formulário manualmente." + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "Não foi possível derivar campos do formulário fornecido." + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "O serviço SureForms AI não conseguiu processar este formulário. Tente novamente ou construa o formulário manualmente." + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "O serviço SureForms AI retornou uma resposta inutilizável. Tente novamente ou construa o formulário manualmente." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "Use uma tag inteligente como {get_input:country}. A primeira opção cujo título corresponder ao valor resolvido será pré-selecionada." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "Use uma tag inteligente como {get_input:colors} e passe valores separados por pipe na URL (por exemplo ?colors=Red|Blue). Toda opção cujo título corresponder a um valor será marcada. Você também pode encadear várias tags inteligentes separadas por pipes." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "Use uma tag inteligente como {get_input:colors} e passe valores separados por pipe na URL (por exemplo ?colors=Red|Blue). Toda opção cujo rótulo corresponder a um valor será pré-selecionada. Você também pode encadear várias tags inteligentes separadas por pipes." + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "Use uma tag inteligente como {get_input:country}. A primeira opção cujo rótulo corresponder ao valor resolvido será pré-selecionada." + +#: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "Configurações salvas, mas os atributos da postagem (senha / título / conteúdo) não foram atualizados. Tente novamente para persistir." + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "Falha ao salvar as configurações do formulário." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "Salvando…" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." +msgstr "Quando ativado, este formulário não armazenará o IP do usuário, o nome do navegador e o nome do dispositivo nas entradas." + +#: assets/build/formEditor.js:172 +msgid "Failed to save. Please try again." +msgstr "Falha ao salvar. Por favor, tente novamente." + +#: assets/build/formEditor.js:172 +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "As chaves da API reCAPTCHA para a versão selecionada não estão configuradas. Defina-as nas Configurações Globais." + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "Por favor, selecione uma versão do reCAPTCHA." + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "As chaves da API do hCaptcha não estão configuradas. Defina-as nas Configurações Globais." + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." +msgstr "As chaves da API do Cloudflare Turnstile não estão configuradas. Defina-as nas Configurações Globais." + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "Dados do formulário" + +#: assets/build/formEditor.js:172 +msgid "Some fields need attention" +msgstr "Alguns campos precisam de atenção" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Unsaved changes" +msgstr "Alterações não salvas" + +#: assets/build/formEditor.js:172 +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "Um endereço de e-mail do destinatário e uma linha de assunto são necessários antes que esta notificação possa ser salva. Corrija os campos destacados ou descarte suas alterações para voltar." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "Você tem alterações não salvas para esta notificação. Descarte-as para voltar ou permaneça para salvá-las." + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "Descartar e voltar" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "Fique e conserte" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" +msgstr "Continue editando" + +#: assets/build/formEditor.js:172 +msgid "Please provide a recipient email address." +msgstr "Por favor, forneça um endereço de e-mail do destinatário." + +#: assets/build/formEditor.js:172 +msgid "Please provide a subject line." +msgstr "Por favor, forneça uma linha de assunto." + +#: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "Por favor, forneça um URL personalizado." + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "Você tem alterações não salvas. Descarte-as para continuar ou permaneça para salvar suas alterações." + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "Descartar e continuar" + +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "Alternar para Rascunho" + +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "%d formulário alterado para rascunho." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "Alterar formulário para rascunho?" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "%d formulário será alterado para rascunho e não estará mais acessível ao público." +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "Este formulário será alterado para rascunho e não estará mais acessível ao público." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "SureForms não conseguiu autenticar esta solicitação. Por favor, recarregue o editor e tente novamente." + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "%s — Forma convertida" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "Formulário convertido para SureForms usando IA. Revise o novo formulário para quaisquer ajustes." + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "Formulário convertido para SureForms." + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "Você não tem permissão para converter este formulário." + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "Este formulário é muito grande para converter. Tente simplificar a marcação ou construir o formulário manualmente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "O SureForms não conseguiu derivar nenhum campo deste formulário." + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "O serviço SureForms AI não conseguiu processar este formulário. Por favor, tente novamente ou construa o formulário manualmente." + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "SureForms recebeu uma resposta inesperada. Por favor, tente novamente." + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "Não foi possível converter este formulário para SureForms. Por favor, tente novamente." + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "A converter…" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "Converter para SureForms" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "Capture os dados do formulário em andamento no momento em que os visitantes pararem de digitar — sem necessidade de envio" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "Recupere envios abandonados e faça o acompanhamento com potenciais clientes que você perderia de outra forma" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "Permita que os visitantes retomem de onde pararam com links de currículo seguros e compartilháveis" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "Pare de perder leads para formulários abandonados" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "Veja o que os visitantes digitaram antes de saírem. Faça upgrade para o SureForms Premium para desbloquear Entradas Parciais:" + +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "Configurações Globais" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "Restrições de Formulário" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "Configurar as configurações padrão que se aplicam a formulários recém-criados." + +#: assets/build/settings.js:172 +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " +msgstr "Recolha informações não sensíveis do seu site, como a versão do PHP e as funcionalidades utilizadas, para nos ajudar a corrigir erros mais rapidamente, tomar decisões mais inteligentes e desenvolver funcionalidades que realmente importam para você. " + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." +msgstr "Falha ao carregar as páginas. Por favor, atualize e tente novamente." + +#: assets/build/settings.js:172 +msgid "Failed to load settings. Please refresh and try again." +msgstr "Falha ao carregar as configurações. Por favor, atualize e tente novamente." + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "Os campos de validação de formulário não podem ficar em branco." + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "O e-mail do destinatário é necessário quando os resumos por e-mail estão ativados." + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "Por favor, insira um email de destinatário válido." + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "Configurações salvas." + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "Falha ao salvar as configurações." + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "Algumas configurações não foram salvas. Por favor, tente novamente." + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." +msgstr "Alguns campos têm alterações não salvas. Descarte-as para continuar ou permaneça para salvar suas edições." + +#: assets/build/settings.js:172 +msgid "Discard & switch" +msgstr "Descartar e mudar" + +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "Formulários" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "Formulário" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "Formulários" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "Adicionar Novo" @@ -18203,6 +18625,7 @@ msgstr "conta" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "Normal" diff --git a/languages/sureforms.pot b/languages/sureforms.pot index 7aa3b1b9a..d071209e9 100644 --- a/languages/sureforms.pot +++ b/languages/sureforms.pot @@ -2,24 +2,24 @@ # This file is distributed under the GPLv2 or later. msgid "" msgstr "" -"Project-Id-Version: SureForms 2.8.2\n" +"Project-Id-Version: SureForms 2.10.1\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/sureforms\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-05-04T11:21:29+00:00\n" +"POT-Creation-Date: 2026-06-01T10:21:28+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.12.0\n" +"X-Generator: WP-CLI 2.11.0\n" "X-Domain: sureforms\n" #. Plugin Name of the plugin #. Author of the plugin #: sureforms.php -#: admin/admin.php:320 -#: admin/admin.php:321 -#: admin/admin.php:1813 +#: admin/admin.php:318 +#: admin/admin.php:319 +#: admin/admin.php:1875 #: inc/abilities/abilities-registrar.php:133 #: inc/gutenberg-hooks.php:109 #: inc/page-builders/bricks/elements/form-widget.php:67 @@ -46,17 +46,18 @@ msgstr "" msgid "https://sureforms.com/" msgstr "" -#: admin/admin.php:243 +#: admin/admin.php:241 msgid "Get SureForms Pro" msgstr "" -#: admin/admin.php:333 -#: admin/admin.php:334 +#: admin/admin.php:331 +#: admin/admin.php:332 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -65,15 +66,16 @@ msgstr "" msgid "Dashboard" msgstr "" -#: admin/admin.php:351 -#: admin/admin.php:352 -#: admin/admin.php:756 +#: admin/admin.php:349 +#: admin/admin.php:350 +#: admin/admin.php:782 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -81,9 +83,9 @@ msgstr "" msgid "Settings" msgstr "" -#: admin/admin.php:409 -#: admin/admin.php:410 -#: admin/admin.php:2022 +#: admin/admin.php:402 +#: admin/admin.php:403 +#: admin/admin.php:2079 #: assets/build/blocks.js:172 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 @@ -91,39 +93,47 @@ msgstr "" msgid "Upgrade" msgstr "" -#: admin/admin.php:425 +#: admin/admin.php:418 msgid "Quiz Entries" msgstr "" -#: admin/admin.php:426 -#: admin/admin.php:975 +#: admin/admin.php:419 +#: admin/admin.php:1010 #: assets/build/formEditor.js:172 msgid "Quizzes" msgstr "" -#: admin/admin.php:428 -#: admin/admin.php:461 +#: admin/admin.php:421 +#: admin/admin.php:454 +#: admin/admin.php:487 msgid "New" msgstr "" -#: admin/admin.php:458 -#: admin/admin.php:459 -#: admin/admin.php:980 +#: admin/admin.php:451 +#: admin/admin.php:452 +#: admin/admin.php:1015 msgid "Survey Reports" msgstr "" -#: admin/admin.php:491 -#: admin/admin.php:492 +#: admin/admin.php:484 +#: admin/admin.php:485 +#: admin/admin.php:1020 +msgid "Partial Entries" +msgstr "" + +#: admin/admin.php:517 +#: admin/admin.php:518 msgid "SMTP" msgstr "" -#: admin/admin.php:554 -#: admin/admin.php:555 +#: admin/admin.php:580 +#: admin/admin.php:581 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -131,14 +141,15 @@ msgstr "" msgid "Learn" msgstr "" -#: admin/admin.php:583 -#: admin/admin.php:584 -#: inc/post-types.php:214 +#: admin/admin.php:609 +#: admin/admin.php:610 +#: inc/post-types.php:235 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -146,21 +157,22 @@ msgstr "" msgid "Forms" msgstr "" -#: admin/admin.php:592 -#: admin/admin.php:593 -#: inc/post-types.php:210 +#: admin/admin.php:618 +#: admin/admin.php:619 +#: inc/post-types.php:231 msgid "New Form" msgstr "" -#: admin/admin.php:601 -#: admin/admin.php:602 -#: admin/admin.php:1850 +#: admin/admin.php:627 +#: admin/admin.php:628 +#: admin/admin.php:1912 #: inc/global-settings/email-summary.php:225 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -168,13 +180,14 @@ msgstr "" msgid "Entries" msgstr "" -#: admin/admin.php:611 -#: admin/admin.php:612 +#: admin/admin.php:637 +#: admin/admin.php:638 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -184,22 +197,22 @@ msgid "Payments" msgstr "" #. Translators: Post Title. -#: admin/admin.php:843 -#, php-format +#: admin/admin.php:869 msgid "Edit %1$s" msgstr "" -#: admin/admin.php:915 +#: admin/admin.php:941 msgid "Activating..." msgstr "" -#: admin/admin.php:916 +#: admin/admin.php:942 #: assets/build/dashboard.js:172 #: assets/build/entries.js:172 #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -208,175 +221,171 @@ msgstr "" msgid "Activated" msgstr "" -#: admin/admin.php:917 +#: admin/admin.php:943 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Activate" msgstr "" -#: admin/admin.php:918 +#: admin/admin.php:944 msgid "Installing..." msgstr "" -#: admin/admin.php:919 +#: admin/admin.php:945 msgid "Installed" msgstr "" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version. -#: admin/admin.php:1377 -#, php-format +#: admin/admin.php:1439 msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version." msgstr "" -#: admin/admin.php:1390 +#: admin/admin.php:1452 msgid "Update Now" msgstr "" #. translators: %1$s: Opening anchor tag with URL, %2$s: Closing anchor tag, %3$s: SureForms Pro Plugin Name. -#: admin/admin.php:1442 -#, php-format +#: admin/admin.php:1504 msgid "Please %1$sactivate%2$s your copy of %3$s to get new features, access support, receive update notifications, and more." msgstr "" #. translators: %1$s: SureForms version, %2$s: SureForms Pro Plugin Name, %3$s: SureForms Pro Version, %4$s: Anchor tag open, %5$s: Closing anchor tag. -#: admin/admin.php:1460 -#, php-format +#: admin/admin.php:1522 msgid "SureForms %1$s requires minimum %2$s %3$s to work properly. Please update to the latest version from %4$shere%5$s." msgstr "" -#: admin/admin.php:1503 +#: admin/admin.php:1565 msgid "Amazing! SureForms is powering your forms and submissions - let's keep growing together!" msgstr "" -#: admin/admin.php:1504 +#: admin/admin.php:1566 msgid "If SureForms has been helpful, would you mind taking a moment to leave a 5-star review on WordPress.org?" msgstr "" -#: admin/admin.php:1506 +#: admin/admin.php:1568 msgid "Rate SureForms" msgstr "" -#: admin/admin.php:1507 -#: admin/admin.php:1551 +#: admin/admin.php:1569 +#: admin/admin.php:1613 msgid "Maybe later" msgstr "" -#: admin/admin.php:1508 +#: admin/admin.php:1570 msgid "I already did" msgstr "" -#: admin/admin.php:1547 +#: admin/admin.php:1609 msgid "SureForms is ready to power your forms — explore what's possible!" msgstr "" -#: admin/admin.php:1548 +#: admin/admin.php:1610 msgid "Manage your forms, track submissions, and discover features like AI Form Builder, payment integrations, and more from the SureForms dashboard." msgstr "" -#: admin/admin.php:1550 +#: admin/admin.php:1612 msgid "Go to Dashboard" msgstr "" -#: admin/admin.php:1552 +#: admin/admin.php:1614 msgid "I already know" msgstr "" -#: admin/admin.php:1608 -#: admin/admin.php:1707 -#: admin/admin.php:1745 -#: admin/admin.php:1766 +#: admin/admin.php:1670 +#: admin/admin.php:1769 +#: admin/admin.php:1807 +#: admin/admin.php:1828 #: inc/admin-ajax.php:162 #: inc/payments/admin/admin-handler.php:638 #: inc/payments/stripe/admin-stripe-handler.php:80 -#: inc/payments/stripe/admin-stripe-handler.php:466 +#: inc/payments/stripe/admin-stripe-handler.php:467 msgid "Invalid nonce." msgstr "" -#: admin/admin.php:1612 -#: admin/admin.php:1703 -#: admin/admin.php:1741 -#: admin/admin.php:1762 +#: admin/admin.php:1674 +#: admin/admin.php:1765 +#: admin/admin.php:1803 +#: admin/admin.php:1824 msgid "Unauthorized user." msgstr "" -#: admin/admin.php:1632 +#: admin/admin.php:1694 msgid "Invalid parameters." msgstr "" #. translators: 1: opening span, 2: opening strong (inline), 3: closing strong, 4: closing span, 5: opening strong (block), 6: closing strong -#: admin/admin.php:1712 -#, php-format +#: admin/admin.php:1774 msgid "%1$sGet started by %2$sbuilding your first form%3$s.%4$s%5$sExperience the power of our intuitive AI Form Builder%6$s" msgstr "" -#: admin/admin.php:1723 +#: admin/admin.php:1785 msgid "SureForms is waiting for you!" msgstr "" -#: admin/admin.php:1725 +#: admin/admin.php:1787 msgid "Build My First Form" msgstr "" -#: admin/admin.php:1726 +#: admin/admin.php:1788 msgid "Dismiss" msgstr "" -#: admin/admin.php:1837 +#: admin/admin.php:1899 msgid "Recent Entries" msgstr "" -#: admin/admin.php:1838 +#: admin/admin.php:1900 msgid "( Last 7 days )" msgstr "" -#: admin/admin.php:1841 +#: admin/admin.php:1903 msgid "View" msgstr "" -#: admin/admin.php:1849 +#: admin/admin.php:1911 #: inc/global-settings/email-summary.php:224 #: assets/build/entries.js:172 #: assets/build/payments.js:172 msgid "Form Name" msgstr "" -#: admin/admin.php:1958 +#: admin/admin.php:2020 msgid "Use Conditional Logic to show only what matters" msgstr "" -#: admin/admin.php:1959 +#: admin/admin.php:2021 msgid "Split your form into steps to keep it easy" msgstr "" -#: admin/admin.php:1960 +#: admin/admin.php:2022 msgid "Let people upload files directly to your form" msgstr "" -#: admin/admin.php:1961 +#: admin/admin.php:2023 msgid "Turn responses into downloadable PDFs automatically" msgstr "" -#: admin/admin.php:1962 +#: admin/admin.php:2024 msgid "Let users sign with a simple signature field" msgstr "" -#: admin/admin.php:1963 +#: admin/admin.php:2025 msgid "Connect your form to other tools using webhooks" msgstr "" -#: admin/admin.php:1964 +#: admin/admin.php:2026 msgid "Use Conversational Forms for a chat-like experience" msgstr "" -#: admin/admin.php:1965 +#: admin/admin.php:2027 msgid "Let users register or log in through your form" msgstr "" -#: admin/admin.php:1966 +#: admin/admin.php:2028 msgid "Build forms that create WordPress user accounts" msgstr "" -#: admin/admin.php:1967 +#: admin/admin.php:2029 msgid "Add calculations to auto-total scores or prices" msgstr "" @@ -440,14 +449,13 @@ msgstr "" #: inc/abilities/entries/bulk-get-entries.php:155 #: inc/abilities/entries/delete-entry.php:123 #: inc/abilities/entries/update-entry-status.php:130 -#, php-format msgid "Maximum %d entry IDs allowed per request." msgstr "" #: inc/abilities/entries/bulk-get-entries.php:172 #: inc/abilities/entries/get-entry.php:121 #: inc/rest-api.php:767 -#: inc/rest-api.php:907 +#: inc/rest-api.php:910 msgid "Entry not found." msgstr "" @@ -471,7 +479,6 @@ msgstr "" #. Translators: %d is the form ID. #: inc/abilities/entries/entry-parser.php:72 #: inc/rest-api.php:838 -#, php-format msgid "SureForms Form #%d" msgstr "" @@ -692,7 +699,7 @@ msgstr "" msgid "Failed to generate form fields from the provided data." msgstr "" -#: inc/abilities/forms/create-form.php:376 +#: inc/abilities/forms/create-form.php:383 msgid "Failed to create the form." msgstr "" @@ -776,6 +783,10 @@ msgstr "" msgid "Maximum character length." msgstr "" +#: inc/abilities/forms/form-field-schema.php:108 +msgid "Placeholder text shown inside the empty input/textarea or as the empty first option in a dropdown." +msgstr "" + #: inc/abilities/forms/get-form-stats.php:34 msgid "Get Form Statistics" msgstr "" @@ -878,8 +889,8 @@ msgstr "" #: inc/abilities/settings/get-global-settings.php:192 #: inc/global-settings/email-summary.php:571 -#: inc/global-settings/global-settings.php:251 -#: inc/global-settings/global-settings.php:457 +#: inc/global-settings/global-settings.php:262 +#: inc/global-settings/global-settings.php:689 #: assets/build/settings.js:172 msgid "Monday" msgstr "" @@ -937,13 +948,12 @@ msgid "OttoKit is not configured properly." msgstr "" #: inc/admin-ajax.php:182 -#: inc/form-submit.php:972 +#: inc/form-submit.php:1007 msgid "Invalid form ID." msgstr "" #. Translators: %s: Form ID. #: inc/admin-ajax.php:186 -#, php-format msgid "SureForms id: %s" msgstr "" @@ -1017,47 +1027,110 @@ msgstr "" msgid "File not found." msgstr "" -#: inc/admin/editor-nudge.php:191 +#: inc/admin/editor-nudge.php:212 msgid "Hey! It looks like you're creating a form. Build a ready-to-use form in under 30 seconds with SureForms AI, with no extra setup required." msgstr "" -#: inc/admin/editor-nudge.php:192 +#: inc/admin/editor-nudge.php:213 #: assets/build/forms.js:172 msgid "Create Form" msgstr "" -#: inc/admin/editor-nudge.php:209 +#: inc/admin/editor-nudge.php:230 #: inc/payments/stripe/admin-stripe-handler.php:84 -#: inc/payments/stripe/admin-stripe-handler.php:470 +#: inc/payments/stripe/admin-stripe-handler.php:471 msgid "You are not allowed to perform this action." msgstr "" -#: inc/admin/editor-nudge.php:216 -#: inc/helper.php:2029 -#: inc/helper.php:2037 +#: inc/admin/editor-nudge.php:237 +#: inc/helper.php:2060 +#: inc/helper.php:2068 msgid "Invalid security token." msgstr "" -#: inc/admin/editor-nudge.php:228 -#: inc/admin/editor-nudge.php:237 +#: inc/admin/editor-nudge.php:249 +#: inc/admin/editor-nudge.php:258 msgid "Invalid post." msgstr "" -#: inc/admin/editor-nudge.php:246 +#: inc/admin/editor-nudge.php:267 msgid "You cannot edit this post." msgstr "" +#: inc/admin/html-form-detector.php:187 +msgid "Array of fields produced by the editor-side parser." +msgstr "" + +#: inc/admin/html-form-detector.php:204 +msgid "Raw HTML of the source . Required when parser confidence is low so we can hand the markup to the AI middleware." +msgstr "" + +#: inc/admin/html-form-detector.php:215 +msgid "Best-effort styling descriptor (hex colors) extracted from inline styles on the source ." +msgstr "" + +#: inc/admin/html-form-detector.php:252 +msgid "You are not allowed to convert HTML forms." +msgstr "" + +#: inc/admin/html-form-detector.php:268 +#: inc/form-submit.php:99 +#: inc/form-submit.php:400 +#: inc/form-submit.php:445 +#: inc/form-submit.php:1003 +#: inc/payments/front-end.php:78 +#: inc/payments/front-end.php:263 +#: inc/rest-api.php:98 +#: inc/rest-api.php:157 +#: inc/rest-api.php:323 +#: inc/rest-api.php:355 +#: inc/rest-api.php:377 +#: inc/rest-api.php:482 +#: inc/rest-api.php:573 +#: inc/rest-api.php:618 +#: inc/rest-api.php:667 +#: inc/rest-api.php:716 +#: inc/rest-api.php:749 +#: inc/rest-api.php:888 +#: inc/rest-api.php:961 +#: inc/rest-api.php:1021 +#: inc/single-form-settings/form-settings-api.php:88 +msgid "Security verification failed. Please refresh the page and try again." +msgstr "" + +#: inc/admin/html-form-detector.php:283 +#: assets/build/htmlFormDetector.js:2 +msgid "Converted form" +msgstr "" + +#: inc/admin/html-form-detector.php:293 +msgid "The HTML form is too large to convert. Please simplify the markup or build the form manually." +msgstr "" + +#: inc/admin/html-form-detector.php:309 +msgid "No fields could be derived from the supplied form." +msgstr "" + +#: inc/admin/html-form-detector.php:710 +msgid "The SureForms AI service could not process this form. Try again or build the form manually." +msgstr "" + +#: inc/admin/html-form-detector.php:723 +#: inc/admin/html-form-detector.php:736 +msgid "The SureForms AI service returned an unusable response. Try again or build the form manually." +msgstr "" + #: inc/ai-form-builder/ai-auth.php:45 #: inc/ai-form-builder/ai-auth.php:93 #: inc/ai-form-builder/ai-auth.php:167 #: inc/background-process.php:112 #: inc/create-new-form.php:102 -#: inc/duplicate-form.php:176 +#: inc/duplicate-form.php:183 #: inc/export.php:118 #: inc/export.php:176 #: inc/forms-data.php:88 -#: inc/global-settings/global-settings.php:86 -#: inc/global-settings/global-settings.php:404 +#: inc/global-settings/global-settings.php:88 +#: inc/global-settings/global-settings.php:630 #: inc/rest-api.php:177 msgid "Nonce verification failed." msgstr "" @@ -1213,7 +1286,7 @@ msgstr "" #: inc/blocks/sform/block.php:42 #: inc/page-builders/bricks/elements/form-widget.php:508 #: inc/page-builders/elementor/form-widget.php:827 -#: inc/post-types.php:1297 +#: inc/post-types.php:1318 #: assets/build/blocks.js:172 msgid "This form has been deleted or is unavailable." msgstr "" @@ -1266,13 +1339,11 @@ msgstr "" #. translators: %d is the entry ID. #: inc/entries.php:175 -#, php-format msgid "Failed to update entry #%d." msgstr "" #. translators: %d is the entry ID. #: inc/entries.php:223 -#, php-format msgid "Failed to delete entry #%d." msgstr "" @@ -1333,18 +1404,17 @@ msgid "Forms imported successfully!" msgstr "" #: inc/export.php:284 -#: inc/export.php:318 +#: inc/export.php:324 msgid "Unable to import form." msgstr "" -#: inc/field-validation.php:276 +#: inc/field-validation.php:281 msgid "Field is not valid." msgstr "" #. translators: %s represents the minimum number of characters required -#: inc/field-validation.php:289 +#: inc/field-validation.php:294 #: inc/translatable.php:94 -#, php-format msgid "Please enter at least %s characters." msgstr "" @@ -1375,7 +1445,6 @@ msgstr "" #. Translators: %s is label of block. #: inc/fields/email-markup.php:93 -#, php-format msgid "Confirm %s" msgstr "" @@ -1406,7 +1475,7 @@ msgid "One-Time Payment" msgstr "" #: inc/fields/payment-markup.php:247 -#: inc/payments/admin/admin-handler.php:975 +#: inc/payments/admin/admin-handler.php:969 #: inc/payments/payment-history-shortcode.php:306 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 @@ -1438,43 +1507,36 @@ msgstr "" #. translators: 1: Amount with currency, 2: Interval (day/week/month/quarter/year) #: inc/fields/payment-markup.php:672 -#, php-format msgid "%1$s per %2$s (until cancelled)" msgstr "" #. translators: 1: Amount with currency, 2: Interval (day/week/month/quarter/year), 3: Number of billing cycles #: inc/fields/payment-markup.php:681 -#, php-format msgid "%1$s per %2$s (%3$s payments)" msgstr "" #. translators: 1: Amount with currency, 2: Interval (day/week/month/quarter/year) #: inc/fields/payment-markup.php:691 -#, php-format msgid "%1$s per %2$s" msgstr "" #. translators: 1: Amount with currency placeholder, 2: Interval (day/week/month/quarter/year) #: inc/fields/payment-markup.php:714 -#, php-format msgid "{amount} per %s (until cancelled)" msgstr "" #. translators: 1: Amount with currency placeholder, 2: Interval (day/week/month/quarter/year), 3: Number of billing cycles #: inc/fields/payment-markup.php:717 -#, php-format msgid "{amount} per %1$s (%2$s payments)" msgstr "" #. translators: 1: Amount with currency placeholder, 2: Interval (day/week/month/quarter/year) #: inc/fields/payment-markup.php:720 -#, php-format msgid "{amount} per %s" msgstr "" #. translators: %s: Minimum amount with currency #: inc/fields/payment-markup.php:740 -#, php-format msgid "Minimum amount: %s" msgstr "" @@ -1523,40 +1585,18 @@ msgstr "" #: inc/form-restriction.php:182 #: inc/form-restriction.php:183 -#: inc/post-types.php:1203 -#: inc/post-types.php:1243 +#: inc/post-types.php:1224 +#: inc/post-types.php:1264 msgid "This form is not yet available. Check back after the scheduled start time." msgstr "" #: inc/form-restriction.php:187 #: inc/form-restriction.php:188 +#: inc/global-settings/global-settings-defaults.php:268 #: assets/build/formEditor.js:172 msgid "This form is no longer accepting submissions. The submission period has ended." msgstr "" -#: inc/form-submit.php:99 -#: inc/form-submit.php:400 -#: inc/form-submit.php:445 -#: inc/form-submit.php:968 -#: inc/payments/front-end.php:78 -#: inc/payments/front-end.php:263 -#: inc/rest-api.php:98 -#: inc/rest-api.php:157 -#: inc/rest-api.php:323 -#: inc/rest-api.php:355 -#: inc/rest-api.php:377 -#: inc/rest-api.php:482 -#: inc/rest-api.php:573 -#: inc/rest-api.php:618 -#: inc/rest-api.php:667 -#: inc/rest-api.php:716 -#: inc/rest-api.php:749 -#: inc/rest-api.php:885 -#: inc/rest-api.php:958 -#: inc/rest-api.php:1018 -msgid "Security verification failed. Please refresh the page and try again." -msgstr "" - #: inc/form-submit.php:115 msgid "Sorry, you do not have permission to access this resource." msgstr "" @@ -1607,82 +1647,79 @@ msgstr "" msgid "Form data was not found." msgstr "" -#: inc/form-submit.php:651 +#: inc/form-submit.php:686 msgid "Unable to submit form. Please try again." msgstr "" -#: inc/form-submit.php:823 +#: inc/form-submit.php:858 msgid "Email notification passed to the sending server" msgstr "" #. translators: Here, %s is the comma separated emails list. -#: inc/form-submit.php:896 -#, php-format +#: inc/form-submit.php:931 msgid "Email notification recipient: %s" msgstr "" -#: inc/form-submit.php:903 +#: inc/form-submit.php:938 msgid "No SMTP plugin detected. Please configure an SMTP plugin to enable email sending." msgstr "" -#: inc/form-submit.php:904 +#: inc/form-submit.php:939 msgid "Email sending failed for an unknown reason." msgstr "" #. translators: Here, %1$s is the comma separated emails list and %2$s is error report ( if any ). -#: inc/form-submit.php:913 -#, php-format +#: inc/form-submit.php:948 msgid "Email server was unable to send the email notification. Recipient: %1$s. Reason: %2$s" msgstr "" -#: inc/form-submit.php:943 +#: inc/form-submit.php:978 msgid "No emails were sent." msgstr "" -#: inc/form-submit.php:977 +#: inc/form-submit.php:1012 msgid "Invalid form." msgstr "" -#: inc/form-submit.php:982 +#: inc/form-submit.php:1017 msgid "Too many requests. Please try again shortly." msgstr "" -#: inc/form-submit.php:1093 +#: inc/form-submit.php:1128 msgid "Captcha validation failed. No error code provided." msgstr "" -#: inc/form-submit.php:1094 +#: inc/form-submit.php:1129 msgid "Captcha validation failed." msgstr "" -#: inc/form-submit.php:1149 +#: inc/form-submit.php:1184 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "Google reCAPTCHA" msgstr "" -#: inc/form-submit.php:1153 +#: inc/form-submit.php:1188 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "hCaptcha" msgstr "" -#: inc/form-submit.php:1157 +#: inc/form-submit.php:1192 #: assets/build/settings.js:172 msgid "Cloudflare Turnstile" msgstr "" -#: inc/form-submit.php:1161 +#: inc/form-submit.php:1196 msgid "Unknown Captcha" msgstr "" -#: inc/form-submit.php:1162 +#: inc/form-submit.php:1197 msgid "Invalid captcha type." msgstr "" #. translators: %s is the captcha title. -#: inc/form-submit.php:1175 -#, php-format +#: inc/form-submit.php:1210 msgid "%s verification failed. Please contact your site administrator." msgstr "" @@ -1704,37 +1741,44 @@ msgstr "" #: inc/frontend-assets.php:280 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgctxt "Quill heading picker: default paragraph style" msgid "Normal" msgstr "" #: inc/frontend-assets.php:281 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 1" msgstr "" #: inc/frontend-assets.php:282 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 2" msgstr "" #: inc/frontend-assets.php:283 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 3" msgstr "" #: inc/frontend-assets.php:284 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 4" msgstr "" #: inc/frontend-assets.php:285 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 5" msgstr "" #: inc/frontend-assets.php:286 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Heading 6" msgstr "" @@ -1790,7 +1834,6 @@ msgstr "" #. translators: 1: site URL, 2: site name #: inc/global-settings/email-summary.php:208 -#, php-format msgid "Here's your SureForms report for the last 7 days of %s." msgstr "" @@ -1804,7 +1847,6 @@ msgstr "" #. translators: %s: opening and closing anchor tag for SureForms settings link #: inc/global-settings/email-summary.php:295 -#, php-format msgid "Manage Email Summaries from your %1$sSureForms settings%2$s" msgstr "" @@ -1870,23 +1912,59 @@ msgstr "" #. Translators: %1$s: From Date, %2$s: To Date. #: inc/global-settings/email-summary.php:546 -#, php-format msgid "Email Summary of your last week - %1$s to %2$s" msgstr "" -#: inc/global-settings/global-settings.php:122 -msgid "Error Saving Settings!" +#: inc/global-settings/global-settings-defaults.php:166 +#: inc/post-types.php:998 +msgid "Admin Notification Email" +msgstr "" + +#. translators: %s: Form title smart tag +#. translators: %s: {form_title} smart tag placeholder. +#: inc/global-settings/global-settings-defaults.php:173 +#: inc/global-settings/global-settings.php:586 +#: inc/post-types.php:1005 +#: assets/build/settings.js:172 +msgid "New Form Submission - %s" +msgstr "" + +#: inc/global-settings/global-settings-defaults.php:260 +#: inc/global-settings/global-settings.php:425 +#: inc/global-settings/global-settings.php:613 +#: assets/build/settings.js:172 +msgid "This form is now closed as we've received all the entries." msgstr "" -#: inc/global-settings/global-settings.php:122 +#: inc/global-settings/global-settings-defaults.php:267 #: assets/build/formEditor.js:172 -msgid "Global Settings" +msgid "This form is not yet available. Please check back after the scheduled start time." +msgstr "" + +#: inc/global-settings/global-settings.php:129 +msgid "Invalid settings tab." msgstr "" -#: inc/global-settings/global-settings.php:126 +#: inc/global-settings/global-settings.php:137 msgid "Settings Saved Successfully." msgstr "" +#: inc/global-settings/global-settings.php:481 +#: assets/build/settings.js:172 +msgid "Thank you for contacting us! We will be in touch with you shortly." +msgstr "" + +#: inc/global-settings/global-settings.php:528 +#: inc/post-types.php:1081 +#: assets/build/formEditor.js:172 +msgid "Thank you" +msgstr "" + +#: inc/global-settings/global-settings.php:529 +#: inc/post-types.php:1081 +msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." +msgstr "" + #: inc/gutenberg-hooks.php:107 msgid "General Fields" msgstr "" @@ -1901,7 +1979,6 @@ msgid "I consent to have this website store my submitted information so they can msgstr "" #: inc/helper.php:70 -#: assets/build/formEditor.js:172 msgid "This field is required." msgstr "" @@ -1915,97 +1992,96 @@ msgstr "" #. translators: %s: Provider name like HCaptcha, Google reCAPTCHA, Turnstile #: inc/helper.php:1138 -#, php-format msgid "%s sitekey is missing. Please contact your site administrator." msgstr "" -#: inc/helper.php:1779 +#: inc/helper.php:1810 msgid "SureContact" msgstr "" -#: inc/helper.php:1780 +#: inc/helper.php:1811 msgid "Turn Emails Into Revenue with a CRM Built for Your Website!" msgstr "" -#: inc/helper.php:1781 +#: inc/helper.php:1812 msgid "Send newsletters, run campaigns, set up automations, manage contacts, and see exactly how much revenue your emails generate, all in one place." msgstr "" -#: inc/helper.php:1788 +#: inc/helper.php:1819 msgid "SureMail" msgstr "" -#: inc/helper.php:1789 +#: inc/helper.php:1820 msgid "Boost Your Email Deliverability Instantly!" msgstr "" -#: inc/helper.php:1790 +#: inc/helper.php:1821 msgid "Access a powerful, easy-to-use email delivery service that ensures your emails land in inboxes, not spam folders. Automate your WordPress email workflows confidently with SureMail." msgstr "" -#: inc/helper.php:1797 +#: inc/helper.php:1828 #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 msgid "OttoKit" msgstr "" -#: inc/helper.php:1798 +#: inc/helper.php:1829 msgid "Automate your WordPress workflows effortlessly." msgstr "" -#: inc/helper.php:1799 +#: inc/helper.php:1830 msgid "Connect your WordPress plugins and favourite apps, automate tasks, and sync data effortlessly using OttoKit’s clean, visual workflow builder — no coding or complex setup required." msgstr "" -#: inc/helper.php:1809 +#: inc/helper.php:1840 msgid "Starter Templates" msgstr "" -#: inc/helper.php:1810 +#: inc/helper.php:1841 msgid "Launch Beautiful Websites in Minutes!" msgstr "" -#: inc/helper.php:1811 +#: inc/helper.php:1842 msgid "Choose from professionally designed templates, import with one click, and customize effortlessly to match your brand." msgstr "" -#: inc/helper.php:1823 +#: inc/helper.php:1854 msgid "Ultimate Addons for Elementor" msgstr "" -#: inc/helper.php:1824 +#: inc/helper.php:1855 msgid "Power Up Elementor to Build Stunning Websites Faster!" msgstr "" -#: inc/helper.php:1825 +#: inc/helper.php:1856 msgid "Enhance Elementor with powerful widgets and templates. Build stunning, high-performing websites faster with creative design elements and seamless customization." msgstr "" -#: inc/helper.php:1833 +#: inc/helper.php:1864 msgid "SureRank" msgstr "" -#: inc/helper.php:1834 +#: inc/helper.php:1865 msgid "Elevate Your SEO and Climb Search Rankings Effortlessly!" msgstr "" -#: inc/helper.php:1835 +#: inc/helper.php:1866 msgid "Boost your website's visibility with smart SEO automation. Optimize content, track keyword performance, and get actionable insights, all inside WordPress." msgstr "" -#: inc/helper.php:2019 +#: inc/helper.php:2050 msgid "Invalid nonce action or name." msgstr "" -#: inc/helper.php:2044 +#: inc/helper.php:2075 msgid "Invalid request type." msgstr "" -#: inc/helper.php:2052 +#: inc/helper.php:2083 msgid "You do not have permission to perform this action." msgstr "" -#: inc/helper.php:2177 +#: inc/helper.php:2208 msgid "Blank Form" msgstr "" @@ -2584,7 +2660,7 @@ msgstr "" #: inc/page-builders/elementor/form-widget.php:332 #: inc/post-types.php:95 -#: inc/post-types.php:211 +#: inc/post-types.php:232 #: assets/build/blocks.js:172 msgid "Edit Form" msgstr "" @@ -2706,7 +2782,6 @@ msgstr "" #. translators: %d: Form ID #: inc/payments/admin/admin-handler.php:336 -#, php-format msgid "Form - #%d" msgstr "" @@ -2768,7 +2843,6 @@ msgstr "" #. translators: %d: number of payments deleted #: inc/payments/admin/admin-handler.php:577 -#, php-format msgid "%d payment deleted successfully." msgid_plural "%d payments deleted successfully." msgstr[0] "" @@ -2776,7 +2850,6 @@ msgstr[1] "" #. translators: 1: number deleted, 2: number failed #: inc/payments/admin/admin-handler.php:594 -#, php-format msgid "%1$d payment(s) deleted successfully. %2$d failed." msgstr "" @@ -2800,17 +2873,16 @@ msgstr "" #. translators: %s: payment gateway name #: inc/payments/admin/admin-handler.php:703 -#, php-format msgid "Refund processing is not supported for %s gateway." msgstr "" #: inc/payments/admin/admin-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:371 +#: inc/payments/stripe/admin-stripe-handler.php:372 msgid "Payment refunded successfully." msgstr "" #: inc/payments/admin/admin-handler.php:733 -#: inc/payments/stripe/admin-stripe-handler.php:381 +#: inc/payments/stripe/admin-stripe-handler.php:382 msgid "Failed to process refund. Please try again." msgstr "" @@ -2818,41 +2890,41 @@ msgstr "" msgid "Unable to process refund. Please try again." msgstr "" -#: inc/payments/admin/admin-handler.php:960 -#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:954 +#: inc/payments/admin/admin-handler.php:956 #: inc/payments/payment-history-shortcode.php:789 #: inc/payments/payment-history-shortcode.php:796 #: assets/build/payments.js:172 msgid "Unknown Form" msgstr "" -#: inc/payments/admin/admin-handler.php:968 -#: inc/payments/admin/admin-handler.php:969 +#: inc/payments/admin/admin-handler.php:962 +#: inc/payments/admin/admin-handler.php:963 #: assets/build/payments.js:172 msgid "N/A" msgstr "" -#: inc/payments/admin/admin-handler.php:977 +#: inc/payments/admin/admin-handler.php:971 msgid "Renewal" msgstr "" -#: inc/payments/admin/admin-handler.php:979 +#: inc/payments/admin/admin-handler.php:973 #: assets/build/blocks.js:172 #: assets/build/payments.js:172 msgid "One Time" msgstr "" -#: inc/payments/admin/admin-handler.php:1152 +#: inc/payments/admin/admin-handler.php:1185 msgid "Unknown" msgstr "" #. translators: Message for guest user in payment logs #. translators: %d: User ID -#: inc/payments/admin/admin-handler.php:1444 -#: inc/payments/admin/admin-handler.php:1451 -#: inc/payments/admin/admin-handler.php:1468 -#: inc/payments/admin/admin-handler.php:1472 -#: inc/payments/admin/admin-handler.php:1476 +#: inc/payments/admin/admin-handler.php:1477 +#: inc/payments/admin/admin-handler.php:1484 +#: inc/payments/admin/admin-handler.php:1501 +#: inc/payments/admin/admin-handler.php:1505 +#: inc/payments/admin/admin-handler.php:1509 #: inc/payments/front-end.php:854 #: inc/payments/front-end.php:1253 msgid "Guest User" @@ -2874,7 +2946,7 @@ msgstr "" #: inc/payments/front-end.php:115 #: inc/payments/front-end.php:340 -#: inc/payments/stripe/admin-stripe-handler.php:877 +#: inc/payments/stripe/admin-stripe-handler.php:880 #: inc/payments/stripe/payments-settings.php:349 #: inc/payments/stripe/payments-settings.php:474 #: inc/payments/stripe/payments-settings.php:613 @@ -2892,13 +2964,11 @@ msgstr "" #. translators: %s: formatted payment amount #: inc/payments/front-end.php:203 -#, php-format msgid "The payment amount (%s) is below the minimum allowed. Stripe only processes amounts above 50¢." msgstr "" #. translators: %s: Field name #: inc/payments/front-end.php:273 -#, php-format msgid "Missing required field: %s" msgstr "" @@ -2950,14 +3020,13 @@ msgstr "" #. translators: %s: Error message #: inc/payments/front-end.php:464 -#, php-format msgid "Unexpected error: %s" msgstr "" #: inc/payments/front-end.php:604 #: inc/payments/stripe/admin-stripe-handler.php:103 #: inc/payments/stripe/admin-stripe-handler.php:184 -#: inc/payments/stripe/admin-stripe-handler.php:489 +#: inc/payments/stripe/admin-stripe-handler.php:490 msgid "Subscription ID not found." msgstr "" @@ -3000,13 +3069,11 @@ msgstr "" #. translators: %d: User ID #: inc/payments/front-end.php:852 #: inc/payments/front-end.php:1253 -#, php-format msgid "User ID: %d" msgstr "" #. translators: %s: Invoice status #: inc/payments/front-end.php:860 -#, php-format msgid "Invoice Status: %s" msgstr "" @@ -3020,10 +3087,9 @@ msgstr "" #: inc/payments/front-end.php:871 #: inc/payments/stripe/admin-stripe-handler.php:119 #: inc/payments/stripe/admin-stripe-handler.php:204 -#: inc/payments/stripe/admin-stripe-handler.php:505 +#: inc/payments/stripe/admin-stripe-handler.php:506 #: inc/payments/stripe/stripe-webhook.php:572 -#: inc/payments/stripe/stripe-webhook.php:1118 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1120 msgid "Subscription ID: %s" msgstr "" @@ -3037,27 +3103,24 @@ msgstr "" #: inc/payments/front-end.php:1264 #: inc/payments/stripe/admin-stripe-handler.php:124 #: inc/payments/stripe/admin-stripe-handler.php:209 -#: inc/payments/stripe/admin-stripe-handler.php:510 -#: inc/payments/stripe/admin-stripe-handler.php:685 -#: inc/payments/stripe/admin-stripe-handler.php:1207 +#: inc/payments/stripe/admin-stripe-handler.php:511 +#: inc/payments/stripe/admin-stripe-handler.php:686 +#: inc/payments/stripe/admin-stripe-handler.php:1210 #: inc/payments/stripe/stripe-webhook.php:574 -#: inc/payments/stripe/stripe-webhook.php:714 -#: inc/payments/stripe/stripe-webhook.php:878 -#: inc/payments/stripe/stripe-webhook.php:1112 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:716 +#: inc/payments/stripe/stripe-webhook.php:880 +#: inc/payments/stripe/stripe-webhook.php:1114 msgid "Payment Gateway: %s" msgstr "" #. translators: %s: Payment Intent ID #: inc/payments/front-end.php:875 -#, php-format msgid "Payment Intent ID: %s" msgstr "" #. translators: %s: Charge ID #: inc/payments/front-end.php:877 -#: inc/payments/stripe/stripe-webhook.php:1048 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1050 msgid "Charge ID: %s" msgstr "" @@ -3066,15 +3129,13 @@ msgstr "" #: inc/payments/front-end.php:879 #: inc/payments/stripe/admin-stripe-handler.php:129 #: inc/payments/stripe/admin-stripe-handler.php:214 -#: inc/payments/stripe/admin-stripe-handler.php:515 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:516 msgid "Subscription Status: %s" msgstr "" #. translators: %s: Customer ID #: inc/payments/front-end.php:881 -#: inc/payments/stripe/stripe-webhook.php:1122 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1124 msgid "Customer ID: %s" msgstr "" @@ -3082,9 +3143,8 @@ msgstr "" #. translators: %1$s: amount, %2$s: currency. #: inc/payments/front-end.php:883 #: inc/payments/front-end.php:1266 -#: inc/payments/stripe/stripe-webhook.php:1053 -#: inc/payments/stripe/stripe-webhook.php:1114 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1055 +#: inc/payments/stripe/stripe-webhook.php:1116 msgid "Amount: %1$s %2$s" msgstr "" @@ -3092,7 +3152,6 @@ msgstr "" #. translators: %s: payment mode #: inc/payments/front-end.php:886 #: inc/payments/front-end.php:1271 -#, php-format msgid "Mode: %s" msgstr "" @@ -3118,8 +3177,7 @@ msgstr "" #. translators: %s: Stripe transaction ID #. translators: %s: Charge ID #: inc/payments/front-end.php:1262 -#: inc/payments/stripe/stripe-webhook.php:1110 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1112 msgid "Transaction ID: %s" msgstr "" @@ -3127,8 +3185,7 @@ msgstr "" #. translators: %s: Status #: inc/payments/front-end.php:1268 #: inc/payments/stripe/stripe-webhook.php:576 -#: inc/payments/stripe/stripe-webhook.php:1116 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Status: %s" msgstr "" @@ -3532,7 +3589,6 @@ msgstr "" #. translators: 1: expected currency, 2: received currency #: inc/payments/payment-helper.php:614 -#, php-format msgid "Currency mismatch: expected %1$s, received %2$s." msgstr "" @@ -3542,13 +3598,11 @@ msgstr "" #. translators: 1: expected amount with currency #: inc/payments/payment-helper.php:649 -#, php-format msgid "Payment amount must be exactly %1$s." msgstr "" #. translators: 1: minimum amount with currency #: inc/payments/payment-helper.php:660 -#, php-format msgid "Payment amount must be at least %1$s." msgstr "" @@ -3588,7 +3642,6 @@ msgstr "" #: inc/payments/payment-helper.php:1055 #: inc/payments/payment-helper.php:1091 #: inc/payments/payment-helper.php:1111 -#, php-format msgid "Payment amount mismatch. Expected %1$s, received %2$s." msgstr "" @@ -3604,7 +3657,6 @@ msgstr "" #. translators: %1$s: minimum amount, %2$s: payment amount #: inc/payments/payment-helper.php:1125 -#, php-format msgid "Payment amount below minimum. Minimum: %1$s, received %2$s." msgstr "" @@ -3621,7 +3673,7 @@ msgid "Cancellation not supported for this gateway." msgstr "" #: inc/payments/payment-history-shortcode.php:283 -#: inc/payments/stripe/admin-stripe-handler.php:242 +#: inc/payments/stripe/admin-stripe-handler.php:243 msgid "Subscription cancelled successfully." msgstr "" @@ -3631,7 +3683,6 @@ msgstr "" #. translators: %s: subscription name #: inc/payments/payment-history-shortcode.php:298 -#, php-format msgid "Your \"%s\" will be cancelled immediately. You will lose access right away." msgstr "" @@ -3757,7 +3808,7 @@ msgstr "" #: inc/payments/payment-history-shortcode.php:330 #: inc/payments/payment-history-shortcode.php:890 -#: inc/payments/stripe/admin-stripe-handler.php:516 +#: inc/payments/stripe/admin-stripe-handler.php:517 #: assets/build/payments.js:2 msgid "Paused" msgstr "" @@ -3799,7 +3850,6 @@ msgstr "" #. translators: %d: number of active subscriptions #: inc/payments/payment-history-shortcode.php:409 -#, php-format msgid "%d active" msgid_plural "%d active" msgstr[0] "" @@ -3807,7 +3857,6 @@ msgstr[1] "" #. translators: %d: number of cancelled subscriptions #: inc/payments/payment-history-shortcode.php:413 -#, php-format msgid "%d cancelled" msgid_plural "%d cancelled" msgstr[0] "" @@ -3819,13 +3868,11 @@ msgstr "" #. translators: %s: next payment date #: inc/payments/payment-history-shortcode.php:455 -#, php-format msgid "Next: %s" msgstr "" #. translators: %s: cancellation date #: inc/payments/payment-history-shortcode.php:458 -#, php-format msgid "Cancelled %s" msgstr "" @@ -3835,7 +3882,6 @@ msgstr "" #. translators: %d: total number of transactions #: inc/payments/payment-history-shortcode.php:503 -#, php-format msgid "%d transaction" msgid_plural "%d transactions" msgstr[0] "" @@ -3843,7 +3889,6 @@ msgstr[1] "" #. translators: 1: start number, 2: end number, 3: total number #: inc/payments/payment-history-shortcode.php:519 -#, php-format msgid "Showing %1$d–%2$d of %3$d transactions" msgstr "" @@ -3900,17 +3945,17 @@ msgid "No payments found." msgstr "" #: inc/payments/stripe/admin-stripe-handler.php:70 -#: inc/payments/stripe/admin-stripe-handler.php:456 +#: inc/payments/stripe/admin-stripe-handler.php:457 msgid "Missing payment ID." msgstr "" #: inc/payments/stripe/admin-stripe-handler.php:94 -#: inc/payments/stripe/admin-stripe-handler.php:478 +#: inc/payments/stripe/admin-stripe-handler.php:479 msgid "Payment not found in the database." msgstr "" #: inc/payments/stripe/admin-stripe-handler.php:99 -#: inc/payments/stripe/admin-stripe-handler.php:485 +#: inc/payments/stripe/admin-stripe-handler.php:486 msgid "This is not a subscription payment." msgstr "" @@ -3929,8 +3974,7 @@ msgstr "" #. translators: %s: Canceled by method (e.g., Webhook). #: inc/payments/stripe/admin-stripe-handler.php:134 #: inc/payments/stripe/admin-stripe-handler.php:219 -#: inc/payments/stripe/stripe-webhook.php:894 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:896 msgid "Canceled by: %s" msgstr "" @@ -3945,7 +3989,7 @@ msgid "Subscription Canceled" msgstr "" #: inc/payments/stripe/admin-stripe-handler.php:158 -#: inc/payments/stripe/admin-stripe-handler.php:543 +#: inc/payments/stripe/admin-stripe-handler.php:544 msgid "Failed to update subscription status in database." msgstr "" @@ -3953,101 +3997,96 @@ msgstr "" msgid "Subscription canceled successfully!" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:283 +#: inc/payments/stripe/admin-stripe-handler.php:284 msgid "Invalid refund parameters." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:300 +#: inc/payments/stripe/admin-stripe-handler.php:301 msgid "Only succeeded or partially refunded payments can be refunded." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:309 +#: inc/payments/stripe/admin-stripe-handler.php:310 msgid "Transaction ID mismatch." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:341 +#: inc/payments/stripe/admin-stripe-handler.php:342 msgid "Invalid transaction ID format for refund." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:349 +#: inc/payments/stripe/admin-stripe-handler.php:350 msgid "Failed to process refund through Stripe API." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:364 +#: inc/payments/stripe/admin-stripe-handler.php:365 msgid "Failed to update payment record after refund." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:495 +#: inc/payments/stripe/admin-stripe-handler.php:496 msgid "Subscription pause failed." msgstr "" #. translators: %s: user display name -#: inc/payments/stripe/admin-stripe-handler.php:520 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:521 msgid "Paused by: %s" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:523 +#: inc/payments/stripe/admin-stripe-handler.php:524 msgid "Note: The subscription billing has been paused. No charges will occur until the subscription is resumed." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:528 +#: inc/payments/stripe/admin-stripe-handler.php:529 msgid "Subscription Paused" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:546 +#: inc/payments/stripe/admin-stripe-handler.php:547 msgid "Subscription paused successfully!" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Full" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:674 -#: inc/payments/stripe/admin-stripe-handler.php:1196 -#: inc/payments/stripe/stripe-webhook.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:675 +#: inc/payments/stripe/admin-stripe-handler.php:1199 +#: inc/payments/stripe/stripe-webhook.php:707 msgid "Partial" msgstr "" #. translators: %s: refund ID #. translators: %s: Refund ID. -#: inc/payments/stripe/admin-stripe-handler.php:680 -#: inc/payments/stripe/admin-stripe-handler.php:1202 -#: inc/payments/stripe/stripe-webhook.php:712 -#: inc/payments/stripe/stripe-webhook.php:876 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:681 +#: inc/payments/stripe/admin-stripe-handler.php:1205 +#: inc/payments/stripe/stripe-webhook.php:714 +#: inc/payments/stripe/stripe-webhook.php:878 msgid "Refund ID: %s" msgstr "" #. translators: 1: refund amount, 2: currency #. translators: 1: refund amount, 2: currency code #. translators: 1: Refund amount, 2: Currency. -#: inc/payments/stripe/admin-stripe-handler.php:690 -#: inc/payments/stripe/admin-stripe-handler.php:1212 -#: inc/payments/stripe/stripe-webhook.php:716 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:691 +#: inc/payments/stripe/admin-stripe-handler.php:1215 +#: inc/payments/stripe/stripe-webhook.php:718 msgid "Refund Amount: %1$s %2$s" msgstr "" #. translators: 1: total refunded, 2: currency, 3: original total, 4: currency #. translators: 1: total refunded, 2: currency, 3: original amount, 4: currency #. translators: 1: Total refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/admin-stripe-handler.php:696 -#: inc/payments/stripe/admin-stripe-handler.php:1218 -#: inc/payments/stripe/stripe-webhook.php:719 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:697 +#: inc/payments/stripe/admin-stripe-handler.php:1221 +#: inc/payments/stripe/stripe-webhook.php:721 msgid "Total Refunded: %1$s %2$s of %3$s %4$s" msgstr "" #. translators: %s: status (e.g., succeeded, processed) #. translators: %s: refund status #. translators: %s: Refund status (e.g., succeeded, failed). -#: inc/payments/stripe/admin-stripe-handler.php:704 -#: inc/payments/stripe/admin-stripe-handler.php:1226 -#: inc/payments/stripe/stripe-webhook.php:726 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:705 +#: inc/payments/stripe/admin-stripe-handler.php:1229 +#: inc/payments/stripe/stripe-webhook.php:728 msgid "Refund Status: %s" msgstr "" @@ -4055,144 +4094,136 @@ msgstr "" #. translators: %s: payment status #. translators: %s: Payment status (e.g., refunded, partially refunded). #. translators: %s: Payment status (e.g., succeeded, partially refunded). -#: inc/payments/stripe/admin-stripe-handler.php:709 -#: inc/payments/stripe/admin-stripe-handler.php:1231 -#: inc/payments/stripe/stripe-webhook.php:728 -#: inc/payments/stripe/stripe-webhook.php:892 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:710 +#: inc/payments/stripe/admin-stripe-handler.php:1234 +#: inc/payments/stripe/stripe-webhook.php:730 +#: inc/payments/stripe/stripe-webhook.php:894 msgid "Payment Status: %s" msgstr "" #. translators: %s: user display name #. translators: %s: refunded by user #. translators: %s: Refunded by method (e.g., Webhook). -#: inc/payments/stripe/admin-stripe-handler.php:714 -#: inc/payments/stripe/admin-stripe-handler.php:1236 -#: inc/payments/stripe/stripe-webhook.php:730 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:715 +#: inc/payments/stripe/admin-stripe-handler.php:1239 +#: inc/payments/stripe/stripe-webhook.php:732 msgid "Refunded by: %s" msgstr "" #. translators: %s: refund notes -#: inc/payments/stripe/admin-stripe-handler.php:723 -#: inc/payments/stripe/admin-stripe-handler.php:1245 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:724 +#: inc/payments/stripe/admin-stripe-handler.php:1248 msgid "Refund Notes: %s" msgstr "" #. translators: %s: refund type (Full or Partial) #. translators: %s: Refund type (e.g., Full, Partial). -#: inc/payments/stripe/admin-stripe-handler.php:732 -#: inc/payments/stripe/stripe-webhook.php:708 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:733 +#: inc/payments/stripe/stripe-webhook.php:710 msgid "%s Payment Refund" msgstr "" #. translators: %1$s: Payment settings link -#: inc/payments/stripe/admin-stripe-handler.php:796 +#: inc/payments/stripe/admin-stripe-handler.php:797 #: assets/build/payments.js:2 -#, php-format,js-format msgid "Webhooks keep SureForms in sync with Stripe by automatically updating payment and subscription data. Please %1$s Webhook." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:803 +#: inc/payments/stripe/admin-stripe-handler.php:804 #: assets/build/payments.js:2 msgid "configure" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:833 +#: inc/payments/stripe/admin-stripe-handler.php:834 msgid "Invalid refund parameters provided." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:847 +#: inc/payments/stripe/admin-stripe-handler.php:848 msgid "This payment is not related to a subscription." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:858 +#: inc/payments/stripe/admin-stripe-handler.php:861 msgid "Only active, succeeded, or partially refunded subscription payments can be refunded." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:888 +#: inc/payments/stripe/admin-stripe-handler.php:891 msgid "Stripe refund creation failed. Please check your Stripe dashboard for more details." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:899 +#: inc/payments/stripe/admin-stripe-handler.php:902 msgid "Refund was processed by Stripe but failed to update local records. Please check your payment records manually." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:907 +#: inc/payments/stripe/admin-stripe-handler.php:910 msgid "Subscription payment refunded successfully." msgstr "" #. translators: 1: Maximum refundable amount (numeric), 2: Currency code (e.g. USD) -#: inc/payments/stripe/admin-stripe-handler.php:974 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:977 msgid "Refund amount exceeds available amount. Maximum refundable: %1$s %2$s" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:984 +#: inc/payments/stripe/admin-stripe-handler.php:987 msgid "Refund amount must be greater than zero." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:992 +#: inc/payments/stripe/admin-stripe-handler.php:995 msgid "Refund amount must be at least $0.50." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1035 +#: inc/payments/stripe/admin-stripe-handler.php:1038 msgid "Unable to determine the appropriate refund method for this subscription payment." msgstr "" #. translators: %s: refund type (Full/Partial) -#: inc/payments/stripe/admin-stripe-handler.php:1253 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:1256 msgid "%s Subscription Payment Refund" msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1285 +#: inc/payments/stripe/admin-stripe-handler.php:1288 #: assets/build/payments.js:172 msgid "This payment has already been fully refunded." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1286 +#: inc/payments/stripe/admin-stripe-handler.php:1289 msgid "The payment could not be found in Stripe." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1287 +#: inc/payments/stripe/admin-stripe-handler.php:1290 msgid "The refund amount exceeds the available refundable amount." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1288 +#: inc/payments/stripe/admin-stripe-handler.php:1291 msgid "The payment for this subscription could not be found." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1289 +#: inc/payments/stripe/admin-stripe-handler.php:1292 msgid "The subscription could not be found in Stripe." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1290 +#: inc/payments/stripe/admin-stripe-handler.php:1293 msgid "This subscription has no successful payments to refund." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1291 +#: inc/payments/stripe/admin-stripe-handler.php:1294 msgid "The payment method for this subscription is invalid." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1292 +#: inc/payments/stripe/admin-stripe-handler.php:1295 msgid "Insufficient permissions to process refunds." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1293 +#: inc/payments/stripe/admin-stripe-handler.php:1296 msgid "Too many requests. Please try again in a moment." msgstr "" -#: inc/payments/stripe/admin-stripe-handler.php:1294 +#: inc/payments/stripe/admin-stripe-handler.php:1297 #: assets/build/payments.js:172 msgid "Network error. Please check your connection and try again." msgstr "" #. translators: %s: technical error message returned from Stripe. -#: inc/payments/stripe/admin-stripe-handler.php:1305 -#, php-format +#: inc/payments/stripe/admin-stripe-handler.php:1308 msgid "Subscription refund failed: %s" msgstr "" @@ -4229,7 +4260,6 @@ msgstr "" #. translators: %s: payment mode (test/live) #: inc/payments/stripe/payments-settings.php:371 #: inc/payments/stripe/stripe-helper.php:192 -#, php-format msgid "Stripe %s secret key is missing." msgstr "" @@ -4254,19 +4284,16 @@ msgstr "" #. translators: %s: payment mode (test/live) #: inc/payments/stripe/payments-settings.php:438 -#, php-format msgid "Webhook created successfully for %s mode." msgstr "" #. translators: %1$d: number of webhooks created #: inc/payments/stripe/payments-settings.php:581 -#, php-format msgid "Webhooks created successfully for %1$d mode(s)." msgstr "" #. translators: %1$d: number of webhooks created, %2$s: error message #: inc/payments/stripe/payments-settings.php:587 -#, php-format msgid "Webhooks created for %1$d mode(s). Some modes may have failed: %2$s" msgstr "" @@ -4292,7 +4319,6 @@ msgstr "" #. translators: %d: number of modes #: inc/payments/stripe/payments-settings.php:704 #: inc/payments/stripe/payments-settings.php:862 -#, php-format msgid "Webhooks deleted successfully for %d mode(s)." msgstr "" @@ -4314,7 +4340,6 @@ msgstr "" #. translators: %s: mode name (test/live) #: inc/payments/stripe/payments-settings.php:856 -#, php-format msgid "Webhook deleted successfully for %s mode." msgstr "" @@ -4340,7 +4365,6 @@ msgstr "" #. translators: %s: network error message #: inc/payments/stripe/stripe-helper.php:233 -#, php-format msgid "Network error: %s" msgstr "" @@ -4362,89 +4386,81 @@ msgstr "" #. translators: %s: Canceled date #: inc/payments/stripe/stripe-webhook.php:578 -#, php-format msgid "Canceled at: %s" msgstr "" #. translators: %s: Cancellation reason #. translators: %s: Failure reason. #: inc/payments/stripe/stripe-webhook.php:584 -#: inc/payments/stripe/stripe-webhook.php:890 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:892 msgid "Cancellation Reason: %s" msgstr "" #. translators: %s: Cancellation feedback #: inc/payments/stripe/stripe-webhook.php:592 -#, php-format msgid "Feedback: %s" msgstr "" #. translators: %s: Refunded by method (e.g., Webhook). #. translators: %s: Canceled by method (e.g., Webhook). -#: inc/payments/stripe/stripe-webhook.php:730 -#: inc/payments/stripe/stripe-webhook.php:894 +#: inc/payments/stripe/stripe-webhook.php:732 +#: inc/payments/stripe/stripe-webhook.php:896 #: assets/build/settings.js:172 msgid "Webhook" msgstr "" -#: inc/payments/stripe/stripe-webhook.php:872 +#: inc/payments/stripe/stripe-webhook.php:874 msgid "Refund Canceled" msgstr "" #. translators: 1: Canceled amount, 2: Currency. -#: inc/payments/stripe/stripe-webhook.php:880 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:882 msgid "Canceled Refund Amount: %1$s %2$s" msgstr "" #. translators: 1: Remaining refunded amount, 2: Currency, 3: Original amount, 4: Currency -#: inc/payments/stripe/stripe-webhook.php:883 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:885 msgid "Remaining Refunded: %1$s %2$s of %3$s %4$s" msgstr "" -#: inc/payments/stripe/stripe-webhook.php:1044 +#: inc/payments/stripe/stripe-webhook.php:1046 msgid "Initial Subscription Payment Succeeded" msgstr "" #. translators: %s: Invoice ID -#: inc/payments/stripe/stripe-webhook.php:1050 -#: inc/payments/stripe/stripe-webhook.php:1120 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1052 +#: inc/payments/stripe/stripe-webhook.php:1122 msgid "Invoice ID: %s" msgstr "" -#: inc/payments/stripe/stripe-webhook.php:1057 +#: inc/payments/stripe/stripe-webhook.php:1059 msgid "Payment Status: Succeeded" msgstr "" -#: inc/payments/stripe/stripe-webhook.php:1058 +#: inc/payments/stripe/stripe-webhook.php:1060 msgid "Subscription Status: Active" msgstr "" -#: inc/payments/stripe/stripe-webhook.php:1106 +#: inc/payments/stripe/stripe-webhook.php:1108 msgid "Subscription Charge Payment" msgstr "" #. translators: %s: Status -#: inc/payments/stripe/stripe-webhook.php:1116 +#: inc/payments/stripe/stripe-webhook.php:1118 msgid "Succeeded" msgstr "" #. translators: %s: Customer Email -#: inc/payments/stripe/stripe-webhook.php:1124 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1126 msgid "Customer Email: %s" msgstr "" #. translators: %s: Customer Name -#: inc/payments/stripe/stripe-webhook.php:1126 -#, php-format +#: inc/payments/stripe/stripe-webhook.php:1128 msgid "Customer Name: %s" msgstr "" -#: inc/payments/stripe/stripe-webhook.php:1127 +#: inc/payments/stripe/stripe-webhook.php:1129 msgid "Created via subscription billing cycle" msgstr "" @@ -4452,94 +4468,75 @@ msgstr "" msgid "Edit this form" msgstr "" -#: inc/post-types.php:187 +#: inc/post-types.php:208 msgid "No records found" msgstr "" -#: inc/post-types.php:188 +#: inc/post-types.php:209 msgid "This is where your form entries will appear" msgstr "" -#: inc/post-types.php:205 +#: inc/post-types.php:226 msgctxt "post type general name" msgid "Forms" msgstr "" -#: inc/post-types.php:206 +#: inc/post-types.php:227 msgctxt "post type singular name" msgid "Form" msgstr "" -#: inc/post-types.php:207 +#: inc/post-types.php:228 msgctxt "admin menu" msgid "Forms" msgstr "" -#: inc/post-types.php:208 +#: inc/post-types.php:229 msgctxt "form" msgid "Add New" msgstr "" -#: inc/post-types.php:209 +#: inc/post-types.php:230 #: assets/build/forms.js:172 msgid "Add New Form" msgstr "" -#: inc/post-types.php:212 +#: inc/post-types.php:233 #: assets/build/forms.js:172 #: assets/build/payments.js:172 msgid "View Form" msgstr "" -#: inc/post-types.php:213 +#: inc/post-types.php:234 msgid "View Forms" msgstr "" -#: inc/post-types.php:215 +#: inc/post-types.php:236 msgid "Search Forms" msgstr "" -#: inc/post-types.php:216 +#: inc/post-types.php:237 msgid "Parent Forms:" msgstr "" -#: inc/post-types.php:217 +#: inc/post-types.php:238 msgid "No forms found." msgstr "" -#: inc/post-types.php:218 +#: inc/post-types.php:239 msgid "No forms found in Trash." msgstr "" -#: inc/post-types.php:219 +#: inc/post-types.php:240 msgid "Form published." msgstr "" -#: inc/post-types.php:220 +#: inc/post-types.php:241 msgid "Form updated." msgstr "" -#: inc/post-types.php:977 -msgid "Admin Notification Email" -msgstr "" - -#. translators: %s: Form title smart tag -#: inc/post-types.php:984 -#, php-format -msgid "New Form Submission - %s" -msgstr "" - -#: inc/post-types.php:1060 -#: assets/build/formEditor.js:172 -msgid "Thank you" -msgstr "" - -#: inc/post-types.php:1060 -msgid "Your form has been submitted successfully. We'll review your details and get back to you soon." -msgstr "" - -#: inc/post-types.php:1204 -#: inc/post-types.php:1244 +#: inc/post-types.php:1225 +#: inc/post-types.php:1265 msgid "This form is closed. The submission period has ended." msgstr "" @@ -4583,40 +4580,60 @@ msgid "Invalid action. Use \"trash\" or \"restore\"." msgstr "" #: inc/rest-api.php:758 -#: inc/rest-api.php:898 +#: inc/rest-api.php:901 msgid "Entry ID is required." msgstr "" -#: inc/rest-api.php:1032 +#: inc/rest-api.php:1035 msgid "Select at least one form and specify an action." msgstr "" -#: inc/rest-api.php:1047 +#: inc/rest-api.php:1050 msgid "Form not found or is not a valid form type." msgstr "" -#: inc/rest-api.php:1059 +#: inc/rest-api.php:1062 msgid "This form is already in the trash." msgstr "" -#: inc/rest-api.php:1070 +#: inc/rest-api.php:1073 msgid "This form is not in the trash." msgstr "" -#: inc/rest-api.php:1085 +#: inc/rest-api.php:1089 +msgid "Use the restore action to recover a trashed form before switching it to draft." +msgstr "" + +#: inc/rest-api.php:1094 +msgid "This form is already a draft." +msgstr "" + +#: inc/rest-api.php:1109 msgid "Invalid action." msgstr "" #. translators: %s: action name -#: inc/rest-api.php:1100 -#, php-format +#: inc/rest-api.php:1124 msgid "Failed to %s this form. Please try again." msgstr "" -#: inc/rest-api.php:1781 +#: inc/rest-api.php:1805 msgid " (Copy)" msgstr "" +#: inc/single-form-settings/form-settings-api.php:105 +msgid "You do not have permission to edit this form." +msgstr "" + +#: inc/single-form-settings/form-settings-api.php:132 +msgid "Invalid form id." +msgstr "" + +#: inc/single-form-settings/form-settings-api.php:179 +#: assets/build/formEditor.js:172 +msgid "Form settings saved." +msgstr "" + #: inc/smart-tags.php:109 msgid "Site URL" msgstr "" @@ -4717,27 +4734,23 @@ msgstr "" #. translators: %s represents the minimum acceptable value #: inc/translatable.php:97 -#, php-format msgid "Minimum value is %s." msgstr "" #. translators: %s represents the maximum acceptable value #: inc/translatable.php:100 -#, php-format msgid "Maximum value is %s." msgstr "" #. translators: %s represents the minimum number of options to select #: inc/translatable.php:103 #: inc/translatable.php:109 -#, php-format msgid "Select at least %s options." msgstr "" #. translators: %s represents the maximum number of options that can be selected #: inc/translatable.php:106 #: inc/translatable.php:112 -#, php-format msgid "You can select up to %s options." msgstr "" @@ -12097,7 +12110,6 @@ msgstr "" #. translators: Here %s is the plugin's name. #: templates/single-form.php:179 -#, php-format msgid "Crafted with ♡ %s" msgstr "" @@ -12107,6 +12119,7 @@ msgstr "" #: assets/build/blocks.js:2 #: assets/build/forms.js:172 +#: assets/build/settings.js:172 msgid "(no title)" msgstr "" @@ -12134,37 +12147,31 @@ msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 -#, js-format msgid "%s - Order ID" msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 -#, js-format msgid "%s - Amount" msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 -#, js-format msgid "%s - Customer Email" msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 -#, js-format msgid "%s - Customer Name" msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 -#, js-format msgid "%s - Status" msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 -#, js-format msgid "%s - Description" msgstr "" @@ -12235,7 +12242,6 @@ msgstr "" #: modules/gutenberg/build/blocks.js:6 #: modules/gutenberg/build/blocks.js:7 #: modules/gutenberg/build/blocks.js:8 -#, js-format msgid "%s units" msgstr "" @@ -12608,6 +12614,7 @@ msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:2 +#: assets/build/settings.js:2 msgid "No tags available" msgstr "" @@ -12618,6 +12625,7 @@ msgstr "" #: assets/build/blocks.js:172 #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Generic tags" msgstr "" @@ -12915,6 +12923,14 @@ msgstr "" msgid "Dynamic Default Value" msgstr "" +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected." +msgstr "" + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes." +msgstr "" + #: assets/build/blocks.js:172 msgid "Select Country" msgstr "" @@ -12971,6 +12987,14 @@ msgstr "" msgid "Allow Multiple" msgstr "" +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes." +msgstr "" + +#: assets/build/blocks.js:172 +msgid "Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected." +msgstr "" + #: assets/build/blocks.js:172 msgid "Location Services" msgstr "" @@ -12992,12 +13016,10 @@ msgid "Show Interactive Map" msgstr "" #: assets/build/blocks.js:172 -#, js-format msgid "%1$s fields are required. Please configure these fields in the block settings." msgstr "" #: assets/build/blocks.js:172 -#, js-format msgid "%1$s field is required. Please configure this field in the block settings." msgstr "" @@ -13291,7 +13313,6 @@ msgid "Click here to insert a form" msgstr "" #: assets/build/blocks.js:172 -#, js-format msgid "%s Width" msgstr "" @@ -13370,6 +13391,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13382,6 +13404,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13394,6 +13417,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13406,6 +13430,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13418,6 +13443,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13430,6 +13456,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13442,6 +13469,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13454,6 +13482,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13466,6 +13495,7 @@ msgstr "" #: assets/build/forms.js:172 #: assets/build/learn.js:172 #: assets/build/page_header.js:172 +#: assets/build/partialEntriesEmptyState.js:172 #: assets/build/payments.js:172 #: assets/build/quizEmptyState.js:172 #: assets/build/settings.js:2 @@ -13808,12 +13838,10 @@ msgid "Free" msgstr "" #: assets/build/dashboard.js:172 -#, js-format msgid "Selected features require %1$s - use code %2$s to get 10% off on any plan." msgstr "" #: assets/build/dashboard.js:172 -#, js-format msgid "SureForms %s" msgstr "" @@ -13993,6 +14021,7 @@ msgstr "" #: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 +#: assets/build/settings.js:172 msgid "Page" msgstr "" @@ -14065,6 +14094,7 @@ msgid "Go to Forms" msgstr "" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 @@ -14072,36 +14102,34 @@ msgid "delete" msgstr "" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 -#, js-format msgid "Please type \"%s\" in the input box" msgstr "" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 -#, js-format msgid "To confirm, type \"%s\" in the box below:" msgstr "" #: assets/build/entries.js:172 +#: assets/build/formEditor.js:172 #: assets/build/forms.js:172 #: assets/build/payments.js:172 #: assets/build/settings.js:172 -#, js-format msgid "Type \"%s\"" msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "Entry #%1$s marked as %2$s." msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "%1$s entry marked as %2$s." msgid_plural "%1$s entries marked as %2$s." msgstr[0] "" @@ -14131,12 +14159,10 @@ msgid "Entry" msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "Entry #%s deleted permanently." msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "%s entry deleted permanently." msgid_plural "%s entries deleted permanently." msgstr[0] "" @@ -14147,24 +14173,20 @@ msgid "An error occurred. Please try again." msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "Entry #%s moved to trash." msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "Entry #%s restored successfully." msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "%1$s entry moved to trash." msgid_plural "%1$s entries moved to trash." msgstr[0] "" msgstr[1] "" #: assets/build/entries.js:172 -#, js-format msgid "%1$s entry restored successfully." msgid_plural "%1$s entries restored successfully." msgstr[0] "" @@ -14191,14 +14213,12 @@ msgstr[0] "" msgstr[1] "" #: assets/build/entries.js:172 -#, js-format msgid "Are you sure you want to permanently delete %s entry? This action cannot be undone." msgid_plural "Are you sure you want to permanently delete %s entries? This action cannot be undone." msgstr[0] "" msgstr[1] "" #: assets/build/entries.js:172 -#, js-format msgid "%s entry will be moved to trash and can be restored later." msgid_plural "%s entries will be moved to trash and can be restored later." msgstr[0] "" @@ -14215,7 +14235,6 @@ msgstr[0] "" msgstr[1] "" #: assets/build/entries.js:172 -#, js-format msgid "%s entry will be restored from trash." msgid_plural "%s entries will be restored from trash." msgstr[0] "" @@ -14242,7 +14261,6 @@ msgid "With the SureForms Starter plan, you can easily edit your entries to suit msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "%d item" msgid_plural "%d items" msgstr[0] "" @@ -14353,50 +14371,47 @@ msgid "Resend Email Notification" msgstr "" #: assets/build/entries.js:172 -#, js-format msgid "Entry #%s" msgstr "" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/draggable-block.js:83 -#, js-format msgid "%s Removed from Quick Action Bar." msgstr "" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:145 msgid "Add to Quick Action Bar" msgstr "" #. translators: abbreviation for units -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:42 -#, js-format msgid "%s Added to Quick Action Bar." msgstr "" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:155 msgid "Already Present in Quick Action Bar" msgstr "" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Modal.js:174 msgid "No results found." msgstr "" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/gutenberg/build/blocks.js:6 msgid "data object is empty" msgstr "" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:181 msgid "Add blocks to Quick Action Bar" msgstr "" -#: assets/build/formEditor.js:2 +#: assets/build/formEditor.js:172 #: modules/quick-action-sidebar/components/Sidebar.js:231 msgid "Re-arrange block inside Quick Action Bar" msgstr "" @@ -14410,51 +14425,83 @@ msgid "All changes will be saved automatically when you press back." msgstr "" #: assets/build/formEditor.js:172 +msgid "Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them." +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Failed to save form settings." +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Saving…" +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Save" +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Enable GDPR Compliance" msgstr "" #: assets/build/formEditor.js:172 -msgid "When enabled, this form will not store user IP, browser name, or device name in entries." +#: assets/build/settings.js:172 +msgid "When enabled this form will not store User IP, Browser Name and the Device Name in the Entries." msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Never store entry data after form submission" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will never store Entries." msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Automatically delete entries" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "When enabled this form will automatically delete entries after a certain period of time." msgstr "" #: assets/build/formEditor.js:172 -msgid "Compliance Settings" -msgstr "" - -#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the selected days will be deleted." msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries Time Period" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Entries older than the days set will be deleted automatically." msgstr "" #: assets/build/formEditor.js:172 -msgid "Custom CSS" +msgid "Failed to save. Please try again." msgstr "" #: assets/build/formEditor.js:172 -msgid "Add custom CSS rules to style this specific form independently of global styles." +#: assets/build/settings.js:172 +msgid "Compliance Settings" +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Custom CSS" +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Add custom CSS rules to style this specific form independently of global styles." msgstr "" #: assets/build/formEditor.js:172 @@ -14490,7 +14537,19 @@ msgid "Spam Protection" msgstr "" #: assets/build/formEditor.js:172 -msgid "Choose a spam protection method for this form to prevent unwanted submissions." +msgid "reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings." +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Please select a reCAPTCHA version." +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "hCaptcha API keys are not configured. Set them in Global Settings." +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Cloudflare Turnstile API keys are not configured. Set them in Global Settings." msgstr "" #: assets/build/formEditor.js:172 @@ -14518,97 +14577,137 @@ msgid "Please configure the API keys correctly from the settings" msgstr "" #: assets/build/formEditor.js:172 +msgid "Global Settings" +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Expected format for emails - email@sureforms.com or John Doe " +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Visual" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "HTML" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "All Data" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Form data" +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Form input tags" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Message" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Shortcode" msgstr "" #: assets/build/formEditor.js:172 -msgid "Expected format for emails - email@sureforms.com or John Doe " +#: assets/build/settings.js:172 +msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "" #: assets/build/formEditor.js:172 -#, js-format -msgid "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." +#: assets/build/settings.js:172 +msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." msgstr "" #: assets/build/formEditor.js:172 -#, js-format -msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " +#: assets/build/settings.js:172 +msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." msgstr "" #: assets/build/formEditor.js:172 -msgid "We strongly recommend that you install the free " +#: assets/build/settings.js:172 +msgid "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "" #: assets/build/formEditor.js:172 -msgid " plugin! The Setup Wizard makes it easy to fix your emails. " +#: assets/build/settings.js:172 +msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " msgstr "" #: assets/build/formEditor.js:172 -#, js-format +#: assets/build/settings.js:172 msgid " Alternately, try using a From Address that matches your website domain (admin@%s)." msgstr "" #: assets/build/formEditor.js:172 -#, js-format -msgid "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s)." +#: assets/build/settings.js:172 +msgid "We strongly recommend that you install the free " msgstr "" #: assets/build/formEditor.js:172 -#, js-format -msgid "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. " +#: assets/build/settings.js:172 +msgid " plugin! The Setup Wizard makes it easy to fix your emails. " msgstr "" #: assets/build/formEditor.js:172 -msgid "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly." +#: assets/build/settings.js:172 +msgid "Comma separated values are also accepted." msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Notifications can use only one From Email so please enter a single address." msgstr "" #: assets/build/formEditor.js:172 -msgid "From Name" +#: assets/build/settings.js:172 +msgid "Name" msgstr "" #: assets/build/formEditor.js:172 -msgid "From Email" +#: assets/build/settings.js:172 +msgid "Send Email To" msgstr "" #: assets/build/formEditor.js:172 -msgid "Comma separated values are also accepted." +#: assets/build/settings.js:172 +msgid "Subject" msgstr "" #: assets/build/formEditor.js:172 -msgid "Name" +#: assets/build/settings.js:172 +msgid "From Name" msgstr "" #: assets/build/formEditor.js:172 #: assets/build/settings.js:172 -msgid "Send Email To" +msgid "From Email" msgstr "" #: assets/build/formEditor.js:172 -msgid "Subject" +#: assets/build/settings.js:172 +msgid "CC" +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "BCC" +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Reply To" msgstr "" #: assets/build/formEditor.js:172 @@ -14624,15 +14723,33 @@ msgid "Smart tags that reference user-submitted fields will not be escaped in ra msgstr "" #: assets/build/formEditor.js:172 -msgid "CC" +msgid "Some fields need attention" msgstr "" #: assets/build/formEditor.js:172 -msgid "BCC" +#: assets/build/settings.js:172 +msgid "Unsaved changes" msgstr "" #: assets/build/formEditor.js:172 -msgid "Reply To" +msgid "A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back." +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes for this notification. Discard them to go back, or stay to save them." +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Discard & go back" +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Stay & fix" +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 +msgid "Keep editing" msgstr "" #: assets/build/formEditor.js:172 @@ -14640,19 +14757,19 @@ msgid "Please provide a recipient email address and subject line." msgstr "" #: assets/build/formEditor.js:172 -msgid "Add Notification" +msgid "Please provide a recipient email address." msgstr "" #: assets/build/formEditor.js:172 -msgid "Control email alerts sent to admins or users after a form submission." +msgid "Please provide a subject line." msgstr "" #: assets/build/formEditor.js:172 -msgid "Email Notification disabled successfully." +msgid "Add Notification" msgstr "" #: assets/build/formEditor.js:172 -msgid "Email Notification enabled successfully." +msgid "Control email alerts sent to admins or users after a form submission." msgstr "" #: assets/build/formEditor.js:172 @@ -14673,94 +14790,116 @@ msgid "Email notification deleted!" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Key" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Value" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Hide Form" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Reset Form" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "After Form Submission" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select Page to redirect" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Search for a page" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select a page" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Custom URL" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Add Query Parameters" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Select if you want to add key-value pairs for form fields to include in query parameters" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Query Parameters" msgstr "" #: assets/build/formEditor.js:172 -msgid "Please select a page." +#: assets/build/settings.js:172 +msgid "Success Message" msgstr "" #: assets/build/formEditor.js:172 -msgid "Suggestion: URL should use HTTPS" +#: assets/build/settings.js:172 +msgid "Redirect" msgstr "" #: assets/build/formEditor.js:172 -msgid "URL is missing Top Level Domain (TLD)." +#: assets/build/settings.js:172 +msgid "Redirect to" msgstr "" #: assets/build/formEditor.js:172 -msgid "Please enter a valid URL." +#: assets/build/settings.js:172 +msgid "Form Confirmation" msgstr "" #: assets/build/formEditor.js:172 -msgid "Success Message" +msgid "Customize the confirmation message or redirect the users after submitting the form." msgstr "" #: assets/build/formEditor.js:172 -msgid "Redirect" +msgid "Please select a page." msgstr "" #: assets/build/formEditor.js:172 -msgid "Redirect to" +msgid "Suggestion: URL should use HTTPS" msgstr "" #: assets/build/formEditor.js:172 -msgid "Form Confirmation" +msgid "URL is missing Top Level Domain (TLD)." msgstr "" #: assets/build/formEditor.js:172 -msgid "Customize the confirmation message or redirect the users after submitting the form." +msgid "Please enter a valid URL." msgstr "" #: assets/build/formEditor.js:172 +msgid "Please provide a custom URL." +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Confirmation Type" msgstr "" @@ -14781,18 +14920,26 @@ msgid "Form Restriction" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Number of Entries" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Set the total number of submissions allowed for this form." msgstr "" #: assets/build/formEditor.js:172 +msgid "The entry cap relies on stored entries to count submissions. While Compliance Settings has \"Never store entry data after form submission\" enabled, this limit will not be enforced. Disable that option, or remove the entry limit, to use this feature." +msgstr "" + +#: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Maximum Entries" msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Response Description After Maximum Entries" msgstr "" @@ -14832,10 +14979,6 @@ msgstr "" msgid "Response Description Before Start Date" msgstr "" -#: assets/build/formEditor.js:172 -msgid "This form is not yet available. Please check back after the scheduled start time." -msgstr "" - #: assets/build/formEditor.js:172 msgid "Response Description After End Date" msgstr "" @@ -14896,6 +15039,7 @@ msgid "Every form submission should trigger something — a Slack alert, a CRM l msgstr "" #: assets/build/formEditor.js:172 +#: assets/build/settings.js:172 msgid "Email Notification" msgstr "" @@ -15093,6 +15237,14 @@ msgstr "" msgid "Form Behavior" msgstr "" +#: assets/build/formEditor.js:172 +msgid "You have unsaved changes. Discard them to continue, or stay to save your changes." +msgstr "" + +#: assets/build/formEditor.js:172 +msgid "Discard & continue" +msgstr "" + #: assets/build/formEditor.js:172 msgid "Use Labels as Placeholders" msgstr "" @@ -15384,6 +15536,10 @@ msgstr "" msgid "Drafts" msgstr "" +#: assets/build/forms.js:172 +msgid "Switch to Draft" +msgstr "" + #: assets/build/forms.js:172 msgid "Export" msgstr "" @@ -15449,32 +15605,34 @@ msgid "An error occurred while fetching forms." msgstr "" #: assets/build/forms.js:172 -#, js-format msgid "%d form moved to trash." msgid_plural "%d forms moved to trash." msgstr[0] "" msgstr[1] "" #: assets/build/forms.js:172 -#, js-format msgid "%d form restored." msgid_plural "%d forms restored." msgstr[0] "" msgstr[1] "" #: assets/build/forms.js:172 -#, js-format msgid "%d form permanently deleted." msgid_plural "%d forms permanently deleted." msgstr[0] "" msgstr[1] "" +#: assets/build/forms.js:172 +msgid "%d form switched to draft." +msgid_plural "%d forms switched to draft." +msgstr[0] "" +msgstr[1] "" + #: assets/build/forms.js:172 msgid "An error occurred while performing the action." msgstr "" #: assets/build/forms.js:172 -#, js-format msgid "Form \"%s\" duplicated successfully." msgstr "" @@ -15483,7 +15641,6 @@ msgid "An error occurred while duplicating the form." msgstr "" #: assets/build/forms.js:172 -#, js-format msgid "%d form imported successfully." msgid_plural "%d forms imported successfully." msgstr[0] "" @@ -15500,7 +15657,6 @@ msgstr[0] "" msgstr[1] "" #: assets/build/forms.js:172 -#, js-format msgid "%d form will be moved to trash and can be restored later." msgid_plural "%d forms will be moved to trash and can be restored later." msgstr[0] "" @@ -15513,7 +15669,6 @@ msgstr[0] "" msgstr[1] "" #: assets/build/forms.js:172 -#, js-format msgid "Are you sure you want to permanently delete %d form? This action cannot be undone." msgid_plural "Are you sure you want to permanently delete %d forms? This action cannot be undone." msgstr[0] "" @@ -15526,16 +15681,31 @@ msgstr[0] "" msgstr[1] "" #: assets/build/forms.js:172 -#, js-format msgid "%d form will be restored from trash." msgid_plural "%d forms will be restored from trash." msgstr[0] "" msgstr[1] "" +#: assets/build/forms.js:172 +msgid "Switch form to draft?" +msgid_plural "Switch forms to draft?" +msgstr[0] "" +msgstr[1] "" + +#: assets/build/forms.js:172 +msgid "%d form will be switched to draft and will no longer be publicly accessible." +msgid_plural "%d forms will be switched to draft and will no longer be publicly accessible." +msgstr[0] "" +msgstr[1] "" + #: assets/build/forms.js:172 msgid "This form will be moved to trash and can be restored later." msgstr "" +#: assets/build/forms.js:172 +msgid "This form will be switched to draft and will no longer be publicly accessible." +msgstr "" + #: assets/build/forms.js:172 msgid "Delete form?" msgstr "" @@ -15549,7 +15719,6 @@ msgid "Duplicate form?" msgstr "" #: assets/build/forms.js:172 -#, js-format msgid "This will create a copy of \"%s\" with all its settings." msgstr "" @@ -15558,6 +15727,54 @@ msgstr "" msgid "An error occurred while submitting your form. Please try again." msgstr "" +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not authenticate this request. Please reload the editor and try again." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "%s — Converted form" +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms using AI. Review the new form for any tweaks." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "Form converted to SureForms." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "You do not have permission to convert this form." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "This form is too large to convert. Try simplifying the markup or building the form manually." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms could not derive any fields from this form." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "The SureForms AI service could not process this form. Please try again or build the form manually." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "SureForms received an unexpected response. Please try again." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "Could not convert this form to SureForms. Please try again." +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "Converting…" +msgstr "" + +#: assets/build/htmlFormDetector.js:2 +msgid "Convert to SureForms" +msgstr "" + #: assets/build/learn.js:2 msgid "Failed to save progress. Please try again." msgstr "" @@ -15567,7 +15784,6 @@ msgid "1 minute" msgstr "" #: assets/build/learn.js:172 -#, js-format msgid "%d minutes" msgstr "" @@ -15621,7 +15837,6 @@ msgid "Learn how" msgstr "" #: assets/build/learn.js:172 -#, js-format msgid "%1$d of %2$d steps completed" msgstr "" @@ -15637,6 +15852,36 @@ msgstr "" msgid "To help you take full control and ensure success of your forms, we have outlined a few tasks and prepared a set of instructional videos. These will help you learn how to setup, customize and grow your forms." msgstr "" +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Capture in-progress form data the moment visitors stop typing — no submit required" +msgstr "" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Recover abandoned submissions and follow up with prospects you would otherwise lose" +msgstr "" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Let visitors pick up where they left off with secure, shareable resume links" +msgstr "" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Partial Entries Placeholder" +msgstr "" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "Stop Losing Leads to Abandoned Forms" +msgstr "" + +#: assets/build/partialEntriesEmptyState.js:172 +msgid "See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:" +msgstr "" + +#: assets/build/partialEntriesEmptyState.js:172 +#: assets/build/quizEmptyState.js:172 +#: assets/build/surveyEmptyState.js:172 +msgid "Upgrade to SureForms" +msgstr "" + #: assets/build/payments.js:2 #: assets/build/settings.js:172 msgid "USD - US Dollar" @@ -15749,7 +15994,6 @@ msgid "Delete Payments" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Are you sure you want to delete %d payments? This action cannot be undone and will permanently remove all associated data including notes, logs, and transaction information." msgstr "" @@ -15786,7 +16030,6 @@ msgid "Submit Note" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Submitted by %1$s - %2$s" msgstr "" @@ -15823,7 +16066,6 @@ msgid "Delete log" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "%1$s %2$s" msgstr "" @@ -15843,26 +16085,19 @@ msgstr "" msgid "Payment not found" msgstr "" -#: assets/build/payments.js:172 -msgid "Refund failed. Please try again." -msgstr "" - #: assets/build/payments.js:172 msgid "Please enter a valid refund amount." msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Amount cannot exceed %s." msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "This will issue a complete refund of %s. The entire payment will be refunded." msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "This will issue a partial refund of %1$s. Remaining balance of %2$s will still be valid." msgstr "" @@ -15871,7 +16106,6 @@ msgid "Refund payment" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Process refund for payment #%s. The refunded amount will be sent to the customer's original payment method." msgstr "" @@ -15880,12 +16114,10 @@ msgid "Refund amount" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Max: %s" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Maximum refundable amount: %s" msgstr "" @@ -15902,7 +16134,10 @@ msgid "This note will be stored with the refund record for future reference." msgstr "" #: assets/build/payments.js:172 -#, js-format +msgid "Refund failed. Please try again." +msgstr "" + +#: assets/build/payments.js:172 msgid "Already refunded: %s" msgstr "" @@ -15971,7 +16206,6 @@ msgid "Failed to pause subscription. Please try again." msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Are you sure you want to cancel subscription #%s? This action cannot be undone and the customer will lose access to their subscription benefits." msgstr "" @@ -15988,7 +16222,6 @@ msgid "Pause Subscription" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Are you sure you want to pause subscription #%s? The customer will not be charged until you resume the subscription." msgstr "" @@ -16029,12 +16262,10 @@ msgid "No paid EMI found to refund." msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Subscription #%s" msgstr "" #: assets/build/payments.js:172 -#, js-format msgid "Payment #%s" msgstr "" @@ -16062,11 +16293,6 @@ msgstr "" msgid "Turn your forms into powerful quizzes. Upgrade to SureForms to unlock quiz capabilities:" msgstr "" -#: assets/build/quizEmptyState.js:172 -#: assets/build/surveyEmptyState.js:172 -msgid "Upgrade to SureForms" -msgstr "" - #: assets/build/settings.js:172 msgid "General Settings" msgstr "" @@ -16075,6 +16301,18 @@ msgstr "" msgid "Set up email summaries, admin alerts, and data preferences to manage your forms with ease." msgstr "" +#: assets/build/settings.js:172 +msgid "Global Defaults" +msgstr "" + +#: assets/build/settings.js:172 +msgid "Form Restrictions" +msgstr "" + +#: assets/build/settings.js:172 +msgid "Configure default settings that apply to newly created forms." +msgstr "" + #: assets/build/settings.js:172 msgid "Form Validation" msgstr "" @@ -16127,10 +16365,6 @@ msgstr "" msgid "Connect and manage your payment gateways to securely accept transactions through your forms." msgstr "" -#: assets/build/settings.js:172 -msgid "Email Summaries" -msgstr "" - #: assets/build/settings.js:172 msgid "Tuesday" msgstr "" @@ -16168,47 +16402,55 @@ msgid "Schedule Reports" msgstr "" #: assets/build/settings.js:172 -msgid "IP Logging" +msgid "Enable IP logging" msgstr "" #: assets/build/settings.js:172 -msgid "Enable IP logging" +msgid "If this option is turned on, the user's IP address will be saved with the form data" msgstr "" #: assets/build/settings.js:172 -msgid "If this option is turned on, the user's IP address will be saved with the form data" +msgid "Enable Admin Notification" msgstr "" #: assets/build/settings.js:172 -msgid "Admin Notification" +msgid "Admin notifications keep you informed about new form entries since your last visit." msgstr "" #: assets/build/settings.js:172 -msgid "Enable Admin Notification" +msgid "Turn on Admin Notification from here." msgstr "" #: assets/build/settings.js:172 -msgid "Admin notifications keep you informed about new form entries since your last visit." +msgid "Help shape the future of SureForms" msgstr "" #: assets/build/settings.js:172 -msgid "Turn on Admin Notification from here." +msgid "Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. " msgstr "" #: assets/build/settings.js:172 -msgid "Anonymous Analytics" +msgid "Learn More" msgstr "" #: assets/build/settings.js:172 -msgid "Help shape the future of SureForms" +msgid "Email Summaries" msgstr "" #: assets/build/settings.js:172 -msgid "Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. " +msgid "IP Logging" msgstr "" #: assets/build/settings.js:172 -msgid "Learn More" +msgid "Admin Notification" +msgstr "" + +#: assets/build/settings.js:172 +msgid "Anonymous Analytics" +msgstr "" + +#: assets/build/settings.js:172 +msgid "Failed to load pages. Please refresh and try again." msgstr "" #: assets/build/settings.js:172 @@ -16256,7 +16498,6 @@ msgid "Number Minimum Value" msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "%s represents the minimum input value. For example: \"Minimum value is 10.\"" msgstr "" @@ -16265,7 +16506,6 @@ msgid "Number Maximum Value" msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "%s represents the maximum input value. For example: \"Maximum value is 100.\"" msgstr "" @@ -16274,7 +16514,6 @@ msgid "Dropdown Minimum Selections" msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "%s represents the minimum selections needed. For example: “Minimum 2 selections are required.”" msgstr "" @@ -16283,7 +16522,6 @@ msgid "Dropdown Maximum Selections" msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "%s represents the maximum selections allowed. For example: “Maximum 4 selections are allowed.”" msgstr "" @@ -16292,7 +16530,6 @@ msgid "Multiple Choice Minimum Selections" msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "%s represents the minimum choices needed. For example: “Minimum 1 selection is required.”" msgstr "" @@ -16301,7 +16538,6 @@ msgid "Multiple Choice Maximum Selections" msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "%s represents the maximum choices allowed. For example: “Maximum 3 selections are allowed.”" msgstr "" @@ -16374,7 +16610,6 @@ msgid "Get Keys" msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "Enter your %s here" msgstr "" @@ -16451,7 +16686,6 @@ msgid "2.9% transaction and payment gateway fees apply." msgstr "" #: assets/build/settings.js:172 -#, js-format msgid "Please visit %1$s, delete an unused webhook, then click below to retry." msgstr "" @@ -16752,11 +16986,39 @@ msgid "MCP Adapter Required" msgstr "" #: assets/build/settings.js:172 -msgid "Save" +msgid "Failed to load settings. Please refresh and try again." +msgstr "" + +#: assets/build/settings.js:172 +msgid "Form Validation fields cannot be left blank." +msgstr "" + +#: assets/build/settings.js:172 +msgid "Recipient email is required when email summaries are enabled." +msgstr "" + +#: assets/build/settings.js:172 +msgid "Please enter a valid recipient email." +msgstr "" + +#: assets/build/settings.js:172 +msgid "Settings saved." +msgstr "" + +#: assets/build/settings.js:172 +msgid "Failed to save settings." +msgstr "" + +#: assets/build/settings.js:172 +msgid "Some settings failed to save. Please retry." +msgstr "" + +#: assets/build/settings.js:172 +msgid "Some fields have unsaved changes. Discard them to continue, or stay to save your edits." msgstr "" #: assets/build/settings.js:172 -msgid "This field cannot be left blank." +msgid "Discard & switch" msgstr "" #: assets/build/suremail.js:2 @@ -17060,17 +17322,14 @@ msgid "Perfect for feedback, polls, and research" msgstr "" #: assets/build/templatePicker.js:172 -#, js-format msgid "%d AI Generations Left. SureForms Premium allows:" msgstr "" #: assets/build/templatePicker.js:172 -#, js-format msgid "%d AI Generations Left, Connect to SureForms AI to Get 10 More" msgstr "" #: assets/build/templatePicker.js:172 -#, js-format msgid "%d AI Generations Left. Upgrade to SureForms Premium" msgstr "" @@ -17215,7 +17474,6 @@ msgid "You've reached your daily limit for AI form generations." msgstr "" #: assets/build/templatePicker.js:172 -#, js-format msgid "Please try again after %s." msgstr "" @@ -17224,7 +17482,6 @@ msgid "You have reached the maximum number of form generations in your Free Plan msgstr "" #: assets/build/templatePicker.js:172 -#, js-format msgid "%s AI Generations Left." msgstr "" @@ -17738,7 +17995,6 @@ msgstr "" #. translators: %s: file name #: modules/gutenberg/build/blocks.js:9 -#, js-format msgid "This image has an empty alt attribute; its file name is %s" msgstr "" diff --git a/package-lock.json b/package-lock.json index 7b80ac1c9..2f219ea8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sureforms", - "version": "2.8.2", + "version": "2.10.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sureforms", - "version": "2.8.2", + "version": "2.10.1", "license": "GPL", "dependencies": { "@bsf/force-ui": "git+https://github.com/brainstormforce/bsf-admin-ui#v1.7.7", diff --git a/package.json b/package.json index a75ea54ac..a5b6fa19b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sureforms", - "version": "2.8.2", + "version": "2.10.1", "description": "A simple yet powerful way to add forms to your website.", "main": "index.js", "scripts": { diff --git a/phpstan.neon b/phpstan.neon index 9321f57db..aa3ae17e8 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -31,6 +31,7 @@ parameters: - inc/form-builder - inc/services/browser - inc/lib + - tests # excludes_analyse: # autoload_files: # # Missing constants, function and class stubs diff --git a/plugin-loader.php b/plugin-loader.php index 67086b906..6e6a809e2 100644 --- a/plugin-loader.php +++ b/plugin-loader.php @@ -14,6 +14,7 @@ use SRFM\Inc\Abilities\Abilities_Registrar; use SRFM\Inc\Activator; use SRFM\Inc\Admin\Editor_Nudge; +use SRFM\Inc\Admin\Html_Form_Detector; use SRFM\Inc\Admin_Ajax; use SRFM\Inc\AI_Form_Builder\AI_Auth; use SRFM\Inc\AI_Form_Builder\AI_Form_Builder; @@ -34,6 +35,7 @@ use SRFM\Inc\Generate_Form_Markup; use SRFM\Inc\Global_Settings\Email_Summary; use SRFM\Inc\Global_Settings\Global_Settings; +use SRFM\Inc\Global_Settings\Global_Settings_Defaults; use SRFM\Inc\Gutenberg_Hooks; use SRFM\Inc\Helper; use SRFM\Inc\Learn; @@ -43,6 +45,7 @@ use SRFM\Inc\Post_Types; use SRFM\Inc\Rest_Api; use SRFM\Inc\Single_Form_Settings\Compliance_Settings; +use SRFM\Inc\Single_Form_Settings\Form_Settings_Api; use SRFM\Inc\Smart_Tags; use SRFM\Inc\Updater; @@ -215,6 +218,11 @@ public function load_classes() { Notice_Manager::get_instance(); Editor_Nudge::get_instance(); } + // Always instantiate — script enqueue is self-gated by `allow_load()`, + // while the REST endpoint for converting HTML forms must register + // outside the admin context (REST dispatch runs with `is_admin()` === + // false, so admin-only instantiation would 404 the endpoint). + Html_Form_Detector::get_instance(); Payments::get_instance(); Duplicate_Form::get_instance(); Learn::get_instance(); @@ -295,8 +303,10 @@ public function load_plugin() { Generate_Form_Markup::get_instance(); Create_New_Form::get_instance(); Global_Settings::get_instance(); + Global_Settings_Defaults::get_instance(); Email_Summary::get_instance(); Compliance_Settings::get_instance(); + Form_Settings_Api::get_instance(); Events_Scheduler::get_instance(); AI_Form_Builder::get_instance(); Field_Mapping::get_instance(); diff --git a/readme.txt b/readme.txt index fdd93df0b..549809e7d 100644 --- a/readme.txt +++ b/readme.txt @@ -1,36 +1,40 @@ -=== SureForms - Contact Form, Payment Form & Other Custom Form Builder === +=== SureForms - Contact Form, Payment Form, Survey & Other Custom Form Builder === Contributors: brainstormforce -Tags: forms, contact form, custom form, payment form, form builder +Tags: forms, contact form, form builder, payment form, WordPress form plugin Requires at least: 6.4 -Tested up to: 6.9.4 +Tested up to: 7.0 Requires PHP: 7.4 -Stable tag: 2.8.2 +Stable tag: 2.10.1 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html -The most beginner-friendly AI Form Builder for WordPress. Create contact, payment, quiz & custom forms with advanced features in minutes. +The AI-powered WordPress form builder. Build contact, payment, quiz, survey & multi-step forms in minutes, no code needed. == Description == -#### SUREFORMS – THE BEST AI-ASSISTED FORM BUILDER +#### SUREFORMS – THE BEST AI-ASSISTED WORDPRESS FORM BUILDER ★★★★★ +SureForms is the most beginner-friendly **WordPress form builder**, designed to help anyone create contact forms, payment forms, surveys, quizzes, multi-step forms, and conversational forms without writing a single line of code. Powered by AI and built natively on the WordPress block editor, SureForms makes building any form on your WordPress site fast, intuitive, and beautiful. + +Trusted by **500,000+ websites**, SureForms is the modern alternative to traditional contact form plugins — purpose-built for speed, design, and conversions. + 👉 Try the live demo of SureForms [youtube https://www.youtube.com/watch?v=qLpnm4GdXks] ### CREATE BEAUTIFUL RESPONSIVE FORMS USING WORDPRESS BLOCK EDITOR (GUTENBERG EDITOR) WITHOUT CODING ⚡ -Our mission at SureForms is to empower you to build **beautiful forms without any code**. +Our mission at SureForms is to empower you to build **beautiful WordPress forms without any code**. -We're taking a fresh approach with Gutenberg, WordPress's native drag-and-drop builder, to make creating forms seamless and intuitive with no new interface to learn. +We're taking a fresh approach with Gutenberg, WordPress's native drag-and-drop builder, to make creating contact forms and custom forms seamless and intuitive — with no new interface to learn. -SureForms is a beginner-friendly form plugin that makes building contact forms and other high-converting custom forms fast and simple with advanced features like multi-step forms, conversational forms, payment forms, conditional logic, calculation, native integrations, etc. +SureForms is a beginner-friendly WordPress form plugin that makes building contact forms and other high-converting custom forms fast and simple, with advanced features like multi-step forms, conversational forms, payment forms, conditional logic, calculations, native integrations, and more. Good design and user experience are crucial for forms. Yet many website owners struggle to make their forms blend seamlessly with their site's look and feel, often leading to lower response rates. -In this regard, SureForms addresses several pain points commonly experienced by website owners: +In this regard, SureForms addresses several pain points commonly experienced by WordPress users: - Complex Process of Form Building - Design Limitations @@ -44,17 +48,17 @@ SureForms is packed with features to address these pain points of WordPress user Below are some of the top features SureForms offers: -#### Native WordPress +#### Native WordPress Form Builder (No New Editor to Learn) -SureForms uses WordPress's native block editor for a seamless drag-and-drop form building experience. No need to learn a new editor or a new style. +SureForms uses WordPress's native block editor for a seamless drag-and-drop form building experience. There's no separate interface, no proprietary builder, and no learning curve — just the WordPress editor you already know. It's fast, simple, and the most beginner-friendly form builder for WordPress. -#### Create Forms Effortlessly with AI +#### AI Form Builder for WordPress [youtube https://www.youtube.com/watch?v=uDLF4dk3YHI] -SureForms is the first AI-powered form builder for WordPress, which makes form creation faster and smarter. From simple contact forms to advanced calculators, AI handles the details, offers smart suggestions, and helps you build functional, user friendly forms in just a few clicks. +SureForms is the first AI-powered form builder for WordPress, making form creation faster and smarter. From simple contact forms to advanced calculators, the SureForms AI handles the details, offers smart field suggestions, and helps you build functional, user-friendly forms in just a few clicks. **Here are a few examples of forms you can create with SureForms AI:** @@ -69,35 +73,35 @@ SureForms is the first AI-powered form builder for WordPress, which makes form c - Calculators - Conversational Forms -#### No-Code Flexibility +#### No-Code Form Builder with Advanced Logic -SureForms makes advanced features like conditional logic, multi-step forms, query parameters and etc. simple to use through a no-code interface. This empowers anyone to create powerful, interactive forms without writing a single line of code. +SureForms makes advanced features like conditional logic, multi-step forms, query parameters, and more simple to use through a no-code interface. This empowers anyone to create powerful, interactive WordPress forms without writing a single line of code. -#### Payment Forms +#### WordPress Payment Forms with Stripe and PayPal -SureForms supports a built-in Payment Forms feature. With SureForms, anyone can easily create full-fledged donation forms, event registrations, product checkouts, or any kind of form that needs to accept payments, all without relying on any extra add-on or third-party plugins. This makes collecting payments seamless, secure, and effortless directly through your forms using Stripe. PayPal payments are available with SureForms Business. +SureForms supports a built-in **Payment Forms** feature. With SureForms, anyone can easily create full-fledged donation forms, event registrations, product checkouts, or any kind of form that needs to accept payments — all without relying on any extra add-on or third-party plugins. This makes collecting payments seamless, secure, and effortless directly through your WordPress forms using Stripe. PayPal payments are available with SureForms Business. -Here are a few examples of how the Payment Feature in SureForms can power your forms: +Here are a few examples of how the Payment Forms feature in SureForms can power your forms: - [Donation Form](https://sureforms.com/form/donation-form/) - [Photography Packages Booking Form](https://sureforms.com/form/photography-packages-payment-form/) - [Monthly Membership Plan Form](https://sureforms.com/form/monthly-membership-plan/) - [Web Design Packages Booking Form](https://sureforms.com/form/freelance-web-design-packages-payment/) -#### Instant Forms +#### Instant Forms (Shareable Form Links — No Embed Needed) [youtube https://www.youtube.com/watch?v=pMH129ZUxJ0] -With SureForms' own Instant Form feature, you can publish forms with a unique shareable URL. No embedding needed. Share them anywhere and make your forms instantly accessible. +With SureForms' own Instant Form feature, you can publish forms with a unique shareable URL. No page, no shortcode, no embedding needed. Share the link anywhere — email, social, SMS — and make your forms instantly accessible. -#### Mobile-First Approach +#### Mobile-Friendly Responsive Forms -SureForms recognizes the importance of mobile friendly forms. The forms created with SureForms are designed with a mobile-first approach, ensuring they look and function flawlessly on various devices. +SureForms recognizes the importance of mobile-friendly forms. Every form created with SureForms is designed with a mobile-first approach, ensuring it looks and functions flawlessly on phones, tablets, and desktops alike. -#### Multi-Column Layouts +#### Multi-Column Form Layouts SureForms makes it easy to arrange input fields into multiple columns for a clean, efficient form layout. This makes your forms look organized, visually appealing, and encourages higher completion rates. You can customize the columns to fit your design. -#### Input Fields +#### 15+ Form Input Fields **SureForms comes with 15+ fields to build your form:** @@ -118,35 +122,35 @@ SureForms makes it easy to arrange input fields into multiple columns for a clea - Image - Icon -#### Inline Field Validation +#### Inline Form Validation in Real-Time -Real-time validation for form fields provides instant feedback to users if they enter incorrect or incomplete information. This ensures data accuracy and enhances the user experience. +Real-time validation for form fields provides instant feedback to users if they enter incorrect or incomplete information. This ensures data accuracy and enhances the user experience on every form submission. -#### GDPR Compliance +#### GDPR-Compliant WordPress Forms Ensure your forms are GDPR compliant and protect user data by simply enabling the built-in GDPR setting. -#### Anti-Spam Forms +#### Anti-Spam Forms (reCAPTCHA + Honeypot) -Protect your forms from spam with built-in measures like Google reCAPTCHA and Honeypot fields. These ensure submissions are genuine, block bots, and keep your forms secure without bothering your users. +Protect your WordPress forms from spam with built-in measures like Google reCAPTCHA and Honeypot fields. These ensure submissions are genuine, block bots, and keep your forms secure without bothering your users. -#### Personalized Confirmation Messages +#### Personalized Confirmation Messages and Redirects SureForms provides options for setting up customized confirmation messages or redirections that are displayed to users after successful form submissions. Tailor these messages to provide personalized feedback or redirect respondents to specific pages. -#### Email Notifications +#### Email Notifications for Every Form Submission Configure customized email notifications triggered by form submissions. Specify recipients, email templates, and personalized messages to stay informed and automate communication. -#### Form Entries +#### Form Entries Management Inside WordPress -Stores form entries securely to access and manage form submission data within your WordPress dashboard. You can also review, export, or perform actions on form entries as needed. +Stores form entries securely so you can access and manage form submission data right inside your WordPress dashboard. You can review, export, or perform actions on form entries as needed — no external service required. -#### Visual Data Reporting +#### Visual Data Reporting and Form Analytics -Analyze and gain insights from form submissions through interactive charts, graphs, and data visualizations. Take data-driven decisions. +Analyze and gain insights from form submissions through interactive charts, graphs, and data visualizations. Take data-driven decisions from your WordPress dashboard. #### Developer-Friendly Customization @@ -159,10 +163,10 @@ SureForms Business unlocks advanced capabilities for power users, agencies, and #### Advanced Form Types [**Conversational Forms**](https://sureforms.com/features/conversational-form/): -Chat-like forms, one question at a time, for more conversions. +Chat-like forms, one question at a time, for higher conversions and lower drop-off rates. [**Multi-step Forms**](https://sureforms.com/features/multi-step-forms/): -Bite-sized forms with progress indicators, less form fatigue for your users. +Bite-sized forms with progress indicators, reducing form fatigue and boosting completion rates. [**Quiz Forms**](https://sureforms.com/features/quiz/): Create scored quizzes and personality tests with result output and grading. @@ -170,8 +174,8 @@ Create scored quizzes and personality tests with result output and grading. [**Conditional Logic Forms**](https://sureforms.com/features/conditional-logic/): Show or hide fields, customize email notifications, and display different confirmation messages based on users' answers. -[**Calculators**](https://sureforms.com/features/calculator-form/): -Provide instant quotes or results with interactive calculators in your site. Designed to bring more traffic to your site. +[**Calculator Forms**](https://sureforms.com/features/calculator-form/): +Provide instant quotes or results with interactive calculators on your site — designed to bring more traffic and conversions. #### Pro Field Types @@ -197,7 +201,7 @@ Instantly create downloadable PDFs of form submissions for records or sharing. Let users save their progress and come back to complete the form later. [**Custom Registration & Login Forms**](https://sureforms.com/features/login-and-registration/): -Fully functional, branded Registration & Login forms for your site using just a block. +Fully functional, branded Registration and Login forms for your WordPress site using just a block. **Custom Post Type Creation**: Create WordPress posts or custom post types directly from form submissions. @@ -217,7 +221,7 @@ Customize form appearance with advanced styling options when embedding forms via #### Integrations & Automation [**Advanced Native Integrations**](https://sureforms.com/integrations/): -Connect your forms natively with top apps and services to automate workflows and save time without any third-party add-ons or plugins. +Connect your forms natively with top apps and services to automate workflows and save time — no third-party add-ons or plugins required. SureForms connects natively with: - Google Sheets @@ -264,23 +268,23 @@ Customize form appearance directly within your favorite page builder: - Bricks Builder — styling options in the Bricks panel - Elementor — styling controls in the Elementor widget -With SureForms, we are here to fix some real issues users face with WordPress Forms. That's why **300,000+ websites** have embraced SureForms for all their form related needs. +With SureForms, we are here to fix the real issues users face with WordPress forms. That's why **500,000+ websites** have embraced SureForms for all their form-related needs. ### HOW IT WORKS ❓ From installation to creating your first form, SureForms is designed to be simple and intuitive. Here is how it works: -#### Step 1: Install WordPress Plugin 🔌 +#### Step 1: Install the SureForms WordPress Plugin 🔌 From your WordPress dashboard, navigate to the Plugins menu and click on the "Add New" button. Search for the SureForms plugin, then click "Install Now" and "Activate". -#### Step 2: Build your Form ⚙️ +#### Step 2: Build Your Form with Drag and Drop ⚙️ -Once the plugin is installed, you will be redirected to the SureForms dashboard page in your WordPress dashboard. There you will find a button to create a new form. Click it to build and customize your form using the SureForms interface to suit your requirements. +Once the plugin is installed, you'll be redirected to the SureForms dashboard page in your WordPress dashboard. There you will find a button to create a new form. Click it to build and customize your form using the SureForms drag-and-drop interface to suit your requirements. -#### Step 3: Embed/Publish your Form 📄 +#### Step 3: Embed or Publish Your Form 📄 -Once your form is ready, easily embed it on any page or post using the provided shortcode or block. Or, you can use the 'Instant Form' option to make it live instantly. +Once your form is ready, easily embed it on any page or post using the provided shortcode or block. Or, you can use the 'Instant Form' option to make it live instantly with a shareable link. ### WHO CAN BENEFIT FROM SUREFORMS? @@ -334,18 +338,6 @@ Don't think this is just it. There is no limit to the types of businesses and or - Divi Builder - And many more -### BRANDING GUIDELINE - -#### SureForms® is a registered trademark. Please use the following format when mentioning SureForms anywhere: - -- SureForms \[correct\] -- Sure Forms \[incorrect\] -- Sureform \[incorrect\] -- Sureforms \[incorrect\] -- Sure forms \[incorrect\] -- SureForm \[incorrect\] -- Sure Form \[incorrect\] - ### CONNECT WITH OUR TEAM AND COMMUNITY [Join our Facebook group community](https://www.facebook.com/groups/surecart): @@ -369,140 +361,146 @@ To improve the user experience, SureForms may use the following 3rd party servic - **Stripe** -- is used for processing payment forms. [TOS](https://stripe.com/legal/ssa) and [Privacy Policy](https://stripe.com/privacy) +### BRANDING GUIDELINE + +#### SureForms® is a registered trademark. Please use the following format when mentioning SureForms anywhere: + +- SureForms \[correct\] +- Sure Forms \[incorrect\] +- Sureform \[incorrect\] +- Sureforms \[incorrect\] +- Sure forms \[incorrect\] +- SureForm \[incorrect\] +- Sure Form \[incorrect\] + == Blocks == This plugin provides 16 blocks for all users: -- **Address:** Displays a SureForms Address Field +- **Address Field:** Add a full-address input to your WordPress contact form, with line 1, line 2, city, state, postal code, and country. -- **Phone Number:** Displays a SureForms Phone Field +- **Phone Number Field:** Collect international phone numbers in your forms with built-in country code detection and validation. -- **Email:** Displays a SureForms Email Field +- **Email Field:** Add an email input to your contact form, with real-time validation and built-in spam protection. -- **Textarea:** Displays a SureForms Textarea Field +- **Textarea Field:** Capture long-form responses, comments, or messages in your WordPress forms with a resizable text area. -- **Number:** Displays a SureForms Number Field +- **Number Field:** Collect numeric input such as age, quantity, or price in your form with min, max, and step controls. -- **URL:** Displays a SureForms URL Field +- **URL Field:** Let users submit website addresses with automatic URL validation in your forms. -- **Dropdown:** Displays a SureForms Dropdown Field +- **Dropdown Field:** Add a single-select dropdown to your WordPress form, with customizable options and dynamic values. -- **Custom Button:** Displays a SureForms Custom Button +- **Custom Button Block:** Add a styled submit or action button to your SureForms layout. -- **Text:** Displays a SureForms Text Field +- **Text Field:** Add a single-line text input for short answers like names, titles, or short responses. -- **Multiple Choice:** Displays a SureForms Multiple Choice Field +- **Multiple Choice Field:** Let users pick one option from a list of radio choices in your WordPress form. -- **Checkbox:** Displays a SureForms Check Box Field +- **Checkbox Field:** Add single or multiple checkbox options to capture preferences, agreements, or selections. -- **Separator:** Displays a SureForms Separator Field +- **Separator:** Add a visual divider to organize fields and sections inside your SureForms form. -- **Heading:** Displays a SureForms Heading Field +- **Heading:** Add section headings to give your form structure and improve readability. -- **Image:** Displays a SureForms Upload Image Field +- **Image:** Display an image inside your form to add visual context, branding, or instructions. -- **Icon:** Displays a SureForms Icon Field +- **Icon:** Add an icon to your form for visual polish and brand consistency. -- **GDPR Agreement:** Displays a SureForms GDPR Agreement Field +- **GDPR Agreement Field:** Add a GDPR consent checkbox to your WordPress contact form to stay compliant with data privacy laws. == Frequently Asked Questions == += Is SureForms free? = + +Yes! SureForms is 100% free to download and use on the WordPress.org plugin directory. The free version includes the AI form builder, contact forms, payment forms via Stripe, GDPR compliance, anti-spam protection, native integrations, and 15+ form fields. Advanced features like multi-step forms, conversational forms, quizzes, surveys, file uploads, and PayPal payments are available with SureForms Business. + += How is SureForms different from other WordPress form plugins? = + +SureForms is the first AI-powered form builder built natively on the WordPress block editor. Most form plugins ship with their own proprietary builder you have to learn from scratch. SureForms uses the Gutenberg interface you already know, adds AI form generation so you can build a form from a single prompt, and includes payment forms, conditional logic, and native integrations in a clean, modern design. It's the modern alternative to legacy contact form plugins on WordPress. + += How is SureForms different from Contact Form 7? = + +Contact Form 7 is a long-trusted plugin, but it relies on shortcodes and requires manual HTML for advanced layouts. SureForms is fully visual, drag-and-drop, mobile-first, and includes payment forms, AI form generation, conditional logic, and design controls out of the box — without needing add-ons. If you're upgrading from Contact Form 7, SureForms gives you a modern WordPress form-building experience without the technical setup. + += Does SureForms work with Elementor, Bricks, and Divi? = + +Yes. SureForms works seamlessly with Elementor, Bricks Builder, Divi Builder, Beaver Builder, and any other major WordPress page builder. SureForms Business also adds dedicated styling controls inside the Elementor widget and the Bricks element so you can match your form's appearance to your site's design without writing CSS. + = Do I need coding skills to create forms using SureForms? = **No coding needed!** -With SureForms' visual block builder, you can drag and drop Gutenberg -blocks to create beautiful, responsive forms. Perfect for small business -owners, freelancers, or anyone who wants forms without technical skills. +With SureForms' visual block builder, you can drag and drop Gutenberg blocks to create beautiful, responsive WordPress forms. Perfect for small business owners, freelancers, designers, or anyone who wants forms without technical skills. = What are the requirements to use SureForms? = -You just need the latest version of WordPress and a theme. SureForms -installs like any other plugin and is ready to use. +You just need the latest version of WordPress and any theme. SureForms installs like any other plugin and is ready to use within seconds. -= Can I use the SureForms along with a Page Builder? = += Can I use SureForms along with a Page Builder? = -SureForms only requires the latest WordPress version and works -seamlessly with all major page builders without interference. +Yes. SureForms only requires the latest WordPress version and works seamlessly with all major page builders — Elementor, Bricks, Divi, Beaver Builder, and more — without interference. -Should you need help, you can [get in touch with -us.](https://support.brainstormforce.com/?utm_source=wp-repo&utm_medium=link&utm_campaign=readme) +Should you need help, you can [get in touch with us.](https://support.brainstormforce.com/?utm_source=wp-repo&utm_medium=link&utm_campaign=readme) -= Will the SureForms slow down my website? = += Will SureForms slow down my website? = -Absolutely not! SureForms is lightweight and fast, built with clean -code and modular architecture to ensure it never slows down your -website. +Absolutely not. SureForms is lightweight and fast, built with clean code and modular architecture to ensure it never slows down your WordPress site. -= Can I use the SureForms on client websites? = += Can I use SureForms on client websites? = -Yes! You can certainly use SureForms on your own as well as your -client's websites. +Yes. You can use SureForms on your own sites as well as on your clients' websites — no licensing restrictions on the free version. -= What more do I get with the SureForms? = += What more do I get with SureForms? = -When you use SureForms, you get a huge library of ready-to-use form -templates that can be used to build your forms fast. +When you use SureForms, you get a huge library of ready-to-use form templates that can be used to build your forms fast — contact forms, payment forms, lead generation forms, registration forms, and many more. -= Does SureForms support Multi-step Forms or Conversational Forms? += Does SureForms support Multi-step Forms or Conversational Forms? = -Yes. You can easily create Multi-step Forms as well as Conversational -Forms to improve user experience and conversion rates with SureForms Business -plans. +Yes. You can easily create Multi-step Forms as well as Conversational Forms to improve user experience and conversion rates with SureForms Business plans. = Can I create quiz forms with SureForms? = -Yes! SureForms Business includes a Quiz module. You can create scored quizzes with grading and personality tests with result output — all with the same drag-and-drop builder. +Yes. SureForms Business includes a Quiz module. You can create scored quizzes with grading and personality tests with result output — all with the same drag-and-drop builder. = Does SureForms support file uploads? = -Yes! With SureForms Business, you can add file upload fields to your forms. It supports multi-file uploads, file type restrictions, and role-based access control for uploaded files. +Yes. With SureForms Business, you can add file upload fields to your forms. It supports multi-file uploads, file type restrictions, and role-based access control for uploaded files. = What integrations does SureForms support? = -SureForms Business connects natively with services including Google Sheets, Mailchimp, HubSpot, ActiveCampaign, Klaviyo, Zoho CRM, Notion, and many more. You can also use Zapier to connect with 5,000+ additional apps, or use webhooks to send data to any API endpoint. +SureForms connects natively with services including Google Sheets, Mailchimp, HubSpot, ActiveCampaign, Klaviyo, FluentCRM, Zoho CRM, Notion, and many more. You can also use Zapier to connect with 5,000+ additional apps, or use webhooks to send data to any API endpoint. = Does SureForms support Payment Forms? = -Yes! SureForms has built-in Payment Form support. -You can collect payments securely through Stripe in the free version. PayPal payments are available with SureForms Business. No add-ons or extra plugins needed. +Yes. SureForms has built-in Payment Form support. You can collect payments securely through Stripe in the free version. PayPal payments are available with SureForms Business. No add-ons or extra plugins needed. == Screenshot == -1. SureForms Dashboard -2. Start building your forms within minutes using SureForms. You can build a form from scratch or choose AI to build one for you. -3. Build forms instantly with just a prompt. AI creates your forms with smart field suggestions. Then add, remove, or rearrange fields as you need. -4. Beautify your forms with Instant Form Styling and a wide range of Block and Form Settings to customize every detail. -5. Lastly, publish your forms instantly or easily embed forms in any pages with SureForms' native block. +1. SureForms dashboard — manage all your WordPress forms in one place with form analytics, entries, and quick actions. +2. Start building your forms within minutes using SureForms. Build a form from scratch with drag and drop, or let AI generate one for you from a simple prompt. +3. AI form builder for WordPress — describe the form you need and SureForms creates it instantly with smart field suggestions. Add, remove, or rearrange fields as you need. +4. Beautify your forms with Instant Form Styling and a wide range of Block and Form Settings — customize colors, typography, spacing, and every visual detail. +5. Publish your forms instantly with a shareable Instant Form link, or easily embed forms in any page or post using SureForms' native Gutenberg block. -You can report the issue through our [Bug Bounty Program](https://brainstormforce.com/bug-bounty-program/). We collaborate with Patchstack to provide opportunities for researchers to report vulnerabilities. The Patchstack team will help validate, triage, and handle any reported security issues. +You can report security issues through our [Bug Bounty Program](https://brainstormforce.com/bug-bounty-program/). We collaborate with Patchstack to provide opportunities for researchers to report vulnerabilities. The Patchstack team will help validate, triage, and handle any reported security issues. == Changelog == -= 2.8.2 - 5th May 2026 = -* New: Added "Both" payment type so a single form can collect one-time and subscription payments together. -* New: Added Hidden field support for the payment block's dynamic amount. -* New: Added minimum character limit support for the Textarea field. -* Improvement: Added extension hooks for windowed entry caps in form restriction. -* Fix: Fixed AI Form Builder silent failures and replaced generic error messages with clearer feedback. -* Fix: Resolved an issue where the Confirm Email field could silently block form submission when the Email field was not marked as required. -= 2.8.1 - 27th April 2026 = -* New: Added support for dynamic default values on Dropdown and Multi-Choice fields. -* New: Added {entry_id} smart tag for use in email templates, confirmations, and dynamic content. -* Improvement: Added PLN (Polish Złoty) to the currency dropdown. -* Fix: Fixed background color not applying correctly in non-iframe editor mode. -* Fix: Fixed MCP endpoint REST URL resolution so it uses the correct site URL. -* Fix: Fixed Phone field country flag unexpectedly changing during browser autocomplete. -* Fix: Fixed review/validation issues in Global Settings. -= 2.8.0 - 16th April 2026 = -* New: Added My Account page allowing users to view and manage their payment history and subscriptions. -* Improvement: Phone number country detection moved to backend with caching, reducing multiple API calls. -* Fix: Fixed payment method radio button display issue when both Stripe and PayPal gateways are enabled. -* Fix: Fixed crash when saving a form containing the Register block. -* Fix: Fixed inability to deselect a preselected option in single-selection controls (radio, dropdown) within the editor. -* Fix: Fixed Quill rich text editor toolbar strings not being translatable. += 2.10.1 - 1st June 2026 = +* Improvement: Improved compatibility with older Block API versions so the SureForms editor loads reliably across WordPress environments. +* Fix: Resolved an issue where the Textarea character counter was misaligned. +* Fix: Resolved an issue where the {entry_id} smart tag failed to resolve in email notifications. += 2.10.0 - 27th May 2026 = +* New: Added a live character counter to Textarea fields. +* New: Added a one-click converter that turns raw HTML forms into native SureForms in gutenberg editor. +* Improvement: Added dynamic default value support for multi-select Dropdown and Multi-Choice fields. +* Improvement: Entry URL now records actual submission page. +* Fix: CSV export was stripping line breaks from Textarea submissions. += 2.9.1 - 19th May 2026 = +* Improvement: Added compatibility with WordPress 7.0. The full changelog is available [here](https://sureforms.com/whats-new/). == Upgrade Notice == = 0.0.13 = -From version 0.0.13 we're migrating to a custom database to enhance SureForms' performance and features. This step is necessary and irreversible and your current existing entries will be lost. Thank you for your understanding! +From version 0.0.13 we're migrating to a custom database to enhance SureForms' performance and features. This step is necessary and irreversible and your current existing entries will be lost. Thank you for your understanding! \ No newline at end of file diff --git a/sass/backend/admin.scss b/sass/backend/admin.scss index 6ffae062a..8c26f55fc 100644 --- a/sass/backend/admin.scss +++ b/sass/backend/admin.scss @@ -337,6 +337,8 @@ $placeholder_color: #9ca3af; .sureforms_page_sureforms_entries, .sureforms_page_sureforms_payments, .sureforms_page_sureforms_quiz_entries, +.sureforms_page_sureforms_survey_reports, +.sureforms_page_sureforms_partial_entries, .sureforms_page_sureforms_learn { #wpcontent { padding: 0; diff --git a/sass/backend/editor.scss b/sass/backend/editor.scss index 293c94669..507b2374d 100644 --- a/sass/backend/editor.scss +++ b/sass/backend/editor.scss @@ -253,6 +253,10 @@ body.post-type-sureforms_form { .srfm-single-form-settings-description { border-top: none !important; + + .block-editor-block-card { + display: flex; + } } .block-editor-inner-blocks { @@ -454,7 +458,7 @@ body.post-type-sureforms_form { .editor-header__center { // styles added to make title bar compatible if block toolbar settings are moved in the header display: flex; - align-items: stretch; + align-items: center; justify-content: center; gap: 0; min-width: 0; @@ -467,7 +471,7 @@ body.post-type-sureforms_form { max-width: 500px; .components-base-control__field { - margin-top: 0; + margin: 0; } } diff --git a/sass/blocks/default/components/common.scss b/sass/blocks/default/components/common.scss index dfeaed9d9..b1da611f7 100644 --- a/sass/blocks/default/components/common.scss +++ b/sass/blocks/default/components/common.scss @@ -100,6 +100,24 @@ } } + .srfm-char-counter-wrap { + float: right; + margin-left: 8px; + + .srfm-char-counter { + font-size: var( --srfm-error-font-size ); + font-weight: var( --srfm-error-font-weight ); + line-height: var( --srfm-error-line-height ); + color: var( --srfm-color-input-text ); + opacity: 0.65; + + &.srfm-char-counter--error { + color: var( --srfm-error-color ); + opacity: 1; + } + } + } + .srfm-error-wrap { .srfm-error-message { @include srfm-error-styles; diff --git a/sass/blocks/default/components/textarea.scss b/sass/blocks/default/components/textarea.scss index 2b5cb345d..7e63b0949 100644 --- a/sass/blocks/default/components/textarea.scss +++ b/sass/blocks/default/components/textarea.scss @@ -2,6 +2,37 @@ .srfm-form-container { .srfm-form { .srfm-textarea-block { + .srfm-error-wrap { + display: flex; + align-items: center; + gap: 8px; + + .srfm-char-counter-wrap { + // Right-align the counter via margin-left:auto, not justify-content:space-between. + // The error message is the only other flex child and stays display:none until a + // validation error fires, so space-between would leave the counter (the lone visible + // child) pinned to the left — the very bug this block is meant to fix. + margin-left: auto; + flex-shrink: 0; + // Reset the inherited theme line-height so the wrap matches the fixed-height + // .srfm-error-wrap and the counter is not vertically clipped. + line-height: var( --srfm-error-line-height ); + + .srfm-char-counter { + font-size: var( --srfm-error-font-size ); + font-weight: var( --srfm-error-font-weight ); + line-height: var( --srfm-error-line-height ); + color: var( --srfm-color-input-text ); + opacity: 0.65; + + &.srfm-char-counter--error { + color: var( --srfm-error-color ); + opacity: 1; + } + } + } + } + .srfm-block-wrap { line-height: 0; .srfm-input-textarea { diff --git a/src/admin/PartialEntriesEmptyState.js b/src/admin/PartialEntriesEmptyState.js new file mode 100644 index 000000000..09834fd7a --- /dev/null +++ b/src/admin/PartialEntriesEmptyState.js @@ -0,0 +1,155 @@ +/** + * Partial Entries Empty State page component for free users. + * + * Mirrors the SurveyEmptyState layout with the shared dashboard Header + * so the page feels like a first-class admin screen. + * + * @since x.x.x + */ + +import { createRoot } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { Container, Button, Text } from '@bsf/force-ui'; +import { ArrowUpRight } from 'lucide-react'; +import { addQueryParam } from '@Utils/Helpers'; +import Header from '@Admin/components/Header'; +import QuizPlaceholder from '@Image/quiz-no-entries-placeholder.svg'; +import './tw-base.scss'; + +const features = [ + __( + 'Capture in-progress form data the moment visitors stop typing — no submit required', + 'sureforms' + ), + __( + 'Recover abandoned submissions and follow up with prospects you would otherwise lose', + 'sureforms' + ), + __( + 'Let visitors pick up where they left off with secure, shareable resume links', + 'sureforms' + ), +]; + +const PartialEntriesEmptyState = () => { + const baseUrl = + window.srfm_admin?.pricing_page_url || + window.srfm_admin?.sureforms_pricing_page || + 'https://sureforms.com/pricing/'; + const pricingUrl = addQueryParam( baseUrl, 'partial-entries-upgrade-cta' ); + + return ( + <> +
+
+
+
+ + + +
+ { +
+
+ + { __( + 'Stop Losing Leads to Abandoned Forms', + 'sureforms' + ) } + +
+ + { __( + 'See what visitors typed before they walked away. Upgrade to SureForms Premium to unlock Partial Entries:', + 'sureforms' + ) } + +
    + { features.map( ( point, index ) => ( +
  • + + { point } + +
  • + ) ) } +
+
+ +
+
+
+
+
+ + ); +}; + +// Render the PartialEntriesEmptyState component when the DOM is ready. +document.addEventListener( 'DOMContentLoaded', () => { + const container = document.getElementById( + 'srfm-partial-entries-empty-state-root' + ); + if ( container ) { + const root = createRoot( container ); + root.render( ); + } +} ); + +export default PartialEntriesEmptyState; diff --git a/src/admin/components/Header.js b/src/admin/components/Header.js index f76051557..a3d04752e 100644 --- a/src/admin/components/Header.js +++ b/src/admin/components/Header.js @@ -56,7 +56,7 @@ const HeaderTooltipItem = ( { title, icon, onClick, children } ) => ( title={ title } placement="bottom" className="z-999999" - portalId="srfm-dashboard-container" + portalId="srfm-dashboard-container-tooltip" variant="dark" > { children ? ( diff --git a/src/admin/components/PageTitleSection.js b/src/admin/components/PageTitleSection.js index 683763868..65f9902e2 100644 --- a/src/admin/components/PageTitleSection.js +++ b/src/admin/components/PageTitleSection.js @@ -1,50 +1,93 @@ import { Button, Title } from '@bsf/force-ui'; import { __ } from '@wordpress/i18n'; import { applyFilters } from '@wordpress/hooks'; +import { LoaderCircle, Save } from 'lucide-react'; -const PageTitleSection = ( { title, hidePageTitle, helpText } ) => { +const PageTitleSection = ( { + title, + hidePageTitle, + helpText, + onSave, + isDirty = false, + isSaving = false, +} ) => { if ( ! title ) { return null; } - const getCurrentPage = () => { + // Returns both the tab slug and the compound `tab/subpage` slug so + // the exclusion list below can target either an entire tab or one + // specific sub-tab (e.g. only `payments-settings/payment-methods` + // without affecting `payments-settings/general`). + const getCurrentPageSlugs = () => { try { const searchParams = new URLSearchParams( window.location.search ); - return searchParams.get( 'tab' ); + const tab = searchParams.get( 'tab' ) || ''; + const subpage = searchParams.get( 'subpage' ) || ''; + return subpage ? [ tab, `${ tab }/${ subpage }` ] : [ tab ]; } catch ( error ) { - return ''; + return []; } }; + // Tabs in this list have no Save semantics at the page level — either + // they don't persist anything (OttoKit) or they manage their own save UX + // inside the page (Integrations drawer per-row, License action buttons, + // Payment Methods per-gateway Connect/Save inside each Stripe / PayPal + // panel). The header Save button is hidden for them. Tabs that register + // a save adapter via `useGlobalSettingsTabSaveAdapter` (e.g. Google + // Maps, User Registration) DO show the header button — `Component.js` + // routes it to the registered handler. + // Entries may be either a top-level `tab` slug or a compound + // `tab/subpage` slug for sub-tab-scoped exclusion. const exclusionList = applyFilters( 'srfm.settings.exclusionList', [ 'account-settings', 'integration-settings', - 'general-settings', - 'validation-settings', - 'security-settings', 'ottokit-settings', - 'google-maps-settings', - 'payments-settings', - 'mcp-settings', + 'payments-settings/payment-methods', ] ); + const currentSlugs = getCurrentPageSlugs(); + const showSaveButton = ! exclusionList.some( ( slug ) => + currentSlugs.includes( slug ) + ); + return ( // Do not render the title section if hidePageTitle is true. ! hidePageTitle && ( -
- - { ! exclusionList.includes( getCurrentPage() ) && ( - <Button>{ __( 'Save', 'sureforms' ) }</Button> - ) } - { helpText && ( - <span className="text-[14px] text-[#6B7280] leading-5"> - { helpText } - </span> + <div className="max-w-content-container mx-auto flex justify-between items-center mb-6 gap-3"> + <div className="flex flex-col gap-1"> + <Title + tag="h4" + className="inline-block" + title={ title } + size="md" + /> + { helpText && ( + <span className="text-[14px] text-[#6B7280] leading-5"> + { helpText } + </span> + ) } + </div> + { showSaveButton && ( + <Button + size="md" + variant="primary" + onClick={ onSave } + disabled={ ! isDirty || isSaving } + iconPosition="left" + icon={ + isSaving ? ( + <LoaderCircle className="animate-spin size-4" /> + ) : ( + <Save /> + ) + } + > + { isSaving + ? __( 'Saving…', 'sureforms' ) + : __( 'Save', 'sureforms' ) } + </Button> ) } </div> ) diff --git a/src/admin/entries/components/SubmissionInfoSection.js b/src/admin/entries/components/SubmissionInfoSection.js index 2a7172b45..419feb408 100644 --- a/src/admin/entries/components/SubmissionInfoSection.js +++ b/src/admin/entries/components/SubmissionInfoSection.js @@ -34,20 +34,32 @@ const SubmissionInfoSection = ( { entryData } ) => { }, { id: 'url', + // Prefer the actual submission page URL (where the form was filled in). + // Fall back to the form CPT permalink for entries created before this + // field was captured (pre-migration), and to '-' if neither is present. label: __( 'URL:', 'sureforms' ), - value: entryData?.formPermalink || '-', - render: ( val ) => ( - <Button - variant="link" - tag="a" - href={ val } - className="no-underline hover:underline" - target="_blank" - rel="noopener noreferrer" - > - { val } - </Button> - ), + value: + entryData?.submissionInfo?.submissionUrl || + entryData?.formPermalink || + '-', + // Defense-in-depth: only render as a clickable link when the value + // looks like an http(s) URL. Server side already enforces this, but + // React's `href={val}` does not block exotic schemes on its own. + render: ( val ) => + typeof val === 'string' && /^https?:\/\//i.test( val ) ? ( + <Button + variant="link" + tag="a" + href={ val } + className="no-underline hover:underline" + target="_blank" + rel="noopener noreferrer" + > + { val } + </Button> + ) : ( + val + ), }, { id: 'browser', @@ -82,7 +94,7 @@ const SubmissionInfoSection = ( { entryData } ) => { { id: 'status', label: __( 'Status:', 'sureforms' ), - value: entryData.status.toLowerCase(), + value: entryData?.status ? entryData.status.toLowerCase() : '-', render: ( val ) => val.charAt( 0 ).toUpperCase() + val.slice( 1 ), }, { diff --git a/src/admin/entries/utils/entryHelpers.js b/src/admin/entries/utils/entryHelpers.js index 0fd10050b..78aab709e 100644 --- a/src/admin/entries/utils/entryHelpers.js +++ b/src/admin/entries/utils/entryHelpers.js @@ -59,12 +59,16 @@ export const getFirstFieldValue = ( formData ) => { }; /** - * Format date and time for display + * Format date and time for the entries list display. + * + * Named distinctly from `formatDateTime` in `@Utils/Helpers` (which takes a + * second `submissionInfo` flag and can return a `{ shortFormat, fullFormat }` + * object) to avoid a same-name/different-signature import mix-up. * * @param {string} dateString - The date string from API (e.g., "2025-10-07 15:54:49") * @return {string} Formatted date time */ -export const formatDateTime = ( dateString ) => { +export const formatEntryListDate = ( dateString ) => { if ( ! dateString ) { return '-'; } @@ -103,7 +107,7 @@ export const transformEntry = ( entry, formsMap = {} ) => { status: entry.status, statusLabel: getStatusLabel( entry.status ), firstField: getFirstFieldValue( entry.form_data ), - dateTime: formatDateTime( entry.created_at ), + dateTime: formatEntryListDate( entry.created_at ), rawData: entry, // Keep original data for reference }; }; @@ -133,6 +137,10 @@ export const transformEntryDetail = ( entryDetail ) => { userIp: entryDetail.submission_info?.user_ip || '-', browserName: entryDetail.submission_info?.browser_name || '-', deviceName: entryDetail.submission_info?.device_name || '-', + // Use '' (not '-') so SubmissionInfoSection's `|| formPermalink || '-'` + // fallback chain works for pre-migration entries and for entries where + // the Referer header was missing/cross-origin at submission time. + submissionUrl: entryDetail.submission_info?.submission_url || '', }, user: entryDetail.user ? { diff --git a/src/admin/forms/FormsListingPage.js b/src/admin/forms/FormsListingPage.js index 37747f80b..dd9f8c54a 100644 --- a/src/admin/forms/FormsListingPage.js +++ b/src/admin/forms/FormsListingPage.js @@ -343,6 +343,38 @@ const FormsListingPage = () => { } ); }; + const handleBulkDraft = () => { + setConfirmDialog( { + open: true, + title: _n( + 'Switch form to draft?', + 'Switch forms to draft?', + selectedForms.length, + 'sureforms' + ), + description: sprintf( + /* translators: %d: number of forms */ + _n( + '%d form will be switched to draft and will no longer be publicly accessible.', + '%d forms will be switched to draft and will no longer be publicly accessible.', + selectedForms.length, + 'sureforms' + ), + selectedForms.length + ), + action: async () => { + await new Promise( ( resolve ) => { + handleBulkAction( 'draft', selectedForms ); + resolve(); + } ); + setConfirmDialog( ( prev ) => ( { ...prev, open: false } ) ); + }, + confirmButtonText: __( 'Switch to Draft', 'sureforms' ), + destructive: false, + requireConfirmation: false, + } ); + }; + // Individual form actions const handleFormEdit = ( form ) => { window.location.href = form.edit_url; @@ -369,6 +401,27 @@ const FormsListingPage = () => { } ); }; + const handleFormDraft = ( form ) => { + setConfirmDialog( { + open: true, + title: __( 'Switch form to draft?', 'sureforms' ), + description: __( + 'This form will be switched to draft and will no longer be publicly accessible.', + 'sureforms' + ), + action: async () => { + await new Promise( ( resolve ) => { + handleBulkAction( 'draft', [ form.id ] ); + resolve(); + } ); + setConfirmDialog( ( prev ) => ( { ...prev, open: false } ) ); + }, + confirmButtonText: __( 'Switch to Draft', 'sureforms' ), + destructive: false, + requireConfirmation: false, + } ); + }; + const handleFormRestore = ( form ) => { handleBulkAction( 'restore', [ form.id ] ); }; @@ -527,6 +580,7 @@ const FormsListingPage = () => { onBulkDelete={ handleBulkDelete } onBulkExport={ handleBulkExport } onBulkRestore={ handleBulkRestore } + onBulkDraft={ handleBulkDraft } onImportSuccess={ handleImportSuccess } statusFilter={ statusFilter } onStatusFilterChange={ handleStatusFilter } @@ -556,6 +610,7 @@ const FormsListingPage = () => { onEdit={ handleFormEdit } onTrash={ handleFormTrash } onRestore={ handleFormRestore } + onDraft={ handleFormDraft } onDelete={ handleFormDelete } onDuplicate={ handleFormDuplicate } isLoading={ isLoading } diff --git a/src/admin/forms/components/FormsFilters.js b/src/admin/forms/components/FormsFilters.js index 082bdaa2e..308d31df5 100644 --- a/src/admin/forms/components/FormsFilters.js +++ b/src/admin/forms/components/FormsFilters.js @@ -7,6 +7,7 @@ import { Search, X, RotateCcw, + FilePen, } from 'lucide-react'; import { Input, Button, Container, Select } from '@bsf/force-ui'; import DatePicker from '@Admin/components/DatePicker'; @@ -22,6 +23,7 @@ const FormsFilters = ( { onBulkExport, onBulkRestore, onBulkDelete, + onBulkDraft, statusFilter, onStatusFilterChange, selectedDates = { from: null, to: null }, @@ -128,6 +130,19 @@ const FormsFilters = ( { </Button> </Container.Item> ) } + { statusFilter !== 'trash' && statusFilter !== 'draft' && ( + <Container.Item> + <Button + variant="outline" + size="sm" + icon={ <FilePen className="w-4 h-4" /> } + iconPosition="left" + onClick={ onBulkDraft } + > + { __( 'Switch to Draft', 'sureforms' ) } + </Button> + </Container.Item> + ) } { statusFilter === 'trash' ? ( <Container.Item> <Button diff --git a/src/admin/forms/components/FormsHeader.js b/src/admin/forms/components/FormsHeader.js index 1df418323..ed586fe04 100644 --- a/src/admin/forms/components/FormsHeader.js +++ b/src/admin/forms/components/FormsHeader.js @@ -12,6 +12,7 @@ const FormsHeader = ( { onBulkExport, onBulkRestore, onBulkDelete, + onBulkDraft, onImportSuccess, statusFilter, onStatusFilterChange, @@ -63,6 +64,7 @@ const FormsHeader = ( { onBulkExport={ onBulkExport } onBulkRestore={ onBulkRestore } onBulkDelete={ onBulkDelete } + onBulkDraft={ onBulkDraft } onImportSuccess={ onImportSuccess } statusFilter={ statusFilter } onStatusFilterChange={ onStatusFilterChange } diff --git a/src/admin/forms/components/FormsTable.js b/src/admin/forms/components/FormsTable.js index 2ec08eef7..fad44a06e 100644 --- a/src/admin/forms/components/FormsTable.js +++ b/src/admin/forms/components/FormsTable.js @@ -1,6 +1,6 @@ import { __ } from '@wordpress/i18n'; import { useState } from '@wordpress/element'; -import { Edit3, Trash, RotateCcw, Eye, Share, Copy, Check } from 'lucide-react'; +import { Edit3, Trash, RotateCcw, Eye, Share, Copy, Check, FilePen } from 'lucide-react'; import { Button, Container, Badge, Text, Tooltip } from '@bsf/force-ui'; import Table from '@Admin/common/listing/components/Table'; import { exportForms } from '../utils'; @@ -44,6 +44,7 @@ const FormsTable = ( { onRestore, onDelete, onDuplicate, + onDraft, paginationProps, } ) => { // State to track which shortcode was recently copied @@ -246,6 +247,16 @@ const FormsTable = ( { onClick: () => onDuplicate?.( form ), } ); + // Switch to Draft action (only for published forms) + if ( form.status === 'publish' ) { + actions.push( { + key: 'draft', + label: __( 'Switch to Draft', 'sureforms' ), + icon: <FilePen className="size-4" />, + onClick: () => onDraft?.( form ), + } ); + } + // Delete action actions.push( { key: 'delete', diff --git a/src/admin/forms/hooks/useFormsQuery.js b/src/admin/forms/hooks/useFormsQuery.js index ad99c63fc..704e41bd0 100644 --- a/src/admin/forms/hooks/useFormsQuery.js +++ b/src/admin/forms/hooks/useFormsQuery.js @@ -102,6 +102,18 @@ export const useBulkFormsAction = () => { count ); break; + case 'draft': + message = sprintf( + /* translators: %d: number of forms */ + _n( + '%d form switched to draft.', + '%d forms switched to draft.', + count, + 'sureforms' + ), + count + ); + break; } if ( message ) { diff --git a/src/admin/html-form-detector/index.js b/src/admin/html-form-detector/index.js new file mode 100644 index 000000000..b7c831416 --- /dev/null +++ b/src/admin/html-form-detector/index.js @@ -0,0 +1,363 @@ +/** + * SureForms — HTML Form Detector. + * + * Adds a "Convert to SureForms" toolbar button to every `core/html` + * block whose content contains a `<form>` element. Clicking the button + * posts the parsed schema (or the raw HTML when local parsing was + * low-confidence) to the `sureforms/v1/convert-html-form` REST + * endpoint, which creates the SureForms form and returns a shortcode. + * The source `core/html` block is then replaced with a `core/shortcode` + * block holding `[sureforms id="X"]`. + * + * Why a per-block toolbar button instead of a global editor notice: + * a page can hold any number of raw HTML forms (contact + newsletter + + * footer subscribe, etc.). A single banner cannot disambiguate which + * block it acts on. Mounting the affordance on the block itself — + * exactly where the user is editing the form — also makes it + * discoverable in context: the user does not have to scroll up to a + * banner to invoke the action. Each `core/html` instance gets its own + * toolbar item independently, so the N-forms case is handled by the + * block editor's own per-block render lifecycle without any + * reconciliation logic on our side. + */ + +import apiFetch from '@wordpress/api-fetch'; +import { BlockControls } from '@wordpress/block-editor'; +import { createBlock } from '@wordpress/blocks'; +import { ToolbarButton, ToolbarGroup } from '@wordpress/components'; +import { createHigherOrderComponent } from '@wordpress/compose'; +import { dispatch, select } from '@wordpress/data'; +import { Fragment, useEffect, useMemo, useState } from '@wordpress/element'; +import { addFilter } from '@wordpress/hooks'; +import { __, sprintf } from '@wordpress/i18n'; + +// The SureForms brand logomark — the same component registered as the +// `srfm/form` block icon (see `src/blocks/sureforms-form/index.js`). +// Reusing it keeps the toolbar affordance visually consistent with the +// block inserter entry users already associate with SureForms. +import SureFormsIcon from '@Image/Logo.js'; + +import { parseFormHtml } from './parse.js'; + +const HTML_BLOCK_NAME = 'core/html'; +const SHORTCODE_BLOCK_NAME = 'core/shortcode'; +const CORE_BLOCK_EDITOR = 'core/block-editor'; +const CORE_NOTICES = 'core/notices'; +const CONVERT_REST_PATH = '/sureforms/v1/convert-html-form'; +const FILTER_NAMESPACE = 'sureforms/html-form-detector'; + +/** + * Build a sensible default title for the converted form. Falls back to + * the current post title when there is nothing better — we deliberately + * avoid scraping the page's `<h1>` because that is often the page's + * hero copy, not the form's purpose. + * + * @return {string} Form title for the created `sureforms_form` CPT. + */ +function deriveFormTitle() { + const postTitle = + select( 'core/editor' )?.getEditedPostAttribute?.( 'title' ) ?? ''; + const trimmed = typeof postTitle === 'string' ? postTitle.trim() : ''; + if ( trimmed ) { + return sprintf( + // translators: %s = the page/post title where the form was detected. + __( '%s — Converted form', 'sureforms' ), + trimmed + ); + } + return __( 'Converted form', 'sureforms' ); +} + +/** + * POST the parsed schema (and raw HTML for the AI fallback path) to + * the conversion endpoint, swap the source `core/html` block for a + * `core/shortcode` block, and surface a success/error snackbar. + * + * Failure-mode: we leave the original `core/html` block intact on any + * error so the user can either retry or build the form manually — + * losing the source markup just because the API hiccupped would be a + * bad trade. + * + * @param {string} clientId Block clientId being converted. + * @param {string} content Raw HTML content of the block. + * @param {Object} parsed Result of `parseFormHtml( content )`. + * @return {Promise<boolean>} Resolves true on a successful conversion. + */ +async function convertBlock( clientId, content, parsed ) { + const noticesDispatch = dispatch( CORE_NOTICES ); + + const restNonce = window.srfm_html_form_detector?.rest_nonce; + + // Fail fast when the localized nonce is missing — without it the + // request would just bounce off the server's `wp_verify_nonce` + // check and surface as a confusing 403 snackbar. A focused + // message tells the user exactly what to do. + if ( ! restNonce ) { + noticesDispatch.createErrorNotice( + __( + 'SureForms could not authenticate this request. Please reload the editor and try again.', + 'sureforms' + ), + { type: 'snackbar' } + ); + return false; + } + + const blockEditorDispatch = dispatch( CORE_BLOCK_EDITOR ); + + try { + const response = await apiFetch( { + path: CONVERT_REST_PATH, + method: 'POST', + headers: { 'X-WP-Nonce': restNonce }, + data: { + parsed_fields: parsed.fields, + submit_text: parsed.submitText, + styling: parsed.styling || {}, + confidence: parsed.confidence, + html: content, + form_title: deriveFormTitle(), + }, + } ); + + const formId = Number( response?.form_id ?? 0 ); + const shortcode = + typeof response?.shortcode === 'string' ? response.shortcode : ''; + + if ( ! formId || ! shortcode ) { + // Throw an Error rather than a plain object so the rejection + // carries a stack trace (useful in editor console traces), + // satisfies `eslint(no-throw-literal)`, and still surfaces + // `code` through the catch block below alongside any other + // REST rejection. + const badPayload = new Error( + 'SureForms convert endpoint returned an unexpected payload.' + ); + badPayload.code = 'srfm_html_convert_bad_payload'; + throw badPayload; + } + + const shortcodeBlock = createBlock( SHORTCODE_BLOCK_NAME, { + text: shortcode, + } ); + + // Use the server-computed preserved markup ONLY. The server + // runs `wp_kses_post` on the remnant for users without the + // `unfiltered_html` cap, so multisite site admins (who have + // `manage_options` but not `unfiltered_html`) can't smuggle + // `<script>` / `<iframe>` markup into the new `core/html` + // block by hiding it behind the source `<form>`. + // + // No client-side fallback to `stripFormFromHtml(content)` here + // because the client has no equivalent cap-gated sanitizer — + // dropping back to it on a proxy-stripped response would let + // the un-sanitized branch run in production. When the server + // omits `preserved_html` we treat it as "nothing surrounding" + // and fall through to the one-block swap path below; the user + // loses the wrapper markup but never gets a stored-XSS path + // they couldn't already reach via a `core/html` block. + const surroundingHtml = + typeof response?.preserved_html === 'string' + ? response.preserved_html + : ''; + + // When the source `core/html` block held nothing but the `<form>` + // (and optional whitespace), the historical behavior is correct: + // swap one block for one block. When the block contained other + // markup — a wrapping `<div>`, a heading above the form, a + // post-submit message below it, an inline `<script>` — replacing + // the whole block would silently delete that markup. Keep it as + // a separate `core/html` block and put the shortcode after it + // so the user does not lose context they almost certainly meant + // to keep alongside the form. + if ( surroundingHtml ) { + const preservedBlock = createBlock( HTML_BLOCK_NAME, { + content: surroundingHtml, + } ); + blockEditorDispatch.replaceBlock( clientId, [ + preservedBlock, + shortcodeBlock, + ] ); + } else { + blockEditorDispatch.replaceBlock( clientId, shortcodeBlock ); + } + + noticesDispatch.createSuccessNotice( + response?.used_ai + ? __( 'Form converted to SureForms using AI. Review the new form for any tweaks.', 'sureforms' ) + : __( 'Form converted to SureForms.', 'sureforms' ), + { type: 'snackbar' } + ); + return true; + } catch ( error ) { + noticesDispatch.createErrorNotice( errorMessageForCode( error?.code ), { + type: 'snackbar', + } ); + return false; + } +} + +/** + * Map a known REST error code to a user-facing translated string. + * + * Why we whitelist by `code` rather than forwarding `error.message` + * verbatim: `apiFetch` rejections can contain raw server messages + * (DB error fragments, file paths from misconfigured plugins, etc.). + * Surfacing those in a snackbar to the editor is both ugly and a + * small info-leak vector. Everything outside the known set collapses + * to a generic message; the precise cause is still logged server-side. + * + * @param {string|undefined} code REST error code returned by the endpoint. + * @return {string} Translated message safe to display. + */ +function errorMessageForCode( code ) { + switch ( code ) { + case 'srfm_html_convert_nonce_failed': + case 'rest_cookie_invalid_nonce': + return __( + 'SureForms could not authenticate this request. Please reload the editor and try again.', + 'sureforms' + ); + case 'srfm_html_convert_forbidden': + case 'rest_forbidden': + return __( + 'You do not have permission to convert this form.', + 'sureforms' + ); + case 'srfm_html_convert_too_large': + return __( + 'This form is too large to convert. Try simplifying the markup or building the form manually.', + 'sureforms' + ); + case 'srfm_html_convert_no_fields': + return __( + 'SureForms could not derive any fields from this form.', + 'sureforms' + ); + case 'srfm_html_convert_ai_failed': + case 'srfm_html_convert_ai_empty': + return __( + 'The SureForms AI service could not process this form. Please try again or build the form manually.', + 'sureforms' + ); + case 'srfm_html_convert_bad_payload': + return __( + 'SureForms received an unexpected response. Please try again.', + 'sureforms' + ); + default: + return __( + 'Could not convert this form to SureForms. Please try again.', + 'sureforms' + ); + } +} + +/** + * Higher-order component that adds a "Convert to SureForms" toolbar + * button to every `core/html` block that contains a `<form>` element. + * + * The HOC is mounted once per block instance by Gutenberg, so multiple + * HTML form blocks on the same page each render their own toolbar + * button — no manual reconciliation is needed. + * + * Parsing is memoized against the block's current `content` attribute + * so re-renders driven by unrelated state (selection changes, sidebar + * toggles) do not re-run `DOMParser`. The parser itself short-circuits + * cheaply for HTML blocks that hold non-form markup. + */ +const withConvertToSureForms = createHigherOrderComponent( + ( BlockEdit ) => ( props ) => { + // We only decorate `core/html` blocks — every other block type + // passes through untouched. Putting the type guard up here + // avoids running the memo / parser for blocks we will never + // add a button to. + if ( props.name !== HTML_BLOCK_NAME ) { + return <BlockEdit { ...props } />; + } + + const content = props.attributes?.content ?? ''; + + // Debounce the parse so typing inside the source HTML block does + // not run `DOMParser` + the per-field walk on every keystroke. + // Seeded with `content` so a block that already holds a form gets + // its toolbar button on first paint with no delay. + const [ debouncedContent, setDebouncedContent ] = useState( content ); + useEffect( () => { + const timer = setTimeout( + () => setDebouncedContent( content ), + 250 + ); + return () => clearTimeout( timer ); + }, [ content ] ); + + // Guard the parser so malformed or hostile HTML degrades to "no + // Convert button" instead of throwing an uncaught error that would + // crash this block's edit render. + const parsed = useMemo( () => { + try { + return parseFormHtml( debouncedContent ); + } catch ( error ) { + return null; + } + }, [ debouncedContent ] ); + const [ isConverting, setIsConverting ] = useState( false ); + + // Render the unmodified block when there is no form to convert, + // so we never light up an empty toolbar group on regular HTML + // blocks (e.g. a custom embed snippet, a Tailwind playground). + if ( ! parsed || parsed.fields.length === 0 ) { + return <BlockEdit { ...props } />; + } + + const handleConvert = async () => { + if ( isConverting ) { + return; + } + setIsConverting( true ); + // `convertBlock` swaps the block on success — after which + // React unmounts this HOC for the (gone) `core/html` + // clientId, so clearing `isConverting` would never run. + // That is fine; the only path where the cleanup matters is + // the failure case, where the original block is preserved. + const ok = await convertBlock( props.clientId, content, parsed ); + if ( ! ok ) { + setIsConverting( false ); + } + }; + + // Drive the accessible name from the same string as the visible + // child text so screen readers announce the state change when + // the button flips to the busy state. `isBusy` alone is a + // purely visual cue. + const buttonText = isConverting + ? __( 'Converting…', 'sureforms' ) + : __( 'Convert to SureForms', 'sureforms' ); + + return ( + <Fragment> + <BlockControls group="other"> + <ToolbarGroup> + <ToolbarButton + icon={ <SureFormsIcon /> } + label={ buttonText } + onClick={ handleConvert } + disabled={ isConverting } + isBusy={ isConverting } + > + { buttonText } + </ToolbarButton> + </ToolbarGroup> + </BlockControls> + <BlockEdit { ...props } /> + </Fragment> + ); + }, + 'withConvertToSureForms' +); + +addFilter( + 'editor.BlockEdit', + `${ FILTER_NAMESPACE }/with-convert-button`, + withConvertToSureForms +); diff --git a/src/admin/html-form-detector/parse.js b/src/admin/html-form-detector/parse.js new file mode 100644 index 000000000..6f77f5054 --- /dev/null +++ b/src/admin/html-form-detector/parse.js @@ -0,0 +1,614 @@ +/** + * SureForms — HTML Form Detector — Parser. + * + * Deterministic, dependency-free parser that turns a raw HTML string from a + * `core/html` block into a structured field schema suitable for handing to + * the SureForms form-creation API. + * + * Hybrid plan: this parser handles the common shapes (text, email, url, + * number, tel, password, textarea, select, checkbox, radio, file). Anything + * it cannot confidently map is marked `confidence: 'low'` so the caller can + * decide to fall back to the AI conversion path on the server. + */ + +const TYPE_MAP = { + text: 'input', + email: 'email', + url: 'url', + tel: 'phone', + number: 'number', + password: 'input', + search: 'input', + file: 'upload', + hidden: 'hidden', +}; + +// Skip the deep parse for forms whose input count exceeds this. The +// O(N^2) label/fieldset resolution would otherwise block the editor +// main thread on every keystroke inside the source block. A real +// contact / signup / quiz form clears 200 fields by a wide margin; +// anything past that is almost always a marketing-page export the +// AI middleware is better-suited to convert anyway. +const FORM_INPUT_SOFT_LIMIT = 200; + +/** + * Escape a string for safe use inside an attribute-selector value. + * + * Prefers the native `CSS.escape` but degrades gracefully when it is + * unavailable (older embedded webviews, some test/SSR harnesses) so the + * parser never throws an uncaught `TypeError` mid-render. The fallback + * escapes the characters that matter inside a double-quoted + * `[attr="…"]` value (backslash and double quote). + * + * @param {string} value Raw attribute value. + * @return {string} Selector-safe value. + */ +function cssEscape( value ) { + if ( + typeof window !== 'undefined' && + window.CSS && + typeof window.CSS.escape === 'function' + ) { + return window.CSS.escape( value ); + } + return String( value ).replace( /["\\]/g, '\\$&' ); +} + +/** + * Read the text content of a `<label>` element that appears immediately + * before the given element in the same parent — separated only by + * whitespace or `<br>` elements, never by other content. Captures the + * common shape where a label is authored as a sibling rather than via + * `for=` or by wrapping the input: + * + * <label>How satisfied are you?</label><br> + * <input type="radio" name="rating" value="1"> 1 + * + * <label>What can we improve?</label> + * <textarea name="feedback"></textarea> + * + * The walk stops at the first non-whitespace text node or any element + * that is not `<br>` or `<label>` — so an unrelated label further up + * the tree never bleeds into the wrong field. Labels with an explicit + * `for` attribute are skipped: those are already tied to a specific + * field and only that field should claim them (handled separately in + * `resolveLabel` via `querySelector('label[for="…"]')`). + * + * @param {Element} element + * @return {string} Trimmed label text, or '' when none applies. + */ +function readPrecedingLabelText( element ) { + let cursor = element.previousSibling; + while ( cursor ) { + if ( cursor.nodeType === 1 /* ELEMENT_NODE */ ) { + if ( cursor.tagName === 'LABEL' ) { + if ( cursor.getAttribute( 'for' ) ) { + return ''; + } + return ( cursor.textContent || '' ).trim(); + } + if ( cursor.tagName !== 'BR' ) { + return ''; + } + } else if ( cursor.nodeType === 3 /* TEXT_NODE */ ) { + if ( ( cursor.textContent || '' ).trim() !== '' ) { + return ''; + } + } + cursor = cursor.previousSibling; + } + return ''; +} + +/** + * Read the visible text that immediately follows the given element in + * its parent — the "<input> 5" / "<input> Yes" pattern where radio + * options are labelled by adjacent text nodes rather than `<label>` + * elements. Stops at the next element so we never pull in a + * neighbouring input's label. + * + * @param {Element} element + * @return {string} Trimmed trailing text, or '' when none applies. + */ +function readTrailingTextLabel( element ) { + let cursor = element.nextSibling; + let text = ''; + while ( cursor && cursor.nodeType !== 1 ) { + if ( cursor.nodeType === 3 ) { + text += cursor.textContent || ''; + } + cursor = cursor.nextSibling; + } + return text.trim(); +} + +/** + * Resolve the label text for a given input element. + * + * Prefers an explicit `<label for="id">` association, then a wrapping + * `<label>` ancestor, then a preceding free-floating `<label>` sibling, + * then `aria-label` / `placeholder` / `name` as progressively weaker + * signals. Returns an empty string when nothing usable can be derived + * — callers treat that as a low-confidence field. + * + * Note: this resolver is intentionally NOT used for radio per-option + * labels — those go through `resolveRadioOptionLabel` which prefers + * adjacent text and refuses to fall back to `name` (the group key). + * + * @param {Element} element The input/textarea/select element. + * @param {Document} doc The owner document (for `getElementById`). + * @return {string} Best-effort human label, empty string when none. + */ +function resolveLabel( element, doc ) { + const id = element.getAttribute( 'id' ); + if ( id ) { + const explicit = doc.querySelector( `label[for="${ cssEscape( id ) }"]` ); + if ( explicit?.textContent ) { + return explicit.textContent.trim(); + } + } + + const wrappingLabel = element.closest( 'label' ); + if ( wrappingLabel?.textContent ) { + return wrappingLabel.textContent.trim(); + } + + const preceding = readPrecedingLabelText( element ); + if ( preceding ) { + return preceding; + } + + const aria = element.getAttribute( 'aria-label' ); + if ( aria ) { + return aria.trim(); + } + + const placeholder = element.getAttribute( 'placeholder' ); + if ( placeholder ) { + return placeholder.trim(); + } + + const name = element.getAttribute( 'name' ); + if ( name ) { + // Convert "first_name" or "first-name" → "First Name" as a last resort. + return name + .replace( /[_-]+/g, ' ' ) + .replace( /\b\w/g, ( c ) => c.toUpperCase() ) + .trim(); + } + + return ''; +} + +/** + * Resolve the per-option label for a radio input. Distinct priority + * from `resolveLabel` because radios have a different DOM contract: + * + * - The text that visually labels each option usually sits as a text + * node *after* the `<input>`, not before it — so trailing text wins + * over any other signal. + * - The `name` attribute is the group identifier shared by every + * option, so using it as a label fallback would yield N identical + * options. Never fall through to it here. + * + * The group's title (the question being asked) is resolved separately + * in `parseInput` via `<fieldset><legend>` or `readPrecedingLabelText`. + * + * @param {Element} element The radio input. + * @param {Document} doc The owner document. + * @return {string} Trimmed option label, or '' when none applies. + */ +function resolveRadioOptionLabel( element, doc ) { + const trailing = readTrailingTextLabel( element ); + if ( trailing ) { + return trailing; + } + + const id = element.getAttribute( 'id' ); + if ( id ) { + const explicit = doc.querySelector( `label[for="${ cssEscape( id ) }"]` ); + if ( explicit?.textContent ) { + return explicit.textContent.trim(); + } + } + + const wrappingLabel = element.closest( 'label' ); + if ( wrappingLabel?.textContent ) { + return wrappingLabel.textContent.trim(); + } + + const value = element.getAttribute( 'value' ); + if ( value ) { + return value.trim(); + } + + return ''; +} + +function parseInput( element, doc ) { + const type = ( element.getAttribute( 'type' ) || 'text' ).toLowerCase(); + if ( type === 'submit' || type === 'button' || type === 'reset' || type === 'image' ) { + return null; + } + + if ( type === 'checkbox' ) { + return { + fieldType: 'gdpr', + label: resolveLabel( element, doc ) || 'Checkbox', + required: element.hasAttribute( 'required' ), + confidence: 'medium', + }; + } + + if ( type === 'radio' ) { + // Two distinct labels live on a radio input and they must not be + // conflated: the per-option label ("Vegan") sits on / next to the + // `<input>` itself, while the group's human title ("Dietary + // Preference") usually sits on a `<fieldset><legend>` wrapping + // the whole group. We attach the group title to `_groupLabel` + // so `collapseRadioGroups` can hoist it onto the merged + // `multi-choice` field; the per-option label stays on `label` + // and ends up as the option text. Conflating them — as an + // earlier revision did — produced N options all labelled with + // the legend instead of the actual option names. + const fieldset = element.closest( 'fieldset' ); + // Tailwind / Bootstrap-style markup often wraps `<legend>` in a + // styling `<div>` for layout reasons; `:scope > legend` misses + // those cases. The first descendant `<legend>` is good enough — + // nested fieldsets are rare in form payloads and would each + // have their own `closest('fieldset')` resolution anyway. + const legend = fieldset?.querySelector( 'legend' ); + // Group title fallback chain: explicit <legend>, then a + // free-floating <label> sibling that sits above the first + // radio (e.g. `<label>How satisfied are you?</label><br> + // <input type="radio">…`). `readPrecedingLabelText` returns '' + // for radios after the first one in a group — their preceding + // sibling is the previous radio's trailing text, not a label — + // so only the first radio actually contributes a group label, + // which is exactly what `collapseRadioGroups` consumes. + const groupLabel = + legend?.textContent?.trim() || + readPrecedingLabelText( element ) || + ''; + + return { + fieldType: 'multi-choice', + label: resolveRadioOptionLabel( element, doc ) || 'Choice', + required: element.hasAttribute( 'required' ), + singleSelection: true, + confidence: 'medium', + _groupName: element.getAttribute( 'name' ) || '', + _optionValue: element.getAttribute( 'value' ) || '', + _groupLabel: groupLabel, + }; + } + + const mapped = TYPE_MAP[ type ]; + return { + fieldType: mapped || 'input', + label: resolveLabel( element, doc ) || 'Field', + required: element.hasAttribute( 'required' ), + defaultValue: element.getAttribute( 'value' ) || undefined, + placeholder: element.getAttribute( 'placeholder' ) || undefined, + confidence: mapped ? 'high' : 'low', + }; +} + +function parseTextarea( element, doc ) { + return { + fieldType: 'textarea', + label: resolveLabel( element, doc ) || 'Message', + required: element.hasAttribute( 'required' ), + placeholder: element.getAttribute( 'placeholder' ) || undefined, + confidence: 'high', + }; +} + +function parseSelect( element, doc ) { + // Pull a placeholder out of an empty-value first `<option>` if one is + // present (`<option value="">Choose one</option>`). That option is a + // UI hint, not a real choice — promoting its text to `placeholder` + // keeps it out of the `fieldOptions` list (where it would render as + // a selectable item) AND lets SureForms surface it as the dropdown's + // idle placeholder, which is the round-trip the source HTML implied. + const optionEls = Array.from( element.querySelectorAll( 'option' ) ); + let placeholder; + const meaningful = optionEls.filter( ( option, idx ) => { + const value = option.getAttribute( 'value' ); + const text = option.textContent?.trim() || ''; + const isFirstEmpty = idx === 0 && ( value === null || value === '' ); + if ( isFirstEmpty && text ) { + placeholder = text; + return false; + } + return true; + } ); + + const options = meaningful + .map( ( option ) => { + const optionLabel = option.textContent?.trim() || option.getAttribute( 'value' ) || ''; + return optionLabel ? { label: optionLabel, optionTitle: optionLabel } : null; + } ) + .filter( Boolean ); + + return { + fieldType: 'dropdown', + label: resolveLabel( element, doc ) || 'Select', + required: element.hasAttribute( 'required' ), + fieldOptions: options, + placeholder, + confidence: options.length ? 'high' : 'low', + }; +} + +/** + * Collapse parsed radio entries by their HTML `name` attribute — the HTML + * form spec models a radio group as N inputs sharing a name, but SureForms + * expects a single multi-choice field with N options. Without this step the + * generated form would end up with one field per radio option. + * + * @param {Array} fields Mixed list of parsed field descriptors. + * @return {Array} List with radio groups merged into single multi-choice fields. + */ +function collapseRadioGroups( fields ) { + const merged = []; + const groups = new Map(); + + for ( const field of fields ) { + if ( field.fieldType !== 'multi-choice' || ! field._groupName ) { + merged.push( field ); + continue; + } + + if ( ! groups.has( field._groupName ) ) { + // Prefer the legend text picked up in `parseInput` over the + // raw `name` attribute. The legend usually reads as a proper + // question ("Dietary Preference"); falling back to the name + // gives the user something humanized rather than a slug. + const placeholder = { + fieldType: 'multi-choice', + label: + field._groupLabel || + field._groupName.replace( /[_-]+/g, ' ' ), + required: field.required, + singleSelection: true, + fieldOptions: [], + confidence: 'medium', + }; + groups.set( field._groupName, placeholder ); + merged.push( placeholder ); + } + + const target = groups.get( field._groupName ); + const optionLabel = field.label || field._optionValue; + if ( optionLabel ) { + target.fieldOptions.push( { + label: optionLabel, + optionTitle: optionLabel, + } ); + } + } + + return merged; +} + +/** + * Parse the HTML inside a `core/html` block, returning the first + * `<form>` found and a structured descriptor of its fields. + * + * Returns `null` when no `<form>` is present so callers can short-circuit + * cheaply on the common case of HTML blocks that hold non-form markup. + * + * @param {string} html Raw HTML string from the block. + * @return {object|null} Parsed form descriptor or null. + */ +export function parseFormHtml( html ) { + if ( typeof html !== 'string' || ! /<form\b/i.test( html ) ) { + return null; + } + + const doc = new window.DOMParser().parseFromString( html, 'text/html' ); + const formEl = doc.querySelector( 'form' ); + if ( ! formEl ) { + return null; + } + + const formInputs = formEl.querySelectorAll( 'input, textarea, select' ); + + // Bail out of the deep parse for pathologically large forms. Every + // field walk runs `closest('fieldset')` (O(depth)) and a per-field + // `label[for="..."]` document query (O(N) within the doc); on a + // form with hundreds of inputs that is O(N^2) on the editor's main + // thread, and the parser runs on every keystroke inside the source + // `core/html` block. Return a single-field sentinel with + // `confidence: 'low'` so the HOC still surfaces the Convert button + // (it shows when `fields.length > 0`) AND the server routes the + // conversion through the AI middleware, which has the raw HTML and + // can take its time off the editor's main thread. + if ( formInputs.length > FORM_INPUT_SOFT_LIMIT ) { + return { + fields: [ + { + fieldType: 'input', + label: 'Field', + required: false, + confidence: 'low', + }, + ], + submitText: '', + styling: {}, + confidence: 'low', + }; + } + + const rawFields = []; + + formInputs.forEach( ( element ) => { + if ( element.tagName === 'INPUT' ) { + const parsed = parseInput( element, doc ); + if ( parsed ) { + rawFields.push( parsed ); + } + } else if ( element.tagName === 'TEXTAREA' ) { + rawFields.push( parseTextarea( element, doc ) ); + } else if ( element.tagName === 'SELECT' ) { + rawFields.push( parseSelect( element, doc ) ); + } + } ); + + const fields = collapseRadioGroups( rawFields ); + + // Prefer an explicit submit control. Only when none exists do we fall + // back to a typeless `<button>` (submit by spec inside a form) — and to + // the LAST such button, skipping decorative cancel/reset/back buttons, so + // a leading "Cancel" button is not mistaken for the form's submit action. + let submitEl = formEl.querySelector( + 'button[type="submit"], input[type="submit"]' + ); + if ( ! submitEl ) { + const typelessButtons = Array.from( + formEl.querySelectorAll( 'button:not([type])' ) + ).filter( + ( btn ) => + ! /\b(cancel|reset|clear|back|close)\b/i.test( + ( btn.textContent || '' ).trim() + ) + ); + submitEl = typelessButtons[ typelessButtons.length - 1 ] || null; + } + const submitText = + submitEl?.textContent?.trim() || + submitEl?.getAttribute( 'value' )?.trim() || + ''; + + const styling = extractInlineStyling( formEl, submitEl ); + + // Majority-low (rather than any-low) so a single uncommon field type + // — e.g. one `<input type="color">` in an otherwise standard contact + // form — does not flip the whole form to low and burn an AI roundtrip. + // The AI fallback is expensive (network + tokens + middleware cost); + // reserve it for forms where the local parser genuinely can't carry + // most of the load. + const lowCount = fields.filter( ( f ) => f.confidence === 'low' ).length; + const overallConfidence = + fields.length === 0 + ? 'low' + : lowCount * 2 > fields.length + ? 'low' + : 'high'; + + return { + fields, + submitText, + styling, + confidence: overallConfidence, + }; +} + +/** + * Extract whatever styling we can glean from inline `style="..."` attributes + * on the form / submit button / first input. We deliberately do not touch + * external stylesheets: the editor iframe rarely has the live theme CSS + * applied to the `<form>` markup as it sits inside a `core/html` block, so + * reading computed styles would surface defaults that misrepresent the + * published page anyway. Inline styles are the only signal we can trust to + * round-trip through the conversion. + * + * The returned object follows the `formMetaData` schema expected by the + * Create_Form ability (`formStyling.*`, `instantForm.formBackgroundColor`). + * Keys are omitted when the source form did not supply them — the endpoint + * applies safe defaults on top. + * + * @param {HTMLFormElement|null} formEl The source `<form>` element. + * @param {Element|null} submitEl The submit button / input, if any. + * @return {Object} Best-effort styling descriptor. + */ +function extractInlineStyling( formEl, submitEl ) { + const styling = {}; + if ( ! formEl ) { + return styling; + } + + const formStyle = formEl.style || {}; + if ( formStyle.backgroundColor ) { + const hex = normalizeColor( formStyle.backgroundColor ); + if ( hex ) { + styling.formBackgroundColor = hex; + } + } + if ( formStyle.color ) { + const hex = normalizeColor( formStyle.color ); + if ( hex ) { + styling.textColor = hex; + } + } + + // Box-model hints — these only matter when the form has a distinct + // "card" look in the source. We pass them through verbatim so the + // endpoint can decide whether to emit them as custom CSS. + if ( formStyle.padding ) { + styling.formPadding = formStyle.padding; + } + if ( formStyle.borderRadius ) { + styling.formBorderRadius = formStyle.borderRadius; + } + if ( formStyle.border ) { + styling.formBorder = formStyle.border; + } + + if ( submitEl ) { + const submitStyle = submitEl.style || {}; + if ( submitStyle.backgroundColor ) { + const hex = normalizeColor( submitStyle.backgroundColor ); + if ( hex ) { + styling.primaryColor = hex; + } + } + if ( submitStyle.color ) { + const hex = normalizeColor( submitStyle.color ); + if ( hex ) { + styling.textColorOnPrimary = hex; + } + } + } + + return styling; +} + +/** + * Convert any CSS color value the browser accepts (`rgb(...)`, `#abc`, + * `red`, etc.) into a 6-digit hex. SureForms' `sanitize_hex_color()` + * rejects anything else, so any color we cannot resolve is dropped. + * + * Uses the browser's own color parser by round-tripping through a temp + * element's `style.color` (which normalizes any valid color to `rgb(...)`), + * then converts the rgb to hex. Returns null on failure. + * + * @param {string} value Source color string. + * @return {string|null} `#RRGGBB` hex, or null when the value cannot be parsed. + */ +function normalizeColor( value ) { + if ( typeof value !== 'string' || ! value.trim() ) { + return null; + } + + const probe = window.document.createElement( 'div' ); + probe.style.color = ''; + probe.style.color = value; + if ( ! probe.style.color ) { + return null; + } + + const match = probe.style.color.match( + /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/ + ); + if ( ! match ) { + return null; + } + + const toHex = ( c ) => { + const h = Number( c ).toString( 16 ); + return h.length === 1 ? '0' + h : h; + }; + return '#' + toHex( match[ 1 ] ) + toHex( match[ 2 ] ) + toHex( match[ 3 ] ); +} diff --git a/src/admin/payment/components/PaymentTable.js b/src/admin/payment/components/PaymentTable.js index dcf7f7a56..0f109e3f5 100644 --- a/src/admin/payment/components/PaymentTable.js +++ b/src/admin/payment/components/PaymentTable.js @@ -167,8 +167,15 @@ const PaymentTable = ( { </div> ); + // For subscription rows, prefer `subscription_status` so canceled/paused + // lifecycle states surface here. Falls back to `status` for non-subs and + // when `subscription_status` is missing. + const paymentStatusSource = + 'subscription' === payment.type && payment.subscription_status + ? payment.subscription_status + : payment.status; const paymentStatus = - 'active' === payment.status ? 'succeeded' : payment.status; + 'active' === paymentStatusSource ? 'succeeded' : paymentStatusSource; const rowStatusBadge = ( <Badge diff --git a/src/admin/payment/components/RefundDialog.js b/src/admin/payment/components/RefundDialog.js index 2da383c13..a838ab885 100644 --- a/src/admin/payment/components/RefundDialog.js +++ b/src/admin/payment/components/RefundDialog.js @@ -35,7 +35,9 @@ const RefundDialog = ( { isOpen, setIsOpen, payment, queryKey } ) => { } }, [ isOpen, payment, refundableAmount ] ); - // Refund mutation + // Refund mutation. Errors surface inline via `refundMutation.error` below + // (rendered with the same `refundMessage` callout pattern), so the admin + // can adjust amount/notes and retry without losing dialog context. const refundMutation = useMutation( { mutationFn: refundPayment, onSuccess: () => { @@ -46,7 +48,6 @@ const RefundDialog = ( { isOpen, setIsOpen, payment, queryKey } ) => { }, onError: ( error ) => { console.error( 'Refund failed:', error ); - alert( __( 'Refund failed. Please try again.', 'sureforms' ) ); }, } ); @@ -54,6 +55,23 @@ const RefundDialog = ( { isOpen, setIsOpen, payment, queryKey } ) => { setIsOpen( false ); setRefundAmount( '' ); setRefundNotes( '' ); + refundMutation.reset(); + }; + + // Clear any stale gateway error as soon as the admin starts editing — + // otherwise the inline red callout would persist until the next submit. + const handleAmountChange = ( value ) => { + setRefundAmount( value ); + if ( refundMutation.isError ) { + refundMutation.reset(); + } + }; + + const handleNotesChange = ( value ) => { + setRefundNotes( value ); + if ( refundMutation.isError ) { + refundMutation.reset(); + } }; const processRefund = () => { @@ -191,7 +209,7 @@ const RefundDialog = ( { isOpen, setIsOpen, payment, queryKey } ) => { <Input type="number" value={ refundAmount } - onChange={ setRefundAmount } + onChange={ handleAmountChange } placeholder={ sprintf( /* translators: %s: maximum refundable amount */ __( 'Max: %s', 'sureforms' ), @@ -223,7 +241,7 @@ const RefundDialog = ( { isOpen, setIsOpen, payment, queryKey } ) => { </Label> <TextArea value={ refundNotes } - onChange={ setRefundNotes } + onChange={ handleNotesChange } placeholder={ __( 'Add a reason or note for this refund…', 'sureforms' @@ -264,6 +282,19 @@ const RefundDialog = ( { isOpen, setIsOpen, payment, queryKey } ) => { </div> ) } + { /* Gateway error (e.g. Stripe API error, validation) */ } + { refundMutation.isError && ( + <div className="p-3 rounded-md bg-red-50 border border-red-200"> + <Text className="text-sm text-red-700"> + { refundMutation.error?.message || + __( + 'Refund failed. Please try again.', + 'sureforms' + ) } + </Text> + </div> + ) } + { /* Refund history info */ } { alreadyRefunded > 0 && ( <div className="p-3 border border-border-subtle rounded-md bg-background-secondary"> diff --git a/src/admin/payment/components/apiCalls.js b/src/admin/payment/components/apiCalls.js index ad3ab790a..b9559d40d 100644 --- a/src/admin/payment/components/apiCalls.js +++ b/src/admin/payment/components/apiCalls.js @@ -1,5 +1,23 @@ import apiFetch from '@wordpress/api-fetch'; +/** + * Extract the human-readable error message from a failed admin-ajax response. + * + * Backends in this codebase use both shapes interchangeably: + * - wp_send_json_error( $message_string ) → data.data is the string + * - wp_send_json_error( [ 'message' => '...' ] ) → data.data.message holds it + * + * @param {Object} data The parsed admin-ajax response body. + * @param {string} fallback Message to use when no specific error is available. + * @return {string} A human-readable error message. + */ +const parseAjaxError = ( data, fallback ) => { + if ( typeof data?.data === 'string' && data.data ) { + return data.data; + } + return data?.data?.message || fallback; +}; + export const fetchPayments = async ( args ) => { const { searchTerm, @@ -51,8 +69,10 @@ export const fetchPayments = async ( args ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = - data.data?.message || 'Failed to fetch payments'; + const errorMessage = parseAjaxError( + data, + 'Failed to fetch payments' + ); console.error( 'AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -88,8 +108,10 @@ export const fetchSinglePayment = async ( paymentId ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = - data.data?.message || 'Failed to fetch payment details'; + const errorMessage = parseAjaxError( + data, + 'Failed to fetch payment details' + ); console.error( 'Single payment AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -135,8 +157,10 @@ export const refundPayment = async ( { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = - data.data?.message || 'Failed to process refund'; + const errorMessage = parseAjaxError( + data, + 'Failed to process refund' + ); console.error( 'Refund AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -172,8 +196,10 @@ export const fetchSubscription = async ( subscriptionId ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = - data.data?.message || 'Failed to fetch subscription details'; + const errorMessage = parseAjaxError( + data, + 'Failed to fetch subscription details' + ); console.error( 'Subscription AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -208,8 +234,10 @@ export const fetchForms = async () => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = - data.data?.message || 'Failed to fetch forms list'; + const errorMessage = parseAjaxError( + data, + 'Failed to fetch forms list' + ); console.error( 'Forms list AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -245,8 +273,10 @@ export const cancelSubscription = async ( paymentId ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = - data.data?.message || 'Failed to cancel subscription'; + const errorMessage = parseAjaxError( + data, + 'Failed to cancel subscription' + ); console.error( 'Cancel subscription AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -282,8 +312,10 @@ export const pauseSubscription = async ( paymentId ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = - data.data?.message || 'Failed to pause subscription'; + const errorMessage = parseAjaxError( + data, + 'Failed to pause subscription' + ); console.error( 'Pause subscription AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -320,7 +352,7 @@ export const addPaymentNote = async ( paymentId, noteText ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = data.data?.message || 'Failed to add note'; + const errorMessage = parseAjaxError( data, 'Failed to add note' ); console.error( 'Add note AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -357,7 +389,7 @@ export const deletePaymentNote = async ( paymentId, noteIndex ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = data.data?.message || 'Failed to delete note'; + const errorMessage = parseAjaxError( data, 'Failed to delete note' ); console.error( 'Delete note AJAX error:', errorMessage ); throw new Error( errorMessage ); } @@ -394,7 +426,7 @@ export const deletePaymentLog = async ( paymentId, logIndex ) => { // Check WordPress AJAX response format if ( ! data.success ) { - const errorMessage = data.data?.message || 'Failed to delete log'; + const errorMessage = parseAjaxError( data, 'Failed to delete log' ); console.error( 'Delete log AJAX error:', errorMessage ); throw new Error( errorMessage ); } diff --git a/src/admin/payment/pages/viewPayment.js b/src/admin/payment/pages/viewPayment.js index 4c4876ef4..b99540c4b 100644 --- a/src/admin/payment/pages/viewPayment.js +++ b/src/admin/payment/pages/viewPayment.js @@ -315,12 +315,20 @@ const ViewPayment = () => { ); }; - // Billing data from real payment data + // Billing data from real payment data. For subscription rows, prefer + // `subscription_status` so canceled/paused lifecycle states surface in the + // status badge below — the transaction `status` stays as 'succeeded' on + // canceled subscriptions and would otherwise misleadingly badge as "Paid". + const displayStatus = + 'subscription' === paymentData.type && paymentData.subscription_status + ? paymentData.subscription_status + : paymentData.status; + const billingData = [ { id: paymentData.id, amount_paid: parseFloat( paymentData.total_amount ), - status: paymentData.status, + status: displayStatus, date_time: paymentData.created_at, refunded_amount: parseFloat( paymentData.refunded_amount || 0 ), }, diff --git a/src/admin/payment/pages/viewSubscription.js b/src/admin/payment/pages/viewSubscription.js index 71b0eed82..77eb6a02c 100644 --- a/src/admin/payment/pages/viewSubscription.js +++ b/src/admin/payment/pages/viewSubscription.js @@ -1,4 +1,4 @@ -import { useState, useEffect } from '@wordpress/element'; +import { useState, useEffect, useMemo } from '@wordpress/element'; import { Button, Badge, Text, Table, Dialog } from '@bsf/force-ui'; import { ArrowUpRight, Eye } from 'lucide-react'; import { __, sprintf } from '@wordpress/i18n'; @@ -28,6 +28,24 @@ import PaymentLoadingSkeleton from '../components/paymentLoadingSkeleton'; import RefundDialog from '../components/RefundDialog'; import ConfirmationDialog from '@Admin/components/ConfirmationDialog'; +// Module-level sentinel so `billingData || EMPTY_BILLING` returns a stable +// reference across renders. Without it, `useMemo` below would recompute every +// render whenever `billingData` is undefined. +const EMPTY_BILLING = []; + +// Statuses representing an initial subscription EMI that can still be +// refunded. 'active'/'succeeded'/'paid' are the standard success states; +// 'partially_refunded' allows further refunds; 'canceled' covers historical +// rows where the cancellation handler used to overwrite `status` — the +// initial charge is still refundable in Stripe/PayPal. +const REFUNDABLE_EMI_STATUSES = [ + 'active', + 'paid', + 'succeeded', + 'partially_refunded', + 'canceled', +]; + const ViewSubscription = () => { const { id } = useParams(); const navigate = useNavigate(); @@ -205,6 +223,31 @@ const ViewSubscription = () => { setIsCancelDialogOpen( true ); }; + // Subscription billing history data - use fetched billing data or the + // module-level EMPTY_BILLING sentinel for referential stability. Defined + // before the early return so the useMemo below stays in the same call + // order on every render per React's Rules of Hooks. + const subscriptionBillingData = billingData || EMPTY_BILLING; + + const firstPaidEMI = useMemo( + () => + subscriptionBillingData + .filter( ( payment ) => + REFUNDABLE_EMI_STATUSES.includes( payment.status ) + ) + .sort( + ( a, b ) => + new Date( a.created_at ) - new Date( b.created_at ) + )[ 0 ], + [ subscriptionBillingData ] + ); + + const isFirstEMIFullyRefunded = firstPaidEMI + ? parseFloat( firstPaidEMI.total_amount ) === + parseFloat( firstPaidEMI.refunded_amount || 0 ) || + firstPaidEMI.status === 'refunded' + : false; + // Loading, error, not found states if ( isLoading || error || ! subscriptionData ) { return ( @@ -338,33 +381,17 @@ const ViewSubscription = () => { } }; - const handleRefundLatestEMI = () => { - // Find the first (initial/linked) paid EMI transaction - // Note: 'active' status is used for subscription records, 'succeeded' for one-time payments - const firstPaidEMI = subscriptionBillingData - .filter( - ( payment ) => - payment.status === 'active' || - payment.status === 'paid' || - payment.status === 'succeeded' || - payment.status === 'partially_refunded' - ) - .sort( - ( a, b ) => new Date( a.created_at ) - new Date( b.created_at ) - )[ 0 ]; + const openPauseDialog = () => { + setIsPauseDialogOpen( true ); + }; + const handleRefundLatestEMI = () => { if ( ! firstPaidEMI ) { alert( __( 'No paid EMI found to refund.', 'sureforms' ) ); return; } - // Check if the first EMI is fully refunded - const isFullyRefunded = - parseFloat( firstPaidEMI.total_amount ) === - parseFloat( firstPaidEMI.refunded_amount || 0 ) || - firstPaidEMI.status === 'refunded'; - - if ( isFullyRefunded ) { + if ( isFirstEMIFullyRefunded ) { alert( __( 'This payment has already been fully refunded.', @@ -374,36 +401,9 @@ const ViewSubscription = () => { return; } - // Open refund dialog with first EMI (linked transaction) openRefundDialog( firstPaidEMI ); }; - const openPauseDialog = () => { - setIsPauseDialogOpen( true ); - }; - - // Subscription billing history data - use fetched billing data or empty array - const subscriptionBillingData = billingData || []; - - // Check if the first paid EMI is fully refunded (for disabling refund button) - const firstPaidEMI = subscriptionBillingData - .filter( - ( payment ) => - payment.status === 'active' || - payment.status === 'paid' || - payment.status === 'succeeded' || - payment.status === 'partially_refunded' - ) - .sort( - ( a, b ) => new Date( a.created_at ) - new Date( b.created_at ) - )[ 0 ]; - - const isFirstEMIFullyRefunded = firstPaidEMI - ? parseFloat( firstPaidEMI.total_amount ) === - parseFloat( firstPaidEMI.refunded_amount || 0 ) || - firstPaidEMI.status === 'refunded' - : false; - const viewPaymentInPlateForm = applyFilters( 'srfm_view_subscription_payment_in_platform_button', <Button diff --git a/src/admin/settings/Component.js b/src/admin/settings/Component.js index 5df1b78fc..141cfd70a 100644 --- a/src/admin/settings/Component.js +++ b/src/admin/settings/Component.js @@ -1,11 +1,20 @@ -import { useState, useEffect } from '@wordpress/element'; +import { + useState, + useEffect, + useCallback, + useMemo, + useRef, +} from '@wordpress/element'; import apiFetch from '@wordpress/api-fetch'; -import { __ } from '@wordpress/i18n'; -import { useDebouncedCallback } from 'use-debounce'; +import { __, sprintf } from '@wordpress/i18n'; import { toast } from '@bsf/force-ui'; +import { useSelect, useDispatch } from '@wordpress/data'; import { cn } from '@Utils/Helpers'; import { getNavigation } from './Navigation'; +import { STORE_NAME as SRFM_STORE_NAME } from '../../store/constants'; +import { getTabSaveHandler } from './tab-save-adapter'; import GeneralPage from './pages/General'; +import GlobalDefaultsPage from './pages/GlobalDefaults'; import ValidationsPage from './pages/Validations'; import SecurityPage from './pages/Security'; import IntegrationPage from './pages/Integrations'; @@ -18,12 +27,11 @@ import PageTitleSection from '@Admin/components/PageTitleSection'; const Component = ( { path, subpage } ) => { const [ pageTitle, setPageTitle ] = useState( '' ); - // State to maintain whether to hide the page title. const [ hidePageTitle, setHidePageTitle ] = useState( false ); - const [ loading, setLoading ] = useState( false ); + const [ loading, setLoading ] = useState( true ); const [ helpText, setHelpText ] = useState( '' ); - // Global settings states. + // Global settings states — partitioned per save-tab id. const [ generalTabOptions, setGeneralTabOptions ] = useState( { srfm_ip_log: false, srfm_form_analytics: false, @@ -32,7 +40,7 @@ const Component = ( { path, subpage } ) => { } ); const [ emailTabOptions, setEmailTabOptions ] = useState( { srfm_email_summary: false, - srfm_emails_send_to: srfm_admin.admin_email, + srfm_email_sent_to: srfm_admin.admin_email, srfm_schedule_report: 'Monday', } ); const [ securitytabOptions, setSecurityTabOptions ] = useState( { @@ -56,9 +64,6 @@ const Component = ( { path, subpage } ) => { srfm_mcp_server: false, } ); const [ dynamicBlockOptions, setDynamicBlockOptions ] = useState( {} ); - const [ preDynamicBlockOptions, setPreDynamicBlockOptions ] = useState( - {} - ); const [ paymentsSettings, setPaymentsSettings ] = useState( {} ); const [ pluginConnected, setPluginConnected ] = useState( srfm_admin?.integrations?.sure_triggers?.connected ?? null @@ -66,42 +71,168 @@ const Component = ( { path, subpage } ) => { const [ localPluginStatus, setLocalPluginStatus ] = useState( srfm_admin?.integrations?.sure_triggers?.status ); + const [ formRestrictionOptions, setFormRestrictionOptions ] = useState( { + max_entries: { status: false, maxEntries: 0, message: '' }, + ip_restriction: { + status: false, + mode: 'block', + ips: '', + includeDisallowedKeys: false, + message: '', + }, + country_restriction: { + status: false, + mode: 'block', + countries: '', + message: '', + }, + keyword_restriction: { + status: false, + keywords: '', + includeDisallowedKeys: false, + message: '', + }, + } ); + const [ complianceOptions, setComplianceOptions ] = useState( { + gdpr: false, + do_not_store_entries: false, + auto_delete_entries: false, + auto_delete_days: 30, + } ); + const [ formConfirmationOptions, setFormConfirmationOptions ] = useState( { + confirmation_type: 'same page', + message: + window.srfm_admin?.default_confirmation_message || + __( + 'Thank you for contacting us! We will be in touch with you shortly.', + 'sureforms' + ), + submission_action: 'hide form', + page_url: '', + custom_url: '', + enable_query_params: false, + query_params: [], + } ); + const [ emailNotificationOptions, setEmailNotificationOptions ] = useState( { + email_to: '{admin_email}', + subject: sprintf( + /* translators: %s: {form_title} smart tag placeholder. */ + __( 'New Form Submission - %s', 'sureforms' ), + '{form_title}' + ), + email_body: '{all_data}', + from_name: '{site_title}', + from_email: '{admin_email}', + email_cc: '{admin_email}', + email_bcc: '{admin_email}', + email_reply_to: '{admin_email}', + } ); + + // Per-save-tab baselines. Populated after the initial fetch resolves; + // updated per-tab after a successful save. Used to compute dirty state + // and to revert via window.__srfm_global_settings_discard on guard confirm. + const [ savedBaselines, setSavedBaselines ] = useState( { + 'general-settings': null, + 'email-settings': null, + 'security-settings': null, + 'mcp-settings': null, + 'general-settings-dynamic-opt': null, + 'payments-settings': null, + 'form-restriction-settings': null, + 'compliance-settings': null, + 'form-confirmation-settings': null, + 'email-notification-settings': null, + } ); + const [ isSaving, setIsSaving ] = useState( false ); + + // Ref always holds the latest state slices so useCallback closures never go stale. + const settingsStateRef = useRef( {} ); + settingsStateRef.current = { + emailTabOptions, + generalTabOptions, + securitytabOptions, + mcpTabOptions, + dynamicBlockOptions, + paymentsSettings, + formRestrictionOptions, + complianceOptions, + formConfirmationOptions, + emailNotificationOptions, + }; + + // Stable refs to setter functions. + const tabSetters = useRef( { + 'email-settings': setEmailTabOptions, + 'general-settings': setGeneralTabOptions, + 'security-settings': setSecurityTabOptions, + 'mcp-settings': setMcpTabOptions, + 'general-settings-dynamic-opt': setDynamicBlockOptions, + 'payments-settings': setPaymentsSettings, + 'form-restriction-settings': setFormRestrictionOptions, + 'compliance-settings': setComplianceOptions, + 'form-confirmation-settings': setFormConfirmationOptions, + 'email-notification-settings': setEmailNotificationOptions, + } ); + + // Map from save-tab slug to the state key in settingsStateRef. + const stateKeys = useRef( { + 'email-settings': 'emailTabOptions', + 'general-settings': 'generalTabOptions', + 'security-settings': 'securitytabOptions', + 'mcp-settings': 'mcpTabOptions', + 'general-settings-dynamic-opt': 'dynamicBlockOptions', + 'payments-settings': 'paymentsSettings', + 'form-restriction-settings': 'formRestrictionOptions', + 'compliance-settings': 'complianceOptions', + 'form-confirmation-settings': 'formConfirmationOptions', + 'email-notification-settings': 'emailNotificationOptions', + } ); - // Options to fetch from API. const optionsToFetch = [ 'srfm_general_settings_options', 'srfm_email_summary_settings_options', 'srfm_security_settings_options', 'srfm_default_dynamic_block_option', 'srfm_mcp_settings_options', + 'srfm_form_restriction_settings_options', + 'srfm_compliance_settings_options', + 'srfm_form_confirmation_settings_options', + 'srfm_email_notification_settings_options', ]; - // set page title and icon based on the path. + // Set page title and icon based on the path / subpage. useEffect( () => { if ( path ) { getNavigation().forEach( ( single ) => { const slug = single?.slug && single.slug ? single.slug : ''; - const title = single?.name && single.name ? single.name : ''; + let title = single?.name && single.name ? single.name : ''; // eslint-disable-next-line no-shadow const helpText = single?.helpText && single.helpText ? single.helpText : ''; - // Check for the property to hide the page title. - // Show title for Google Maps when pro is active (settings page), hide for banner. - const hideTitle = slug === 'google-maps-settings' && srfm_admin?.is_pro_active - ? false - : !! single?.hidePageTitle; - if ( slug ) { - if ( slug === path ) { - setPageTitle( title ); - setHidePageTitle( hideTitle ); - setHelpText( helpText ); + const hideTitle = + slug === 'google-maps-settings' && srfm_admin?.is_pro_active + ? false + : !! single?.hidePageTitle; + if ( slug && slug === path ) { + if ( single.submenu ) { + const currentSubpage = + subpage || single.submenu[ 0 ]?.slug; + const submenuItem = single.submenu.find( + ( item ) => item.slug === currentSubpage + ); + if ( submenuItem ) { + title = submenuItem.name; + } } + setPageTitle( title ); + setHidePageTitle( hideTitle ); + setHelpText( helpText ); } } ); } - }, [ path ] ); + }, [ path, subpage ] ); - // Fetch global settings. + // Fetch global settings + seed baselines. useEffect( () => { const fetchData = async () => { setLoading( true ); @@ -115,192 +246,455 @@ const Component = ( { path, subpage } ) => { }, } ); - const { - srfm_general_settings_options, - srfm_email_summary_settings_options, - } = data; + const nextBaselines = { + 'general-settings': null, + 'email-settings': null, + 'security-settings': null, + 'mcp-settings': null, + 'general-settings-dynamic-opt': null, + 'payments-settings': null, + 'form-restriction-settings': null, + 'compliance-settings': null, + 'form-confirmation-settings': null, + 'email-notification-settings': null, + }; - if ( srfm_general_settings_options ) { + if ( data.srfm_general_settings_options ) { const { srfm_ip_log, srfm_form_analytics, srfm_bsf_analytics, srfm_admin_notification, - } = srfm_general_settings_options; - setGeneralTabOptions( { + } = data.srfm_general_settings_options; + const snap = { srfm_ip_log, srfm_form_analytics, srfm_bsf_analytics, srfm_admin_notification, - } ); + }; + setGeneralTabOptions( snap ); + nextBaselines[ 'general-settings' ] = snap; } - if ( srfm_email_summary_settings_options ) { + if ( data.srfm_email_summary_settings_options ) { const { srfm_email_summary, srfm_email_sent_to, srfm_schedule_report, - } = srfm_email_summary_settings_options; - setEmailTabOptions( { + } = data.srfm_email_summary_settings_options; + const snap = { srfm_email_summary, srfm_email_sent_to, srfm_schedule_report, - } ); + }; + setEmailTabOptions( snap ); + nextBaselines[ 'email-settings' ] = snap; } if ( data.srfm_security_settings_options ) { - const { - srfm_v2_checkbox_site_key, - srfm_v2_checkbox_secret_key, - srfm_v2_invisible_site_key, - srfm_v2_invisible_secret_key, - srfm_v3_site_key, - srfm_v3_secret_key, - srfm_cf_appearance_mode, - srfm_cf_turnstile_site_key, - srfm_cf_turnstile_secret_key, - srfm_hcaptcha_site_key, - srfm_hcaptcha_secret_key, - srfm_honeypot, - } = data.srfm_security_settings_options; - setSecurityTabOptions( { - srfm_v2_checkbox_site_key, - srfm_v2_checkbox_secret_key, - srfm_v2_invisible_site_key, - srfm_v2_invisible_secret_key, - srfm_v3_site_key, - srfm_v3_secret_key, - srfm_cf_appearance_mode, - srfm_cf_turnstile_site_key, - srfm_cf_turnstile_secret_key, - srfm_hcaptcha_site_key, - srfm_hcaptcha_secret_key, - srfm_honeypot, - } ); + const snap = { ...data.srfm_security_settings_options }; + setSecurityTabOptions( snap ); + nextBaselines[ 'security-settings' ] = snap; } if ( data.srfm_mcp_settings_options ) { - const { - srfm_abilities_api, - srfm_abilities_api_edit, - srfm_abilities_api_delete, - srfm_mcp_server, - } = data.srfm_mcp_settings_options; - setMcpTabOptions( { - srfm_abilities_api, - srfm_abilities_api_edit, - srfm_abilities_api_delete, - srfm_mcp_server, - } ); + const snap = { ...data.srfm_mcp_settings_options }; + setMcpTabOptions( snap ); + nextBaselines[ 'mcp-settings' ] = snap; } if ( data.srfm_default_dynamic_block_option ) { - setDynamicBlockOptions( { - ...data.srfm_default_dynamic_block_option, - } ); - setPreDynamicBlockOptions( { - ...data.srfm_default_dynamic_block_option, - } ); + const snap = { ...data.srfm_default_dynamic_block_option }; + setDynamicBlockOptions( snap ); + nextBaselines[ 'general-settings-dynamic-opt' ] = snap; } if ( data.payment_settings ) { - setPaymentsSettings( data.payment_settings ); + // Clone before storing as baseline so an in-place + // mutation downstream can't poison the comparison + // reference used by `isTabDirty`. Matches the + // spread-on-assign pattern every other branch uses. + const snap = { ...data.payment_settings }; + setPaymentsSettings( snap ); + nextBaselines[ 'payments-settings' ] = snap; + } + + if ( data.srfm_form_restriction_settings_options ) { + const snap = { + ...data.srfm_form_restriction_settings_options, + }; + setFormRestrictionOptions( snap ); + nextBaselines[ 'form-restriction-settings' ] = snap; + } + + if ( data.srfm_compliance_settings_options ) { + const snap = { ...data.srfm_compliance_settings_options }; + setComplianceOptions( snap ); + nextBaselines[ 'compliance-settings' ] = snap; } + if ( data.srfm_form_confirmation_settings_options ) { + const snap = { + ...data.srfm_form_confirmation_settings_options, + }; + setFormConfirmationOptions( snap ); + nextBaselines[ 'form-confirmation-settings' ] = snap; + } + + if ( data.srfm_email_notification_settings_options ) { + const snap = { + ...data.srfm_email_notification_settings_options, + }; + setEmailNotificationOptions( snap ); + nextBaselines[ 'email-notification-settings' ] = snap; + } + + setSavedBaselines( nextBaselines ); setLoading( false ); } catch ( error ) { - console.error( 'Error fetching data:', error ); + toast.error( + __( + 'Failed to load settings. Please refresh and try again.', + 'sureforms' + ) + ); } }; fetchData(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [] ); + + // Update only local state on every change. Persistence is deferred to + // the explicit Save button (saveAllDirtyTabs) so users can review and + // undo before committing. + const updateGlobalSettings = useCallback( ( setting, value, tab ) => { + const setter = tabSetters.current[ tab ]; + const stateKey = stateKeys.current[ tab ]; + if ( ! setter || ! stateKey ) { + return; + } + const changes = + setting !== null && typeof setting === 'object' + ? setting + : { [ setting ]: value }; + const updatedTabOptions = { + ...settingsStateRef.current[ stateKey ], + ...changes, + }; + setter( updatedTabOptions ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [] ); - // Save global settings. - const debouncedSave = useDebouncedCallback( ( newFormData, tab ) => { - try { - if ( tab === 'general-settings-dynamic-opt' ) { - const hasEmptyValue = Object.values( newFormData ).some( - ( value ) => value.trim() === '' + // Map save-tab slug → current local state slice. + const tabValues = { + 'general-settings': generalTabOptions, + 'email-settings': emailTabOptions, + 'security-settings': securitytabOptions, + 'mcp-settings': mcpTabOptions, + 'general-settings-dynamic-opt': dynamicBlockOptions, + 'payments-settings': paymentsSettings, + 'form-restriction-settings': formRestrictionOptions, + 'compliance-settings': complianceOptions, + 'form-confirmation-settings': formConfirmationOptions, + 'email-notification-settings': emailNotificationOptions, + }; + + // Shallow JSON-equality diff against the saved baseline. + const isTabDirty = ( tab ) => { + const baseline = savedBaselines[ tab ]; + if ( ! baseline ) { + return false; + } + const current = tabValues[ tab ]; + const keys = new Set( [ + ...Object.keys( baseline ), + ...Object.keys( current ), + ] ); + for ( const key of keys ) { + if ( + JSON.stringify( baseline[ key ] ) !== + JSON.stringify( current[ key ] ) + ) { + return true; + } + } + return false; + }; + + const dirtyTabs = useMemo( + () => Object.keys( tabValues ).filter( ( t ) => isTabDirty( t ) ), + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + generalTabOptions, + emailTabOptions, + securitytabOptions, + mcpTabOptions, + dynamicBlockOptions, + paymentsSettings, + formRestrictionOptions, + complianceOptions, + formConfirmationOptions, + emailNotificationOptions, + savedBaselines, + ] + ); + const isAnyTabDirty = dirtyTabs.length > 0; + + // Save every dirty tab in parallel. + const saveAllDirtyTabs = useCallback( async () => { + if ( ! isAnyTabDirty || isSaving ) { + return; + } + + // Validations tab disallows blank strings — surface a targeted error + // rather than partially committing. + if ( dirtyTabs.includes( 'general-settings-dynamic-opt' ) ) { + const hasEmptyValue = Object.values( dynamicBlockOptions ).some( + ( value ) => typeof value === 'string' && value.trim() === '' + ); + if ( hasEmptyValue ) { + toast.error( + __( + 'Form Validation fields cannot be left blank.', + 'sureforms' + ) ); - if ( hasEmptyValue ) { - toast.error( - __( 'This field cannot be left blank.', 'sureforms' ) - ); - setDynamicBlockOptions( { ...preDynamicBlockOptions } ); - return; - } + return; + } + } + + // Email Summary recipient required + email-regex when summaries are on. + if ( + dirtyTabs.includes( 'email-settings' ) && + emailTabOptions?.srfm_email_summary + ) { + const recipient = ( + emailTabOptions?.srfm_email_sent_to || '' + ).trim(); + if ( '' === recipient ) { + toast.error( + __( + 'Recipient email is required when email summaries are enabled.', + 'sureforms' + ) + ); + return; + } + if ( ! /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test( recipient ) ) { + toast.error( + __( + 'Please enter a valid recipient email.', + 'sureforms' + ) + ); + return; } - apiFetch( { + } + + setIsSaving( true ); + + const requests = dirtyTabs.map( ( tab ) => { + // `srfm_tab` is a backward-compat marker the legacy save + // handler uses to decide which option group to write. Safe + // to remove once the backend dispatches purely on the + // option keys present in the body. + const body = { ...tabValues[ tab ], srfm_tab: tab }; + return apiFetch( { path: 'sureforms/v1/srfm-global-settings', method: 'POST', - body: JSON.stringify( newFormData ), + body: JSON.stringify( body ), headers: { 'content-type': 'application/json', 'X-WP-Nonce': srfm_admin.global_settings_nonce, }, - } ).then( ( response ) => { - toast.success( response?.data ); - setPreDynamicBlockOptions( newFormData ); + } ) + .then( () => ( { + tab, + ok: true, + snapshot: tabValues[ tab ], + } ) ) + .catch( ( error ) => ( { tab, ok: false, error } ) ); + } ); + + const results = await Promise.all( requests ); + + const succeeded = results.filter( ( r ) => r.ok ); + const failed = results.filter( ( r ) => ! r.ok ); + + if ( succeeded.length > 0 ) { + setSavedBaselines( ( prev ) => { + const next = { ...prev }; + succeeded.forEach( ( { tab, snapshot } ) => { + next[ tab ] = snapshot; + } ); + return next; } ); - } catch ( error ) { - console.error( error ); } - }, 1000 ); - - // Handle global settings change. - function updateGlobalSettings( setting, value, tab ) { - let updatedTabOptions; - - if ( tab === 'email-settings' ) { - updatedTabOptions = { - ...emailTabOptions, - srfm_tab: tab, - [ setting ]: value, - }; - setEmailTabOptions( updatedTabOptions ); - } else if ( tab === 'general-settings' ) { - updatedTabOptions = { - ...generalTabOptions, - srfm_tab: tab, - [ setting ]: value, - }; - setGeneralTabOptions( updatedTabOptions ); - } else if ( tab === 'security-settings' ) { - updatedTabOptions = { - ...securitytabOptions, - srfm_tab: tab, - [ setting ]: value, - }; - setSecurityTabOptions( updatedTabOptions ); - } else if ( tab === 'general-settings-dynamic-opt' ) { - updatedTabOptions = { - ...dynamicBlockOptions, - srfm_tab: tab, - [ setting ]: value, - }; - setDynamicBlockOptions( updatedTabOptions ); - } else if ( tab === 'mcp-settings' ) { - updatedTabOptions = { - ...mcpTabOptions, - srfm_tab: tab, - [ setting ]: value, - }; - setMcpTabOptions( updatedTabOptions ); - } else if ( tab === 'payments-settings' ) { - updatedTabOptions = { - ...paymentsSettings, - srfm_tab: tab, - [ setting ]: value, - }; - setPaymentsSettings( updatedTabOptions ); + + if ( failed.length === 0 ) { + toast.success( __( 'Settings saved.', 'sureforms' ) ); + } else if ( succeeded.length === 0 ) { + toast.error( __( 'Failed to save settings.', 'sureforms' ) ); } else { - return; + toast.error( + __( + 'Some settings failed to save. Please retry.', + 'sureforms' + ) + ); } - debouncedSave( updatedTabOptions, tab ); - } + + setIsSaving( false ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + dirtyTabs, + isAnyTabDirty, + isSaving, + dynamicBlockOptions, + emailTabOptions, + ] ); + + // Native browser confirmation when closing the tab/window with unsaved + // changes. + useEffect( () => { + if ( ! isAnyTabDirty ) { + return undefined; + } + const handler = ( e ) => { + e.preventDefault(); + e.returnValue = ''; + }; + window.addEventListener( 'beforeunload', handler ); + return () => window.removeEventListener( 'beforeunload', handler ); + }, [ isAnyTabDirty ] ); + + // Push the free-tab dirty signal into Redux so the tab-switch guard + // (`UnsavedChangesGuard`) and any other observer can react without + // holding a reference to this component. + const { + setGlobalSettingsPageDirty, + requestGlobalSettingsExtensionSave, + } = useDispatch( SRFM_STORE_NAME ); + useEffect( () => { + setGlobalSettingsPageDirty( isAnyTabDirty ); + }, [ isAnyTabDirty, setGlobalSettingsPageDirty ] ); + + // Aggregate dirty + isSaving contributions from filter-driven + // extension panels (pro IP/Country/Keyword Defaults under Form + // Restrictions, etc.). OR-folded into the header Save button's + // `isDirty` / `isSaving` below so the button activates on extension + // edits AND shows its spinner while an extension panel is + // mid-POST. Extensions push booleans via + // `setGlobalSettingsExtensionDirty(slot, dirty)` / + // `setGlobalSettingsExtensionSaving(slot, saving)`. + const extensionsDirty = useSelect( + ( select ) => + select( SRFM_STORE_NAME ) + ?.selectGlobalSettingsExtensionsDirtyAggregate?.() || false, + [] + ); + const extensionsSaving = useSelect( + ( select ) => + select( SRFM_STORE_NAME ) + ?.selectGlobalSettingsExtensionsSavingAggregate?.() || false, + [] + ); + + // Expose a discard callback on `window` so the guard can revert + // free-tab state to baselines before navigating. Pro tabs don't need + // this — they unmount on tab-switch and lose state implicitly. + useEffect( () => { + window.__srfm_global_settings_discard = () => { + if ( savedBaselines[ 'general-settings' ] ) { + setGeneralTabOptions( savedBaselines[ 'general-settings' ] ); + } + if ( savedBaselines[ 'email-settings' ] ) { + setEmailTabOptions( savedBaselines[ 'email-settings' ] ); + } + if ( savedBaselines[ 'security-settings' ] ) { + setSecurityTabOptions( savedBaselines[ 'security-settings' ] ); + } + if ( savedBaselines[ 'mcp-settings' ] ) { + setMcpTabOptions( savedBaselines[ 'mcp-settings' ] ); + } + if ( savedBaselines[ 'general-settings-dynamic-opt' ] ) { + setDynamicBlockOptions( + savedBaselines[ 'general-settings-dynamic-opt' ] + ); + } + if ( savedBaselines[ 'payments-settings' ] ) { + setPaymentsSettings( savedBaselines[ 'payments-settings' ] ); + } + if ( savedBaselines[ 'form-restriction-settings' ] ) { + setFormRestrictionOptions( + savedBaselines[ 'form-restriction-settings' ] + ); + } + if ( savedBaselines[ 'compliance-settings' ] ) { + setComplianceOptions( savedBaselines[ 'compliance-settings' ] ); + } + if ( savedBaselines[ 'form-confirmation-settings' ] ) { + setFormConfirmationOptions( + savedBaselines[ 'form-confirmation-settings' ] + ); + } + if ( savedBaselines[ 'email-notification-settings' ] ) { + setEmailNotificationOptions( + savedBaselines[ 'email-notification-settings' ] + ); + } + }; + return () => { + delete window.__srfm_global_settings_discard; + }; + }, [ savedBaselines ] ); + + // If a tab component (e.g. a pro tab) has registered its own save + // adapter, route the header Save button to it instead of the free + // auto-save flow. The adapter exposes primitive isDirty/isSaving via + // Redux and the onSave function via the tab-save-adapter registry. + const tabAdapter = useSelect( + ( select ) => + select( SRFM_STORE_NAME )?.selectGlobalSettingsTabAdapter + ? select( SRFM_STORE_NAME ).selectGlobalSettingsTabAdapter( + path + ) + : null, + [ path ] + ); + + // Wrap the base save handler so a single header click also pings + // every registered extension panel (via the + // `extensionSaveCounter` Redux counter). Pro panels subscribe and + // fire their own POSTs in parallel with whatever the host runs — + // no need for the host to know each panel's REST surface or + // payload shape. + const baseHeaderOnSave = tabAdapter + ? () => { + const handler = getTabSaveHandler( path ); + if ( handler ) { + handler(); + } + } + : saveAllDirtyTabs; + const headerOnSave = () => { + // Scope the bump to the currently-active page so extensions + // registered to a different tab don't fire their POST. Extensions + // read `selectGlobalSettingsExtensionSaveTab` and bail out when + // the slug doesn't match. + requestGlobalSettingsExtensionSave( path ); + baseHeaderOnSave(); + }; + const headerIsDirty = tabAdapter + ? tabAdapter.isDirty || extensionsDirty + : isAnyTabDirty || extensionsDirty; + const headerIsSaving = + ( tabAdapter ? tabAdapter.isSaving : isSaving ) || extensionsSaving; + const pathsForFullWidth = [ 'ottokit-settings', 'integration-settings' ]; - const isFullWidth = pathsForFullWidth.includes( path ) || + const isFullWidth = + pathsForFullWidth.includes( path ) || ( 'google-maps-settings' === path && ! srfm_admin?.is_pro_active ); return ( @@ -310,9 +704,11 @@ const Component = ( { path, subpage } ) => { title={ pageTitle } hidePageTitle={ hidePageTitle } helpText={ helpText } + onSave={ headerOnSave } + isDirty={ headerIsDirty } + isSaving={ headerIsSaving } /> ) } - { /* Added the below check to make the container full width for the OttoKit tab. */ } <div className={ cn( 'mx-auto p-4 rounded-xl bg-background-primary shadow-sm', @@ -327,6 +723,17 @@ const Component = ( { path, subpage } ) => { updateGlobalSettings={ updateGlobalSettings } /> ) } + { 'global-defaults' === path && ( + <GlobalDefaultsPage + loading={ loading } + formRestrictionOptions={ formRestrictionOptions } + complianceOptions={ complianceOptions } + emailNotificationOptions={ emailNotificationOptions } + formConfirmationOptions={ formConfirmationOptions } + updateGlobalSettings={ updateGlobalSettings } + toast={ toast } + /> + ) } { 'validation-settings' === path && ( <ValidationsPage loading={ loading } @@ -364,10 +771,7 @@ const Component = ( { path, subpage } ) => { <IntegrationPage loading={ loading } /> ) } { 'google-maps-settings' === path && ( - <GoogleMapsPage - loading={ loading } - toast={ toast } - /> + <GoogleMapsPage loading={ loading } toast={ toast } /> ) } { 'payments-settings' === path && ( <PaymentsPage diff --git a/src/admin/settings/Navigation.js b/src/admin/settings/Navigation.js index 67069db6f..52d561053 100644 --- a/src/admin/settings/Navigation.js +++ b/src/admin/settings/Navigation.js @@ -1,7 +1,9 @@ import { __ } from '@wordpress/i18n'; import { Link, useLocation } from 'react-router-dom'; import { applyFilters } from '@wordpress/hooks'; +import { useSelect, useDispatch } from '@wordpress/data'; import { cn } from '@Utils/Helpers'; +import { STORE_NAME as SRFM_STORE_NAME } from '../../store/constants'; import { Bot, Cpu, @@ -10,6 +12,7 @@ import { Settings, ShieldCheck, TriangleAlert, + Globe, } from 'lucide-react'; import { Accordion } from '@bsf/force-ui'; import ottoKitIcon from '@Image/ottokit.png'; @@ -28,6 +31,33 @@ const defaultNavigation = [ 'sureforms' ), }, + { + name: __( 'Global Defaults', 'sureforms' ), + slug: 'global-defaults', + icon: <Globe />, + submenu: [ + { + name: __( 'Email Notification', 'sureforms' ), + slug: 'email-notifications', + }, + { + name: __( 'Form Confirmation', 'sureforms' ), + slug: 'form-confirmation', + }, + { + name: __( 'Form Restrictions', 'sureforms' ), + slug: 'form-restrictions', + }, + { + name: __( 'Compliance Settings', 'sureforms' ), + slug: 'compliance-settings', + }, + ], + helpText: __( + 'Configure default settings that apply to newly created forms.', + 'sureforms' + ), + }, { name: __( 'Form Validation', 'sureforms' ), slug: 'validation-settings', @@ -141,25 +171,74 @@ const NavLink = ( { label, path, icon: Icon, subPage = '' } ) => { const activatedTab = useQuery(); const addActiveClass = false; + // Subscribe to the aggregate dirty signals so the click can be + // intercepted before react-router navigates. + const { pageDirty, proDirty } = useSelect( ( select ) => { + const store = select( SRFM_STORE_NAME ); + return { + pageDirty: store?.selectGlobalSettingsPageDirty + ? store.selectGlobalSettingsPageDirty() + : false, + proDirty: store?.selectAnyGlobalSettingsTabAdapterDirty + ? store.selectAnyGlobalSettingsTabAdapterDirty() + : false, + }; + }, [] ); + const { requestGlobalSettingsNavigation } = useDispatch( SRFM_STORE_NAME ); + const isActive = () => { + const currentTab = activatedTab.get( 'tab' ); + if ( subPage ) { - return activatedTab.get( 'subpage' ) === subPage; + const currentSubpage = activatedTab.get( 'subpage' ); + // If subpage matches and we're on the correct tab, it's active. + if ( currentTab === path && currentSubpage === subPage ) { + return true; + } + // Default 'email-notifications' as active when on global-defaults tab with no subpage. + if ( + currentTab === 'global-defaults' && + ! currentSubpage && + path === 'global-defaults' && + subPage === 'email-notifications' + ) { + return true; + } + return false; } - if ( activatedTab.get( 'tab' ) === path ) { + if ( currentTab === path ) { return true; } return false; }; + const targetSearch = `?page=sureforms_form_settings&tab=${ path }${ + subPage ? `&subpage=${ subPage }` : '' + }`; + + const onClick = ( e ) => { + // Already on this tab — let react-router skip the work. + if ( isActive() ) { + return; + } + if ( ! pageDirty && ! proDirty ) { + // Clean state: native react-router click. + return; + } + // Intercept: stash the destination and let `UnsavedChangesGuard` + // surface the modal. The actual navigation fires on confirm. + e.preventDefault(); + requestGlobalSettingsNavigation( targetSearch ); + }; + return ( <Link to={ { location: `${ srfm_admin.site_url }/wp-admin/admin.php`, - search: `?page=sureforms_form_settings&tab=${ path }${ - subPage ? `&subpage=${ subPage }` : '' - }`, + search: targetSearch, } } + onClick={ onClick } className={ cn( 'flex items-start gap-3.5 px-2.5 py-2 rounded-md transition-[colors,box-shadow] text-text-secondary hover:bg-brand-background-50 no-underline hover:no-underline focus:outline-none focus:ring-1 focus:ring-focus w-full', ( isActive() || diff --git a/src/admin/settings/UnsavedChangesGuard.js b/src/admin/settings/UnsavedChangesGuard.js new file mode 100644 index 000000000..e69c01473 --- /dev/null +++ b/src/admin/settings/UnsavedChangesGuard.js @@ -0,0 +1,62 @@ +import { __ } from '@wordpress/i18n'; +import { useSelect, useDispatch } from '@wordpress/data'; +import { useNavigate } from 'react-router-dom'; +import ConfirmationDialog from '@Admin/components/ConfirmationDialog'; +import { STORE_NAME as SRFM_STORE_NAME } from '../../store/constants'; + +/** + * Renders the "Unsaved changes" confirmation modal for the global + * settings page. Listens for `globalSettings.pendingNav` in the + * sureforms store — `Navigation.js` sets it when the user clicks a + * different tab while any free or pro tab is dirty. + * + * Confirm: invokes `window.__srfm_global_settings_discard` (registered + * by `Component.js`) to revert free-tab state to its saved baselines, + * clears `pendingNav`, and navigates via react-router. + * + * Cancel: clears `pendingNav` and leaves local state intact. The cancel + * button is labelled "Keep editing" so the copy matches what actually + * happens — Save is per-tab and must still be clicked manually. + */ +const UnsavedChangesGuard = () => { + const pendingNav = useSelect( + ( select ) => + select( SRFM_STORE_NAME )?.selectGlobalSettingsPendingNav?.() || + null, + [] + ); + const { clearGlobalSettingsPendingNav } = useDispatch( SRFM_STORE_NAME ); + const navigate = useNavigate(); + + const onConfirm = () => { + if ( ! pendingNav ) { + return; + } + const target = pendingNav.to; + clearGlobalSettingsPendingNav(); + if ( typeof window.__srfm_global_settings_discard === 'function' ) { + window.__srfm_global_settings_discard(); + } + navigate( target ); + }; + + const onCancel = () => clearGlobalSettingsPendingNav(); + + return ( + <ConfirmationDialog + isOpen={ pendingNav !== null } + title={ __( 'Unsaved changes', 'sureforms' ) } + description={ __( + 'Some fields have unsaved changes. Discard them to continue, or stay to save your edits.', + 'sureforms' + ) } + confirmButtonText={ __( 'Discard & switch', 'sureforms' ) } + cancelButtonText={ __( 'Keep editing', 'sureforms' ) } + onConfirm={ onConfirm } + onCancel={ onCancel } + destructiveConfirmButton + /> + ); +}; + +export default UnsavedChangesGuard; diff --git a/src/admin/settings/hooks/useWordPressPages.js b/src/admin/settings/hooks/useWordPressPages.js new file mode 100644 index 000000000..546d9b54a --- /dev/null +++ b/src/admin/settings/hooks/useWordPressPages.js @@ -0,0 +1,41 @@ +import { useState, useEffect } from '@wordpress/element'; +import apiFetch from '@wordpress/api-fetch'; +import { __ } from '@wordpress/i18n'; +import { toast } from '@bsf/force-ui'; + +/** + * Fetches published WordPress pages for use in page-selector dropdowns. + * + * @return {{ pageOptions: Array, loadingPages: boolean }} Page options and loading state. + */ +const useWordPressPages = () => { + const [ pageOptions, setPageOptions ] = useState( [] ); + const [ loadingPages, setLoadingPages ] = useState( true ); + + useEffect( () => { + apiFetch( { path: '/wp/v2/pages?per_page=100&status=publish' } ) + .then( ( pages ) => + setPageOptions( + pages.map( ( page ) => ( { + label: + page.title.rendered || + __( '(no title)', 'sureforms' ), + value: page.link, + } ) ) + ) + ) + .catch( () => + toast.error( + __( + 'Failed to load pages. Please refresh and try again.', + 'sureforms' + ) + ) + ) + .finally( () => setLoadingPages( false ) ); + }, [] ); + + return { pageOptions, loadingPages }; +}; + +export default useWordPressPages; diff --git a/src/admin/settings/pages/General.js b/src/admin/settings/pages/General.js index 6135a65c6..3d1b2714a 100644 --- a/src/admin/settings/pages/General.js +++ b/src/admin/settings/pages/General.js @@ -3,6 +3,263 @@ import { useState, useEffect } from '@wordpress/element'; import apiFetch from '@wordpress/api-fetch'; import { Button, Input, Loader, Select, Switch, toast } from '@bsf/force-ui'; import ContentSection from '../components/ContentSection'; +import LoadingSkeleton from '@Admin/components/LoadingSkeleton'; + +const days = [ + { label: __( 'Monday', 'sureforms' ), value: 'Monday' }, + { label: __( 'Tuesday', 'sureforms' ), value: 'Tuesday' }, + { label: __( 'Wednesday', 'sureforms' ), value: 'Wednesday' }, + { label: __( 'Thursday', 'sureforms' ), value: 'Thursday' }, + { label: __( 'Friday', 'sureforms' ), value: 'Friday' }, + { label: __( 'Saturday', 'sureforms' ), value: 'Saturday' }, + { label: __( 'Sunday', 'sureforms' ), value: 'Sunday' }, +]; + +/** + * Email Summaries settings section. + * + * @param {Object} props + * @param {Object} props.emailTabOptions - Email summary settings. + * @param {Function} props.updateGlobalSettings - Settings update handler. + */ +const EmailSummariesContent = ( { emailTabOptions, updateGlobalSettings } ) => { + const [ sendingTestEmail, setSendingTestEmail ] = useState( false ); + + const getReportsLabel = ( value ) => { + const selectedDay = days.find( ( day ) => day.value === value ); + return selectedDay ? selectedDay.label : ''; + }; + + return ( + <> + <Switch + label={ { + heading: __( 'Enable email summaries', 'sureforms' ), + } } + value={ emailTabOptions.srfm_email_summary } + onChange={ ( value ) => + updateGlobalSettings( + 'srfm_email_summary', + value, + 'email-settings' + ) + } + /> + { emailTabOptions.srfm_email_summary && ( + <> + <div className="flex items-end gap-2"> + <div className="flex-1"> + <Input + size="md" + label={ __( 'Send Email To', 'sureforms' ) } + type="email" + value={ emailTabOptions.srfm_email_sent_to } + onChange={ ( value ) => + updateGlobalSettings( + 'srfm_email_sent_to', + value, + 'email-settings' + ) + } + required + autoComplete="off" + /> + </div> + <Button + variant="outline" + size="md" + icon={ sendingTestEmail && <Loader /> } + iconPosition="left" + onClick={ async () => { + if ( sendingTestEmail ) { + return; + } + + setSendingTestEmail( true ); + try { + await apiFetch( { + path: '/sureforms/v1/send-test-email-summary', + method: 'POST', + data: { + srfm_email_sent_to: + emailTabOptions.srfm_email_sent_to, + }, + } ).then( ( response ) => { + setSendingTestEmail( false ); + toast.success( response?.data ); + } ); + } catch ( error ) { + setSendingTestEmail( false ); + toast.error( error?.data ); + console.error( + 'Error Sending Test Email Summary:', + error + ); + } + } } + className="bg-background-secondary" + > + { __( 'Test Email', 'sureforms' ) } + </Button> + </div> + <Select + value={ getReportsLabel( + emailTabOptions.srfm_schedule_report + ) } + onChange={ ( value ) => + updateGlobalSettings( + 'srfm_schedule_report', + value, + 'email-settings' + ) + } + > + <Select.Button + type="button" + label={ __( 'Schedule Reports', 'sureforms' ) } + /> + <Select.Portal id="srfm-settings-container"> + <Select.Options> + { days.map( ( day ) => ( + <Select.Option + key={ day.value } + value={ day.value } + > + { day.label } + </Select.Option> + ) ) } + </Select.Options> + </Select.Portal> + </Select> + </> + ) } + </> + ); +}; + +/** + * IP Logging settings section. + * + * @param {Object} props + * @param {Object} props.generalTabOptions - General settings. + * @param {Function} props.updateGlobalSettings - Settings update handler. + */ +const IPLoggingContent = ( { generalTabOptions, updateGlobalSettings } ) => { + return ( + <> + <Switch + label={ { + heading: __( 'Enable IP logging', 'sureforms' ), + description: __( + "If this option is turned on, the user's IP address will be saved with the form data", + 'sureforms' + ), + } } + value={ generalTabOptions.srfm_ip_log } + onChange={ ( value ) => + updateGlobalSettings( + 'srfm_ip_log', + value, + 'general-settings' + ) + } + /> + </> + ); +}; + +/** + * Admin Notification settings section. + * + * @param {Object} props + * @param {Object} props.generalTabOptions - General settings. + * @param {Function} props.updateGlobalSettings - Settings update handler. + * @param {boolean} props.showLearnTip - Whether to show the Learn section guidance tooltip. + */ +const AdminNotificationContent = ( { + generalTabOptions, + updateGlobalSettings, + showLearnTip, +} ) => { + return ( + <div className="relative"> + <Switch + label={ { + heading: __( 'Enable Admin Notification', 'sureforms' ), + description: __( + 'Admin notifications keep you informed about new form entries since your last visit.', + 'sureforms' + ), + } } + value={ generalTabOptions.srfm_admin_notification } + onChange={ ( value ) => + updateGlobalSettings( + 'srfm_admin_notification', + value, + 'general-settings' + ) + } + /> + { showLearnTip && ( + <div className="absolute top-full left-1/3 -translate-x-1/2 mt-2 z-[999999] pointer-events-none"> + <div className="absolute -top-[5px] left-1/2 -translate-x-1/2 w-2.5 h-2.5 bg-[#1e1e1e] rotate-45" /> + <div className="bg-[#1e1e1e] text-white text-sm px-3 py-1.5 rounded-md shadow-md whitespace-nowrap"> + { __( + 'Turn on Admin Notification from here.', + 'sureforms' + ) } + </div> + </div> + ) } + </div> + ); +}; + +/** + * Usage Tracking / Analytics settings section. + * + * @param {Object} props + * @param {Object} props.generalTabOptions - General settings. + * @param {Function} props.updateGlobalSettings - Settings update handler. + */ +const UsageTrackingContent = ( { + generalTabOptions, + updateGlobalSettings, +} ) => { + return ( + <Switch + label={ { + heading: __( 'Help shape the future of SureForms', 'sureforms' ), + description: ( + <> + <p> + { __( + 'Collect non-sensitive information from your website, such as the PHP version and features used, to help us fix bugs faster, make smarter decisions, and build features that actually matter to you. ', + 'sureforms' + ) } + <a + href="https://sureforms.com/share-usage-data/" + target="_blank" + rel="noopener noreferrer" + className="text-field-helper" + > + { __( 'Learn More', 'sureforms' ) } + </a> + </p> + </> + ), + } } + value={ generalTabOptions.srfm_bsf_analytics } + onChange={ ( value ) => + updateGlobalSettings( + 'srfm_bsf_analytics', + value, + 'general-settings' + ) + } + /> + ); +}; const GeneralPage = ( { loading, @@ -30,247 +287,56 @@ const GeneralPage = ( { }; }, [ isLearnSource ] ); - const EmailSummariesContent = () => { - const [ sendingTestEmail, setSendingTestEmail ] = useState( false ); - - const days = [ - { label: __( 'Monday', 'sureforms' ), value: 'Monday' }, - { label: __( 'Tuesday', 'sureforms' ), value: 'Tuesday' }, - { label: __( 'Wednesday', 'sureforms' ), value: 'Wednesday' }, - { label: __( 'Thursday', 'sureforms' ), value: 'Thursday' }, - { label: __( 'Friday', 'sureforms' ), value: 'Friday' }, - { label: __( 'Saturday', 'sureforms' ), value: 'Saturday' }, - { label: __( 'Sunday', 'sureforms' ), value: 'Sunday' }, - ]; - - const getReportsLabel = ( value ) => { - const selectedDay = days.find( ( day ) => day.value === value ); - return selectedDay ? selectedDay.label : ''; - }; - + if ( loading ) { return ( - <> - <Switch - label={ { - heading: __( 'Enable email summaries', 'sureforms' ), - } } - value={ emailTabOptions.srfm_email_summary } - onChange={ ( value ) => - updateGlobalSettings( - 'srfm_email_summary', - value, - 'email-settings' - ) - } - /> - { emailTabOptions.srfm_email_summary && ( - <> - <div className="flex items-end gap-2"> - <div className="flex-1"> - <Input - size="md" - label={ __( 'Send Email To', 'sureforms' ) } - type="email" - value={ emailTabOptions.srfm_email_sent_to } - onChange={ ( value ) => - updateGlobalSettings( - 'srfm_email_sent_to', - value, - 'email-settings' - ) - } - required - autoComplete="off" - /> - </div> - <Button - variant="outline" - size="md" - icon={ sendingTestEmail && <Loader /> } - iconPosition="left" - onClick={ async () => { - if ( sendingTestEmail ) { - return; - } - - setSendingTestEmail( true ); - try { - await apiFetch( { - path: '/sureforms/v1/send-test-email-summary', - method: 'POST', - data: { - srfm_email_sent_to: - emailTabOptions.srfm_email_sent_to, - }, - } ).then( ( response ) => { - setSendingTestEmail( false ); - toast.success( response?.data ); - } ); - } catch ( error ) { - setSendingTestEmail( false ); - toast.error( error?.data ); - console.error( - 'Error Sending Test Email Summary:', - error - ); - } - } } - className="bg-background-secondary" - > - { __( 'Test Email', 'sureforms' ) } - </Button> - </div> - <Select - value={ getReportsLabel( - emailTabOptions.srfm_schedule_report - ) } - onChange={ ( value ) => - updateGlobalSettings( - 'srfm_schedule_report', - value, - 'email-settings' - ) - } - > - <Select.Button - type="button" - label={ __( 'Schedule Reports', 'sureforms' ) } - /> - <Select.Portal id="srfm-settings-container"> - <Select.Options> - { days.map( ( day ) => ( - <Select.Option - key={ day.value } - value={ day.value } - > - { day.label } - </Select.Option> - ) ) } - </Select.Options> - </Select.Portal> - </Select> - </> - ) } - </> - ); - }; - - const IPLoggingContent = () => { - return ( - <> - <Switch - label={ { - heading: __( 'Enable IP logging', 'sureforms' ), - description: __( - "If this option is turned on, the user's IP address will be saved with the form data", - 'sureforms' - ), - } } - value={ generalTabOptions.srfm_ip_log } - onChange={ ( value ) => - updateGlobalSettings( - 'srfm_ip_log', - value, - 'general-settings' - ) - } - /> - </> - ); - }; - - const AdminNotificationContent = () => { - return ( - <div className="relative"> - <Switch - label={ { - heading: __( 'Enable Admin Notification', 'sureforms' ), - description: __( - 'Admin notifications keep you informed about new form entries since your last visit.', - 'sureforms' - ), - } } - value={ generalTabOptions.srfm_admin_notification } - onChange={ ( value ) => - updateGlobalSettings( - 'srfm_admin_notification', - value, - 'general-settings' - ) - } - /> - { showLearnTip && ( - <div className="absolute top-full left-1/3 -translate-x-1/2 mt-2 z-[999999] pointer-events-none"> - <div className="absolute -top-[5px] left-1/2 -translate-x-1/2 w-2.5 h-2.5 bg-[#1e1e1e] rotate-45" /> - <div className="bg-[#1e1e1e] text-white text-sm px-3 py-1.5 rounded-md shadow-md whitespace-nowrap"> - { __( - 'Turn on Admin Notification from here.', - 'sureforms' - ) } - </div> - </div> - ) } + <div className="space-y-6"> + <LoadingSkeleton count={ 6 } className="h-6 rounded-sm" /> </div> ); - }; - - const UsageTrackingContent = () => { - return ( - <Switch - label={ { - heading: __( 'Help shape the future of SureForms', 'sureforms' ), - description: ( - <> - <p> - { __( - 'Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. ', - 'sureforms' - ) } - <a - href="https://sureforms.com/share-usage-data/" - target="_blank" - rel="noopener noreferrer" - className="text-field-helper" - > - { __( 'Learn More', 'sureforms' ) } - </a> - </p> - </> - ), - } } - value={ generalTabOptions.srfm_bsf_analytics } - onChange={ ( value ) => - updateGlobalSettings( - 'srfm_bsf_analytics', - value, - 'general-settings' - ) - } - /> - ); - }; + } return ( <div className="space-y-6"> <ContentSection loading={ loading } title={ __( 'Email Summaries', 'sureforms' ) } - content={ EmailSummariesContent() } + content={ + <EmailSummariesContent + emailTabOptions={ emailTabOptions } + updateGlobalSettings={ updateGlobalSettings } + /> + } /> <ContentSection loading={ loading } title={ __( 'IP Logging', 'sureforms' ) } - content={ IPLoggingContent() } + content={ + <IPLoggingContent + generalTabOptions={ generalTabOptions } + updateGlobalSettings={ updateGlobalSettings } + /> + } /> <ContentSection loading={ loading } title={ __( 'Admin Notification', 'sureforms' ) } - content={ AdminNotificationContent() } + content={ + <AdminNotificationContent + generalTabOptions={ generalTabOptions } + updateGlobalSettings={ updateGlobalSettings } + showLearnTip={ showLearnTip } + /> + } /> <ContentSection loading={ loading } title={ __( 'Anonymous Analytics', 'sureforms' ) } - content={ UsageTrackingContent() } + content={ + <UsageTrackingContent + generalTabOptions={ generalTabOptions } + updateGlobalSettings={ updateGlobalSettings } + /> + } /> </div> ); diff --git a/src/admin/settings/pages/GlobalDefaults.js b/src/admin/settings/pages/GlobalDefaults.js new file mode 100644 index 000000000..03958afab --- /dev/null +++ b/src/admin/settings/pages/GlobalDefaults.js @@ -0,0 +1,548 @@ +import { __ } from '@wordpress/i18n'; +import { useState, useEffect, useRef } from '@wordpress/element'; +import { applyFilters } from '@wordpress/hooks'; +import { useLocation } from 'react-router-dom'; +import { Container, Input, Label, Switch, TextArea } from '@bsf/force-ui'; +import LoadingSkeleton from '@Admin/components/LoadingSkeleton'; +import RadioGroup from '@Admin/components/RadioGroup'; +import { ComplianceFields } from '@Admin/shared-components/compliance'; +import { EmailNotificationFields } from '@Admin/shared-components/email-notification'; +import { ConfirmationFields } from '@Admin/shared-components/form-confirmation'; +import { + CONFIRMATION_TYPE_OPTIONS, + REDIRECT_SUB_OPTIONS, +} from '@Admin/shared-components/form-confirmation/constants'; +import ComponentKeyValueUI from '@Components/misc/ComponentKeyValueUI'; +import useWordPressPages from '../hooks/useWordPressPages'; + +/** + * Debounced Number Input Component + * Maintains local state to prevent focus loss on parent re-renders. + * Only syncs to parent on blur. + * @param {Object} root0 + * @param {*} root0.value + * @param {Function} root0.onChange + * @param {string} root0.label + * @param {number} root0.min + */ +const DebouncedNumberInput = ( { + value, + onChange, + label, + min = 0, + ...props +} ) => { + const [ localValue, setLocalValue ] = useState( value ); + + // Sync local state when external value changes. + useEffect( () => { + setLocalValue( value ); + }, [ value ] ); + + const handleBlur = () => { + let parsedValue = parseInt( localValue, 10 ); + if ( isNaN( parsedValue ) || parsedValue < min ) { + parsedValue = min; + setLocalValue( min ); + } + onChange( parsedValue ); + }; + + return ( + <Input + type="number" + value={ localValue } + label={ label } + onChange={ setLocalValue } + onBlur={ handleBlur } + { ...props } + /> + ); +}; + +/** + * Debounced TextArea Component + * Maintains local state to prevent focus loss on parent re-renders. + * Only syncs to parent on blur. + * @param {Object} root0 + * @param {string} root0.value + * @param {Function} root0.onChange + */ +const DebouncedTextArea = ( { value, onChange, ...props } ) => { + const [ localValue, setLocalValue ] = useState( value ); + + // Sync local state when external value changes. + useEffect( () => { + setLocalValue( value ); + }, [ value ] ); + + const handleBlur = () => { + onChange( localValue ); + }; + + return ( + <TextArea + value={ localValue } + onChange={ setLocalValue } + onBlur={ handleBlur } + { ...props } + /> + ); +}; + +/** + * Renders the Form Restrictions subpage content. + * + * Free renders the Maximum Entries subsection. Pro extends this view with + * additional subsections (IP, Country, Keyword, etc.) via the + * `srfm.settings.formRestriction.additionalSettings` filter. + * + * @param {Object} root0 + * @param {Object} root0.formRestrictionOptions - Current form restriction settings. + * @param {Function} root0.updateRestrictionSetting - Callback to update a restriction field. + * @param {Object} root0.toast - Toast singleton forwarded into the + * filter so pro shares free's Toaster. + */ +const FormRestrictionsContent = ( { + formRestrictionOptions, + updateRestrictionSetting, + toast, +} ) => { + const maxEntriesData = formRestrictionOptions?.max_entries || {}; + + return ( + <div className="space-y-6"> + { /* Maximum Number of Entries - matches single form settings */ } + <Container direction="column" className="gap-6"> + <Switch + size="sm" + label={ { + heading: __( 'Maximum Number of Entries', 'sureforms' ), + description: __( + 'Set the total number of submissions allowed for this form.', + 'sureforms' + ), + } } + checked={ maxEntriesData?.status ?? false } + onChange={ ( checked ) => + updateRestrictionSetting( + 'max_entries', + 'status', + checked + ) + } + /> + + { maxEntriesData?.status && ( + <> + <div className="flex gap-2 w-full"> + <div className="w-full"> + <DebouncedNumberInput + size="md" + className="w-full" + value={ maxEntriesData?.maxEntries ?? 0 } + label={ __( + 'Maximum Entries', + 'sureforms' + ) } + min={ 0 } + onChange={ ( value ) => + updateRestrictionSetting( + 'max_entries', + 'maxEntries', + value + ) + } + /> + </div> + </div> + + <div> + <Label className="mb-1.5"> + { __( + 'Response Description After Maximum Entries', + 'sureforms' + ) } + </Label> + <DebouncedTextArea + size="md" + className="w-full" + value={ + maxEntriesData?.message ?? + __( + "This form is now closed as we've received all the entries.", + 'sureforms' + ) + } + onChange={ ( value ) => + updateRestrictionSetting( + 'max_entries', + 'message', + value + ) + } + /> + </div> + </> + ) } + </Container> + + { /* + * Pro extension slot — IP / Country / Keyword (and any future + * paid restriction subsections) are injected here. Free renders + * nothing for this slot when Pro is inactive. + */ } + { applyFilters( + 'srfm.settings.formRestriction.additionalSettings', + null, + { formRestrictionOptions, updateRestrictionSetting, toast } + ) } + + </div> + ); +}; + +/** + * Renders the Compliance Settings subpage content. + * Uses shared ComplianceFields component for consistency with form-level settings. + * + * @param {Object} root0 + * @param {Object} root0.complianceOptions - Current compliance settings. + * @param {Function} root0.updateGlobalSettings - Settings update handler. + */ +const ComplianceSettingsContent = ( { + complianceOptions, + updateGlobalSettings, +} ) => ( + <div className="space-y-6"> + <ComplianceFields + context="global" + values={ complianceOptions } + onChange={ ( key, value ) => + updateGlobalSettings( key, value, 'compliance-settings' ) + } + /> + </div> +); + +const GlobalDefaultsPage = ( { + loading, + formRestrictionOptions, + complianceOptions, + emailNotificationOptions, + formConfirmationOptions, + updateGlobalSettings, + toast, +} ) => { + const location = useLocation(); + const { pageOptions, loadingPages } = useWordPressPages(); + + // Local state for email notification and form confirmation fields. + // Initialized as null so the skeleton remains visible until the API data + // has been loaded and synced. This prevents the QuillEditor from mounting + // with default content (which would trigger ReactQuill's onChange on init + // and overwrite saved values via the debounced auto-save). + const [ localEmailOptions, setLocalEmailOptions ] = useState( null ); + const [ localConfirmationOptions, setLocalConfirmationOptions ] = + useState( null ); + + // Sync local state once the initial data load completes (loading → false). + // With loading initialized as true in Component.js, this fires only after + // the API data is fetched and stored in the parent state. + const initialSyncDone = useRef( false ); + useEffect( () => { + if ( ! loading && ! initialSyncDone.current ) { + initialSyncDone.current = true; + setLocalEmailOptions( emailNotificationOptions ); + setLocalConfirmationOptions( formConfirmationOptions ); + } + }, [ loading, emailNotificationOptions, formConfirmationOptions ] ); + + // Refs accumulate all field changes that arrive within the debounce window + // so that fast multi-field edits are all saved in the same flush. + const emailPendingRef = useRef( {} ); + const emailTimerRef = useRef( null ); + const confirmPendingRef = useRef( {} ); + const confirmTimerRef = useRef( null ); + + // Keep a stable ref to updateGlobalSettings so the setTimeout callbacks + // always call the latest version (avoids stale-closure bugs). + const updateGlobalSettingsRef = useRef( updateGlobalSettings ); + useEffect( () => { + updateGlobalSettingsRef.current = updateGlobalSettings; + }, [ updateGlobalSettings ] ); + + /** + * Email notification change handler. + * Updates local state immediately (no focus loss) and debounces the + * parent state update to avoid re-renders during active typing. + * + * @param {string} key Field key. + * @param {*} value New value. + */ + const handleEmailChange = ( key, value ) => { + setLocalEmailOptions( ( prev ) => ( { ...prev, [ key ]: value } ) ); + emailPendingRef.current = { + ...emailPendingRef.current, + [ key ]: value, + }; + clearTimeout( emailTimerRef.current ); + emailTimerRef.current = setTimeout( () => { + const pending = emailPendingRef.current; + emailPendingRef.current = {}; + // Pass all pending changes as a single batch object so every + // field is merged in one updateGlobalSettings call, avoiding + // the stale-state data-loss that occurs when multiple setState + // calls are queued synchronously. + if ( Object.keys( pending ).length > 0 ) { + updateGlobalSettingsRef.current( + pending, + null, + 'email-notification-settings' + ); + } + }, 500 ); + }; + + /** + * Form confirmation change handler. + * Same debounce strategy as handleEmailChange. + * + * @param {string} key Field key. + * @param {*} value New value. + */ + const handleConfirmationChange = ( key, value ) => { + setLocalConfirmationOptions( ( prev ) => ( { + ...prev, + [ key ]: value, + } ) ); + confirmPendingRef.current = { + ...confirmPendingRef.current, + [ key ]: value, + }; + clearTimeout( confirmTimerRef.current ); + confirmTimerRef.current = setTimeout( () => { + const pending = confirmPendingRef.current; + confirmPendingRef.current = {}; + // Same batch strategy as email: one call with all pending fields. + if ( Object.keys( pending ).length > 0 ) { + updateGlobalSettingsRef.current( + pending, + null, + 'form-confirmation-settings' + ); + } + }, 500 ); + }; + + /** + * Render query parameters UI for confirmation redirect types. + */ + const renderQueryParams = () => { + return ( + <ComponentKeyValueUI + data={ localConfirmationOptions?.query_params ?? [ { '': '' } ] } + enabled={ localConfirmationOptions?.enable_query_params ?? false } + setEnabled={ ( checked ) => + handleConfirmationChange( 'enable_query_params', checked ) + } + label={ __( 'Add Query Parameters', 'sureforms' ) } + helpText={ __( + 'Select if you want to add key-value pairs for form fields to include in query parameters', + 'sureforms' + ) } + withSmartTags={ false } + header={ __( 'Query Parameters', 'sureforms' ) } + handleOnChange={ ( queryParams ) => + handleConfirmationChange( 'query_params', queryParams ) + } + /> + ); + }; + + const getCurrentSubpage = () => { + try { + const searchParams = new URLSearchParams( location.search ); + // Default to 'email-notifications' if no subpage is specified. + return searchParams.get( 'subpage' ) || 'email-notifications'; + } catch ( error ) { + return 'email-notifications'; + } + }; + + /** + * Updates a specific restriction setting and saves to backend. + * + * @param {string} restrictionType - The restriction type key (e.g., 'max_entries', 'ip_restriction'). + * @param {string} field - The field to update within the restriction. + * @param {*} value - The new value for the field. + */ + const updateRestrictionSetting = ( restrictionType, field, value ) => { + const updatedRestriction = { + ...( formRestrictionOptions?.[ restrictionType ] || {} ), + [ field ]: value, + }; + updateGlobalSettings( + restrictionType, + updatedRestriction, + 'form-restriction-settings' + ); + }; + + /** + * Check if the current confirmation type is a redirect type. + * Uses localConfirmationOptions so radio buttons update instantly. + */ + const isRedirectType = + localConfirmationOptions?.confirmation_type === 'different page' || + localConfirmationOptions?.confirmation_type === 'custom url'; + + /** + * Check if the confirmation option is active (for radio button). + * @param {Object} option + * @param {string} confirmationType + */ + const isOptionActive = ( option, confirmationType ) => { + return ( + option.value === confirmationType || + ( option.value === 'different page' && + ( confirmationType === 'different page' || + confirmationType === 'custom url' ) ) + ); + }; + + const currentSubpage = getCurrentSubpage(); + + // Return null if no valid subpage is selected. + const validSubpages = [ + 'email-notifications', + 'form-confirmation', + 'form-restrictions', + 'compliance-settings', + ]; + if ( ! validSubpages.includes( currentSubpage ) ) { + return null; + } + + if ( + loading || + localEmailOptions === null || + localConfirmationOptions === null + ) { + return ( + <div className="space-y-6"> + <LoadingSkeleton count={ 6 } className="h-6 rounded-sm" /> + </div> + ); + } + + // Each subpage is rendered with a direct stable component reference (not an + // inline-defined wrapper function). This is the key fix for the focus-loss + // bug: using <InlineComponent /> where the function is re-created on every + // parent render causes React to unmount+remount the entire subtree on each + // keystroke, destroying focus. Stable module-level refs update in place. + return ( + <div className="w-full space-y-6"> + { currentSubpage === 'email-notifications' && ( + <EmailNotificationFields + context="global" + values={ localEmailOptions } + onChange={ handleEmailChange } + showNameField={ false } + showAllDataTag={ true } + loading={ loading } + wrapWithContentSection={ true } + /> + ) } + + { currentSubpage === 'form-confirmation' && ( + <div className="space-y-6"> + { /* Confirmation Type Selector */ } + <div className="space-y-2"> + <Label> + { __( 'Confirmation Type', 'sureforms' ) } + </Label> + <div> + <RadioGroup> + { CONFIRMATION_TYPE_OPTIONS.map( ( option ) => { + const isActive = isOptionActive( + option, + localConfirmationOptions?.confirmation_type + ); + return ( + <RadioGroup.Option + key={ option.value } + label={ option.label } + onChange={ () => + handleConfirmationChange( + 'confirmation_type', + option.value + ) + } + value={ option.value } + checked={ isActive } + /> + ); + } ) } + </RadioGroup> + </div> + </div> + + { /* Redirect Sub-options */ } + { isRedirectType && ( + <div className="space-y-2"> + <Label>{ __( 'Redirect to', 'sureforms' ) }</Label> + <RadioGroup cols={ 2 }> + { REDIRECT_SUB_OPTIONS.map( ( subOption ) => ( + <RadioGroup.Option + key={ subOption.value } + label={ subOption.label } + value={ subOption.value } + checked={ + localConfirmationOptions?.confirmation_type === + subOption.value + } + onChange={ () => + handleConfirmationChange( + 'confirmation_type', + subOption.value + ) + } + /> + ) ) } + </RadioGroup> + </div> + ) } + + { /* Confirmation Fields (shared component) */ } + <ConfirmationFields + context="global" + data={ localConfirmationOptions } + onChange={ handleConfirmationChange } + pageOptions={ pageOptions } + loadingPages={ loadingPages } + showQueryParams={ true } + renderQueryParams={ renderQueryParams } + /> + </div> + ) } + + { currentSubpage === 'form-restrictions' && ( + <FormRestrictionsContent + formRestrictionOptions={ formRestrictionOptions } + updateRestrictionSetting={ updateRestrictionSetting } + toast={ toast } + /> + ) } + + { currentSubpage === 'compliance-settings' && ( + <ComplianceSettingsContent + complianceOptions={ complianceOptions } + updateGlobalSettings={ updateGlobalSettings } + /> + ) } + </div> + ); +}; + +export default GlobalDefaultsPage; diff --git a/src/admin/settings/settings.js b/src/admin/settings/settings.js index 331ac0578..1469c035d 100644 --- a/src/admin/settings/settings.js +++ b/src/admin/settings/settings.js @@ -1,9 +1,11 @@ import { createRoot, useEffect, useState } from '@wordpress/element'; import { BrowserRouter as Router, useLocation } from 'react-router-dom'; import FormPageHeader from '../components/PageHeader'; +import '../tw-base.scss'; import Navigation from './Navigation'; import Component from './Component'; +import UnsavedChangesGuard from './UnsavedChangesGuard'; import { Toaster } from '@bsf/force-ui'; import { cn } from '@Utils/Helpers'; @@ -97,7 +99,7 @@ const Settings = () => { <Router> <FormPageHeader /> <div - className="grid grid-cols-[15rem_1fr] auto-rows-fr bg-background-secondary before:content-['_'] before:fixed before:inset-0 before:h-full before:w-[var(--bg-width)] before:bg-background-primary before:shadow-sm rtl:before:right-0 rtl:before:left-auto" + className="grid grid-cols-[15rem_1fr] auto-rows-fr min-h-screen bg-background-secondary before:content-['_'] before:fixed before:inset-0 before:h-full before:w-[var(--bg-width)] before:bg-background-primary before:shadow-sm rtl:before:right-0 rtl:before:left-auto" style={ backgroundStyle } > <Navigation /> @@ -107,6 +109,7 @@ const Settings = () => { </div> </div> </div> + <UnsavedChangesGuard /> </Router> <Toaster className={ cn( @@ -133,5 +136,14 @@ export default Settings; } } - document.addEventListener( 'DOMContentLoaded', renderApp ); + // Footer scripts run synchronously and in dependency order, so pro's + // settings bundle runs AFTER this file. If we render immediately, pro's + // `addFilter( 'srfm.settings.navigation', ... )` (and other settings-page + // filters) hasn't run yet and the License tab — plus any other pro-injected + // tab/page-content — is missing from the first paint. + // + // Defer one event-loop tick so every dependent script (pro + any third + // party) has finished registering its filters before React calls + // applyFilters during the first render. + setTimeout( renderApp, 0 ); }() ); diff --git a/src/admin/settings/tab-save-adapter.js b/src/admin/settings/tab-save-adapter.js new file mode 100644 index 000000000..7d545c243 --- /dev/null +++ b/src/admin/settings/tab-save-adapter.js @@ -0,0 +1,74 @@ +import { useEffect } from '@wordpress/element'; +import { dispatch } from '@wordpress/data'; +// Side-effect import: ensures the `sureforms` store is registered in the +// shared `wp.data` registry before this hook runs, even when imported +// from a separate webpack entry (e.g. pro bundles). +import '../../store/store'; +import { STORE_NAME as SRFM_STORE_NAME } from '../../store/constants'; + +// Cross-bundle handler registry. Pro plugins ship in a separate webpack +// bundle; both bundles reach the same `wp.data` store, but module-scope +// JS state is per-bundle. Hoisting the map onto `window` lets free's +// `Component.js` invoke a save handler registered from pro's bundle. +// Snake_case namespace matches the repo's existing `window.__srfm_*` +// globals (e.g. `__srfm_google_maps_filter_registered`). +const handlers = + ( typeof window !== 'undefined' && window.__srfm_tab_save_handlers ) || + new Map(); +if ( typeof window !== 'undefined' && ! window.__srfm_tab_save_handlers ) { + window.__srfm_tab_save_handlers = handlers; +} + +/** + * Hook for tab components that own their own save logic (e.g. pro + * Google Maps, pro User Registration). Registers an entry in the + * sureforms store's `tabAdapters` slice (for free's header Save button + * to read `isDirty` / `isSaving` from) and registers `onSave` in the + * cross-bundle handler map (so the header Save click reaches the tab). + * + * @param {string} slug Tab slug (matches the path used by Component.js). + * @param {Object} options Adapter state + save handler. + * @param {boolean} options.isDirty Whether this tab has unsaved changes. + * @param {boolean} options.isSaving Whether this tab is currently saving. + * @param {Function} options.onSave Click handler for the header Save button. + */ +export const useGlobalSettingsTabSaveAdapter = ( + slug, + { isDirty, isSaving, onSave } +) => { + // Register save handler in the cross-bundle map. We dispatch + // imperatively (not via `useDispatch`) because `useDispatch` can + // resolve to `null` if pro mounts before free finishes registering + // the store. The side-effect import above ensures the store IS + // registered by the time this code runs. + useEffect( () => { + handlers.set( slug, onSave ); + return () => { + handlers.delete( slug ); + }; + }, [ slug, onSave ] ); + + useEffect( () => { + const srfmDispatch = dispatch( SRFM_STORE_NAME ); + srfmDispatch?.setGlobalSettingsTabAdapter?.( slug, { + isDirty, + isSaving, + } ); + }, [ slug, isDirty, isSaving ] ); + + useEffect( () => { + return () => { + const srfmDispatch = dispatch( SRFM_STORE_NAME ); + srfmDispatch?.removeGlobalSettingsTabAdapter?.( slug ); + }; + }, [ slug ] ); +}; + +/** + * Look up the registered save handler for a tab slug. Returns null when + * no adapter is registered. + * + * @param {string} slug Tab slug. + * @return {Function|null} Registered save handler or null. + */ +export const getTabSaveHandler = ( slug ) => handlers.get( slug ) || null; diff --git a/src/admin/shared-components/compliance/ComplianceFields.js b/src/admin/shared-components/compliance/ComplianceFields.js new file mode 100644 index 000000000..1bb350215 --- /dev/null +++ b/src/admin/shared-components/compliance/ComplianceFields.js @@ -0,0 +1,151 @@ +import { __ } from '@wordpress/i18n'; +import { useState, useEffect } from '@wordpress/element'; +import { Input, Switch, Label, Container } from '@bsf/force-ui'; + +/** + * Debounced Number Input for Compliance + * Maintains local state to prevent focus loss on parent re-renders. + * Only syncs to parent on blur. + * @param {Object} root0 + * @param {*} root0.value + * @param {Function} root0.onChange + * @param {string} root0.context + */ +const DebouncedDaysInput = ( { value, onChange, context, ...props } ) => { + const [ localValue, setLocalValue ] = useState( value ); + + // Sync local state when external value changes. + useEffect( () => { + setLocalValue( value ); + }, [ value ] ); + + const handleBlur = () => { + let parsedValue = parseInt( localValue, 10 ); + + // Ensure value is at least 1. + if ( isNaN( parsedValue ) || parsedValue < 1 ) { + parsedValue = 1; + setLocalValue( context === 'form' ? '1' : 1 ); + } + + // Form context stores as string, global stores as number. + const finalValue = + context === 'form' ? parsedValue.toString() : parsedValue; + onChange( finalValue ); + }; + + return ( + <Input + type="number" + value={ localValue } + onChange={ setLocalValue } + onBlur={ handleBlur } + { ...props } + /> + ); +}; + +/** + * Shared Compliance Fields Component + * + * Context-aware component for rendering compliance settings (GDPR, auto-delete, etc.) + * Can be used in both form-level and global settings contexts. + * + * @param {Object} props + * @param {string} props.context - 'form' | 'global' - determines data handling context + * @param {Object} props.values - Current compliance values { gdpr, do_not_store_entries, auto_delete_entries, auto_delete_days } + * @param {Function} props.onChange - Handler: (fieldKey, value) => void + */ +const ComplianceFields = ( { context, values, onChange } ) => { + // Define the compliance switches configuration. + // Conditional visibility based on current values. + const switches = [ + { + id: 'gdpr', + label: { + heading: __( 'Enable GDPR Compliance', 'sureforms' ), + description: __( + 'When enabled this form will not store User IP, Browser Name and the Device Name in the Entries.', + 'sureforms' + ), + }, + }, + { + id: 'do_not_store_entries', + label: { + heading: __( + 'Never store entry data after form submission', + 'sureforms' + ), + description: __( + 'When enabled this form will never store Entries.', + 'sureforms' + ), + }, + condition: values?.gdpr, + }, + { + id: 'auto_delete_entries', + label: { + heading: __( 'Automatically delete entries', 'sureforms' ), + description: __( + 'When enabled this form will automatically delete entries after a certain period of time.', + 'sureforms' + ), + }, + condition: values?.gdpr && ! values?.do_not_store_entries, + }, + ]; + + // Determine if auto_delete_days input should be shown. + const showAutoDeleteDays = + values?.auto_delete_entries && + ! values?.do_not_store_entries && + values?.gdpr; + + return ( + <Container direction="column" className="gap-6"> + { switches.map( + ( { id, label, condition = true } ) => + condition && ( + <Switch + key={ id } + label={ label } + value={ values?.[ id ] ?? false } + onChange={ ( val ) => onChange( id, val ) } + /> + ) + ) } + { showAutoDeleteDays && ( + <Container direction="column" className="gap-1.5"> + <DebouncedDaysInput + aria-label={ __( + 'Entries older than the selected days will be deleted.', + 'sureforms' + ) } + size="md" + value={ + values?.auto_delete_days ?? + ( context === 'form' ? '30' : 30 ) + } + label={ __( 'Entries Time Period', 'sureforms' ) } + context={ context } + onChange={ ( value ) => + onChange( 'auto_delete_days', value ) + } + /> + <Container gap="0" align="center"> + <Label tag="p" size="sm" variant="help"> + { __( + 'Entries older than the days set will be deleted automatically.', + 'sureforms' + ) } + </Label> + </Container> + </Container> + ) } + </Container> + ); +}; + +export default ComplianceFields; diff --git a/src/admin/shared-components/compliance/index.js b/src/admin/shared-components/compliance/index.js new file mode 100644 index 000000000..869b5cedd --- /dev/null +++ b/src/admin/shared-components/compliance/index.js @@ -0,0 +1 @@ +export { default as ComplianceFields } from './ComplianceFields'; diff --git a/src/admin/shared-components/email-notification/EmailNotificationFields.js b/src/admin/shared-components/email-notification/EmailNotificationFields.js new file mode 100644 index 000000000..353115cce --- /dev/null +++ b/src/admin/shared-components/email-notification/EmailNotificationFields.js @@ -0,0 +1,454 @@ +import { __ } from '@wordpress/i18n'; +import { useState, useEffect } from '@wordpress/element'; +import ModalInputBox from '@Components/force-ui-components/ModalInputBox'; +import WarningBox from '@Components/misc/WarningBox'; +import Editor from '@Admin/single-form-settings/components/QuillEditor'; +import ContentSection from '@Admin/settings/components/ContentSection'; +import { + getFromEmailWarningMessage, + renderSureMailRecommendation, +} from '@Utils/emailValidation'; +import { useEmailSmartTags } from './useEmailSmartTags'; + +/** + * Shared Email Notification Fields Component + * + * Context-aware component for rendering email notification settings. + * Can be used in both form-level and global settings contexts. + * + * @param {Object} props + * @param {string} props.context - 'form' | 'global' + * @param {Object} props.values - Current email notification values + * @param {Function} props.onChange - Handler: (fieldKey, value) => void + * @param {boolean} props.showNameField - Show name field (form context only) + * @param {boolean} props.showAllDataTag - Show {all_data} in editor (form context only) + * @param {boolean} props.loading - Loading state (global context only) + * @param {boolean} props.wrapWithContentSection - Wrap fields in ContentSection (global context) + * @param {string} props.dynamicSubject - External subject state (form context for smart tags) + * @param {Function} props.setDynamicSubject - External subject setter (form context) + * @param {JSX.Element} props.renderAfterEmailBody - Optional JSX rendered between the Email Body + * and From Name fields. Used by the form-level + * EmailConfirmation to inject "Send as Raw + * HTML" + filter-driven extensions (e.g. pro + * "Attach Uploaded Files") at the same + * position the legacy single-form options array + * placed them in master. + * @param {JSX.Element} props.renderAfterFields - Optional JSX rendered after every field + * (i.e. after Reply To). Used for trailing + * extension panels (e.g. pro "Add Trigger + * Conditions" which master pushed to the end + * of the single-form options array). + */ +const EmailNotificationFields = ( { + context, + values, + onChange, + showNameField = false, + showAllDataTag = false, + loading = false, + wrapWithContentSection = false, + dynamicSubject, + setDynamicSubject, + renderAfterEmailBody = null, + renderAfterFields = null, +} ) => { + const [ fromEmailWarningMessage, setFromEmailWarningMessage ] = + useState( '' ); + + // Get smart tags based on context. + const { smartTags, emailSmartTags, formSmartTags } = + useEmailSmartTags( context ); + + // Use internal subject state if external not provided. + const [ internalSubject, setInternalSubject ] = useState( + values?.subject || '' + ); + const subjectValue = + dynamicSubject !== undefined ? dynamicSubject : internalSubject; + const setSubjectValue = setDynamicSubject || setInternalSubject; + + // Sync internal subject with values when values change (for global context). + useEffect( () => { + if ( context === 'global' && dynamicSubject === undefined ) { + setInternalSubject( values?.subject || '' ); + } + }, [ values?.subject, context, dynamicSubject ] ); + + // Validate and show warning message for From Email. + useEffect( () => { + const warningResult = getFromEmailWarningMessage( values?.from_email ); + + if ( warningResult?.type === 'jsx' ) { + setFromEmailWarningMessage( + renderSureMailRecommendation( + warningResult.siteUrl, + warningResult.messageType + ) + ); + } else { + setFromEmailWarningMessage( warningResult ); + } + }, [ values?.from_email ] ); + + const emailHelpText = __( + 'Comma separated values are also accepted.', + 'sureforms' + ); + + const fromEmailHelpText = __( + 'Notifications can use only one From Email so please enter a single address.', + 'sureforms' + ); + + // Helper to get smart tag handler for appending tags. + const getSmartTagHandler = ( key, currentValue ) => ( tag ) => { + onChange( key, ( currentValue || '' ) + tag ); + }; + + // Helper for subject smart tag handler. + const getSubjectSmartTagHandler = () => ( tag ) => { + setSubjectValue( subjectValue + tag ); + }; + + // Handle subject change and sync with parent. + const handleSubjectChange = ( value ) => { + setSubjectValue( value ); + onChange( 'subject', value ); + }; + + /** + * Render a field, optionally wrapped in ContentSection. + * @param {string} title + * @param {JSX.Element} content + * @param {string} key + */ + const renderField = ( title, content, key ) => { + if ( wrapWithContentSection ) { + return ( + <ContentSection + key={ key } + loading={ loading } + title={ title } + content={ content } + /> + ); + } + return <div key={ key }>{ content }</div>; + }; + + // Build fields array based on context. + const fields = []; + + // Name field (form context only). + if ( showNameField ) { + fields.push( { + key: 'name', + title: __( 'Name', 'sureforms' ), + content: ( + <ModalInputBox + label={ __( 'Name', 'sureforms' ) } + id="srfm-email-notification-name" + value={ values?.name || '' } + onChange={ ( newInput ) => onChange( 'name', newInput ) } + showSmartTagList={ false } + smartTagList={ smartTags } + tagFor="srfm-email-notification-name" + setTargetData={ getSubjectSmartTagHandler() } + /> + ), + } ); + } + + // Send Email To field. + fields.push( { + key: 'email_to', + title: __( 'Send Email To', 'sureforms' ), + content: ( + <div className="space-y-4"> + <ModalInputBox + label={ __( 'Send Email To', 'sureforms' ) } + id="srfm-email-notification-to" + value={ values?.email_to || '' } + onChange={ ( val ) => onChange( 'email_to', val ) } + required={ true } + helpText={ emailHelpText } + smartTagList={ emailSmartTags } + tagFor={ + context === 'global' + ? 'globalEmailNotification.emailTo' + : 'emailConfirmation.sendEmailTo' + } + setTargetData={ getSmartTagHandler( + 'email_to', + values?.email_to + ) } + /> + </div> + ), + } ); + + // Subject field. + fields.push( { + key: 'subject', + title: __( 'Subject', 'sureforms' ), + content: ( + <div className="space-y-4"> + <ModalInputBox + label={ __( 'Subject', 'sureforms' ) } + id="srfm-email-notification-subject" + value={ subjectValue } + onChange={ handleSubjectChange } + required={ true } + smartTagList={ smartTags } + tagFor={ + context === 'global' + ? 'globalEmailNotification.subject' + : 'emailConfirmation.Subject' + } + setTargetData={ getSubjectSmartTagHandler() } + /> + </div> + ), + } ); + + // Email Body field. QuillEditor filters out non-user-driven onChange + // emissions (mount-time normalization, parent-prop sync), so this + // handler only ever runs for real user edits. + fields.push( { + key: 'email_body', + title: __( 'Confirmation Message', 'sureforms' ), + content: ( + <div className="py-2 gap-6"> + <Editor + handleContentChange={ ( newContent ) => + onChange( 'email_body', newContent ) + } + content={ values?.email_body || '' } + /* SF-2815 start: forward context so global shows generic tags only. */ + context={ context } + /* SF-2815 end. */ + { ...( showAllDataTag && { + formData: values, + setFormData: ( newData ) => { + Object.keys( newData ).forEach( ( key ) => { + if ( newData[ key ] !== values?.[ key ] ) { + onChange( key, newData[ key ] ); + } + } ); + }, + allData: true, + } ) } + /> + </div> + ), + } ); + + // From Name field. + fields.push( { + key: 'from_name', + title: __( 'From Name', 'sureforms' ), + content: ( + <div className="space-y-4"> + <ModalInputBox + label={ __( 'From Name', 'sureforms' ) } + id="srfm-email-notification-from-name" + value={ values?.from_name || '' } + onChange={ ( val ) => onChange( 'from_name', val ) } + required={ false } + smartTagList={ + context === 'form' + ? [ + { + tags: formSmartTags, + label: __( + 'Form input tags', + 'sureforms' + ), + }, + { + tags: + smartTags[ smartTags.length - 1 ] + ?.tags || [], + label: __( + 'Generic tags', + 'sureforms' + ), + }, + ] + : smartTags + } + tagFor={ + context === 'global' + ? 'globalEmailNotification.fromName' + : 'emailConfirmation.fromName' + } + setTargetData={ getSmartTagHandler( + 'from_name', + values?.from_name + ) } + /> + </div> + ), + } ); + + // From Email field with warning. + fields.push( { + key: 'from_email', + title: __( 'From Email', 'sureforms' ), + content: ( + <div className="space-y-4"> + <ModalInputBox + label={ __( 'From Email', 'sureforms' ) } + id="srfm-email-notification-from-email" + value={ values?.from_email || '' } + onChange={ ( val ) => onChange( 'from_email', val.trim() ) } + required={ false } + helpText={ fromEmailHelpText } + smartTagList={ emailSmartTags } + tagFor={ + context === 'global' + ? 'globalEmailNotification.fromEmail' + : 'emailConfirmation.fromEmail' + } + setTargetData={ getSmartTagHandler( + 'from_email', + values?.from_email + ) } + /> + { fromEmailWarningMessage && ( + <WarningBox message={ fromEmailWarningMessage } /> + ) } + </div> + ), + } ); + + // CC field. + fields.push( { + key: 'email_cc', + title: __( 'CC', 'sureforms' ), + content: ( + <div className="space-y-4"> + <ModalInputBox + label={ __( 'CC', 'sureforms' ) } + id="srfm-email-notification-cc" + value={ values?.email_cc || '' } + onChange={ ( val ) => onChange( 'email_cc', val ) } + required={ false } + helpText={ emailHelpText } + smartTagList={ emailSmartTags } + tagFor={ + context === 'global' + ? 'globalEmailNotification.cc' + : 'emailConfirmation.CC' + } + setTargetData={ getSmartTagHandler( + 'email_cc', + values?.email_cc + ) } + labelWithInfoTooltip={ true } + /> + </div> + ), + } ); + + // BCC field. + fields.push( { + key: 'email_bcc', + title: __( 'BCC', 'sureforms' ), + content: ( + <div className="space-y-4"> + <ModalInputBox + label={ __( 'BCC', 'sureforms' ) } + id="srfm-email-notification-bcc" + value={ values?.email_bcc || '' } + onChange={ ( val ) => onChange( 'email_bcc', val ) } + required={ false } + helpText={ emailHelpText } + smartTagList={ emailSmartTags } + tagFor={ + context === 'global' + ? 'globalEmailNotification.bcc' + : 'emailConfirmation.BCC' + } + setTargetData={ getSmartTagHandler( + 'email_bcc', + values?.email_bcc + ) } + labelWithInfoTooltip={ true } + /> + </div> + ), + } ); + + // Reply To field. + fields.push( { + key: 'email_reply_to', + title: __( 'Reply To', 'sureforms' ), + content: ( + <div className="space-y-4"> + <ModalInputBox + label={ __( 'Reply To', 'sureforms' ) } + id="srfm-email-notification-reply-to" + value={ values?.email_reply_to || '' } + onChange={ ( val ) => onChange( 'email_reply_to', val ) } + required={ false } + helpText={ emailHelpText } + smartTagList={ emailSmartTags } + tagFor={ + context === 'global' + ? 'globalEmailNotification.replyTo' + : 'emailConfirmation.replyTo' + } + setTargetData={ getSmartTagHandler( + 'email_reply_to', + values?.email_reply_to + ) } + labelWithInfoTooltip={ true } + /> + </div> + ), + } ); + + // `renderAfterEmailBody` JSX gets injected immediately after the + // Email Body field so form-level callers can interleave the + // "Send as Raw HTML" toggle + pro filter-driven entries (e.g. + // "Attach Uploaded Files") at the position they sit in master, + // without having to duplicate the rest of the field markup. + const emailBodyIndex = fields.findIndex( + ( field ) => field.key === 'email_body' + ); + const fieldsBefore = + emailBodyIndex === -1 + ? fields + : fields.slice( 0, emailBodyIndex + 1 ); + const fieldsAfter = + emailBodyIndex === -1 ? [] : fields.slice( emailBodyIndex + 1 ); + + // Render based on context. + if ( wrapWithContentSection ) { + return ( + <div className="space-y-6"> + { fieldsBefore.map( ( field ) => + renderField( field.title, field.content, field.key ) + ) } + { renderAfterEmailBody } + { fieldsAfter.map( ( field ) => + renderField( field.title, field.content, field.key ) + ) } + { renderAfterFields } + </div> + ); + } + + // Form context: render fields directly. + return ( + <> + { fieldsBefore.map( ( field ) => field.content ) } + { renderAfterEmailBody } + { fieldsAfter.map( ( field ) => field.content ) } + { renderAfterFields } + </> + ); +}; + +export default EmailNotificationFields; diff --git a/src/admin/shared-components/email-notification/index.js b/src/admin/shared-components/email-notification/index.js new file mode 100644 index 000000000..3d3d52437 --- /dev/null +++ b/src/admin/shared-components/email-notification/index.js @@ -0,0 +1,2 @@ +export { default as EmailNotificationFields } from './EmailNotificationFields'; +export { useEmailSmartTags } from './useEmailSmartTags'; diff --git a/src/admin/shared-components/email-notification/useEmailSmartTags.js b/src/admin/shared-components/email-notification/useEmailSmartTags.js new file mode 100644 index 000000000..ce83cc0d5 --- /dev/null +++ b/src/admin/shared-components/email-notification/useEmailSmartTags.js @@ -0,0 +1,79 @@ +import { __ } from '@wordpress/i18n'; + +/** + * Hook to get smart tags based on context. + * + * Form context includes form-specific tags (from form fields). + * Global context only includes generic tags. + * + * @param {string} context - 'form' | 'global' + * @return {Object} Smart tags organized by category + */ +export const useEmailSmartTags = ( context ) => { + // srfm_block_data is available in the block editor (form settings). + // srfm_admin is available on the global settings page. + // Fall back to srfm_admin so generic tags work in both contexts. + const blockData = window.srfm_block_data || {}; + const adminData = window.srfm_admin || {}; + + // Generic smart tags available in both contexts. + const rawSmartTags = + blockData.smart_tags_array || adminData.smart_tags_array; + const genericSmartTags = rawSmartTags ? Object.entries( rawSmartTags ) : []; + + const rawEmailSmartTags = + blockData.smart_tags_array_email || adminData.smart_tags_array_email; + const genericEmailSmartTags = rawEmailSmartTags + ? Object.entries( rawEmailSmartTags ) + : []; + + // Global context: only generic tags. + if ( context === 'global' ) { + return { + smartTags: [ + { + tags: genericSmartTags, + label: __( 'Generic tags', 'sureforms' ), + }, + ], + emailSmartTags: [ + { + tags: genericEmailSmartTags, + label: __( 'Generic tags', 'sureforms' ), + }, + ], + formSmartTags: [], + formEmailSmartTags: [], + }; + } + + // Form context: includes form-specific tags. + const formSmartTags = window.sureforms?.formSpecificSmartTags ?? []; + const formEmailSmartTags = + window.sureforms?.formSpecificEmailSmartTags ?? []; + + return { + smartTags: [ + { + tags: formSmartTags, + label: __( 'Form input tags', 'sureforms' ), + }, + { + tags: genericSmartTags, + label: __( 'Generic tags', 'sureforms' ), + }, + ], + emailSmartTags: [ + { + tags: formEmailSmartTags, + label: __( 'Form input tags', 'sureforms' ), + }, + { + tags: genericEmailSmartTags, + label: __( 'Generic tags', 'sureforms' ), + }, + ], + formSmartTags, + formEmailSmartTags, + }; +}; diff --git a/src/admin/shared-components/form-confirmation/ConfirmationFields.js b/src/admin/shared-components/form-confirmation/ConfirmationFields.js new file mode 100644 index 000000000..20f5dc9e4 --- /dev/null +++ b/src/admin/shared-components/form-confirmation/ConfirmationFields.js @@ -0,0 +1,244 @@ +import { __ } from '@wordpress/i18n'; +import { useState, useEffect } from '@wordpress/element'; +import { Input, Label, Select } from '@bsf/force-ui'; +import RadioGroup from '@Admin/components/RadioGroup'; +import Editor from '@Admin/single-form-settings/components/QuillEditor'; +import LoadingSkeleton from '@Admin/components/LoadingSkeleton'; + +/** + * After submission options for success message type. + */ +const AFTER_SUBMISSION_OPTIONS = [ + { + label: __( 'Hide Form', 'sureforms' ), + value: 'hide form', + }, + { + label: __( 'Reset Form', 'sureforms' ), + value: 'reset form', + }, +]; + +/** + * Shared Confirmation Fields Component + * + * Context-aware component for rendering form confirmation settings. + * Renders fields based on the selected confirmation type. + * + * @param {Object} props + * @param {string} props.context - 'form' | 'global' + * @param {Object} props.data - Current confirmation data + * @param {Function} props.onChange - Handler: (fieldKey, value) => void + * @param {Array} props.pageOptions - WordPress pages for dropdown + * @param {boolean} props.loadingPages - Loading state for pages + * @param {string} props.errorMessage - Validation error message + * @param {Function} props.setErrorMessage - Error message setter + * @param {boolean} props.showQueryParams - Show query params UI (form only) + * @param {Function} props.renderQueryParams - Render function for query params + */ +const ConfirmationFields = ( { + context, + data, + onChange, + pageOptions, + loadingPages = false, + errorMessage = null, + setErrorMessage, + showQueryParams = false, + renderQueryParams, +} ) => { + const [ canDisplayError, setCanDisplayError ] = useState( false ); + + // Reset error display state when confirmation type changes. + useEffect( () => { + setCanDisplayError( false ); + }, [ data?.confirmation_type ] ); + + const handleEditorChange = ( newContent ) => { + onChange( 'message', newContent ); + }; + + /** + * Render page selector based on context. + * Global uses Portal, form doesn't. + */ + const renderPageSelector = () => { + if ( loadingPages ) { + return <LoadingSkeleton count={ 1 } className="h-10 rounded-md" />; + } + + if ( context === 'global' ) { + // Global context: use Portal for dropdown. + return ( + <Select + value={ data?.page_url } + onChange={ ( value ) => onChange( 'page_url', value ) } + combobox + searchPlaceholder={ __( 'Search for a page', 'sureforms' ) } + > + <Select.Button + id="select-page" + placeholder={ __( 'Select a page', 'sureforms' ) } + > + { + pageOptions?.find( + ( option ) => option.value === data?.page_url + )?.label + } + </Select.Button> + <Select.Portal id="srfm-settings-container"> + <Select.Options> + { pageOptions?.map( ( option ) => ( + <Select.Option + key={ option.value } + value={ option.value } + selected={ option.value === data?.page_url } + > + { option.label } + </Select.Option> + ) ) } + </Select.Options> + </Select.Portal> + </Select> + ); + } + + // Form context: simple Select without Portal. + return ( + <Select + options={ pageOptions } + value={ data?.page_url } + onChange={ ( value ) => { + setCanDisplayError( true ); + if ( setErrorMessage ) { + setErrorMessage( null ); + } + onChange( 'page_url', value ); + } } + combobox + searchPlaceholder={ __( 'Search for a page', 'sureforms' ) } + > + <Select.Button + id="select-page" + placeholder={ __( 'Select a page', 'sureforms' ) } + > + { + pageOptions?.find( + ( option ) => option.value === data?.page_url + )?.label + } + </Select.Button> + <Select.Options> + { pageOptions?.map( ( option ) => ( + <Select.Option + key={ option.value } + value={ option.value } + selected={ option.value === data?.page_url } + > + { option.label } + </Select.Option> + ) ) } + </Select.Options> + </Select> + ); + }; + + return ( + <> + { /* Same Page: Success Message + After Submission */ } + { data?.confirmation_type === 'same page' && ( + <> + <div> + <Editor + handleContentChange={ handleEditorChange } + content={ data?.message } + /* SF-2815 start: forward context so global shows generic tags only. */ + context={ context } + /* SF-2815 end. */ + /> + </div> + <div className="space-y-2"> + <Label> + { __( 'After Form Submission', 'sureforms' ) } + </Label> + <RadioGroup cols={ 2 }> + { AFTER_SUBMISSION_OPTIONS.map( + ( option ) => ( + <RadioGroup.Option + key={ option.value } + label={ option.label } + value={ option.value } + checked={ + data?.submission_action === + option.value + } + onChange={ () => + onChange( + 'submission_action', + option.value + ) + } + /> + ) + ) } + </RadioGroup> + </div> + </> + ) } + + { /* Different Page: Page Selector + Optional Query Params */ } + { data?.confirmation_type === 'different page' && ( + <> + <div className="space-y-6"> + <div className="space-y-1.5"> + <Label htmlFor="select-page"> + { __( 'Select Page to redirect', 'sureforms' ) } + </Label> + { renderPageSelector() } + </div> + </div> + { showQueryParams && + renderQueryParams && + renderQueryParams() } + </> + ) } + + { /* Custom URL: URL Input + Optional Query Params */ } + { data?.confirmation_type === 'custom url' && ( + <> + <div className="space-y-1.5"> + <Label htmlFor="custom-url-input" required> + { __( 'Custom URL', 'sureforms' ) } + </Label> + <Input + id="custom-url-input" + value={ data?.custom_url ?? '' } + onChange={ ( value ) => { + setCanDisplayError( true ); + onChange( 'custom_url', value ); + } } + size="md" + placeholder={ + context === 'global' + ? 'https://example.com' + : undefined + } + /> + { context === 'form' && + canDisplayError && + errorMessage && ( + <Label variant="error" size="sm"> + { errorMessage } + </Label> + ) } + </div> + { showQueryParams && + renderQueryParams && + renderQueryParams() } + </> + ) } + </> + ); +}; + +export default ConfirmationFields; diff --git a/src/admin/shared-components/form-confirmation/constants.js b/src/admin/shared-components/form-confirmation/constants.js new file mode 100644 index 000000000..2083187a4 --- /dev/null +++ b/src/admin/shared-components/form-confirmation/constants.js @@ -0,0 +1,31 @@ +import { __ } from '@wordpress/i18n'; + +/** + * Confirmation type options for the radio group. + * Shared between GlobalDefaults and FormConfirmation pages. + */ +export const CONFIRMATION_TYPE_OPTIONS = [ + { + label: __( 'Success Message', 'sureforms' ), + value: 'same page', + }, + { + label: __( 'Redirect', 'sureforms' ), + value: 'different page', + }, +]; + +/** + * Redirect sub-options when "Redirect" is selected. + * Shared between GlobalDefaults and FormConfirmation pages. + */ +export const REDIRECT_SUB_OPTIONS = [ + { + label: __( 'Page', 'sureforms' ), + value: 'different page', + }, + { + label: __( 'Custom URL', 'sureforms' ), + value: 'custom url', + }, +]; diff --git a/src/admin/shared-components/form-confirmation/index.js b/src/admin/shared-components/form-confirmation/index.js new file mode 100644 index 000000000..7ebfa4cc6 --- /dev/null +++ b/src/admin/shared-components/form-confirmation/index.js @@ -0,0 +1 @@ +export { default as ConfirmationFields } from './ConfirmationFields'; diff --git a/src/admin/single-form-settings/Editor.js b/src/admin/single-form-settings/Editor.js index c88249cd5..fd73ad3a3 100644 --- a/src/admin/single-form-settings/Editor.js +++ b/src/admin/single-form-settings/Editor.js @@ -50,19 +50,23 @@ const SureformsFormSpecificSettings = () => { const [ enableQuickActionSidebar, setEnableQuickActionSidebar ] = useState( 'enabled' ); - const { postId, sureformsKeys, blockCount, blocks, editorMode } = useSelect( - ( select ) => { - const { get } = select( preferencesStore ); - return { - editorMode: get( 'core', 'editorMode' ) ?? 'visual', - postId: select( 'core/editor' ).getCurrentPostId(), - sureformsKeys: - select( editorStore ).getEditedPostAttribute( 'meta' ), - blockCount: select( blockEditorStore ).getBlockCount(), - blocks: select( 'core/block-editor' ).getBlocks(), - }; - } - ); + const { + postId, + sureformsKeys, + blockCount, + blocks, + editorMode, + } = useSelect( ( select ) => { + const { get } = select( preferencesStore ); + return { + editorMode: get( 'core', 'editorMode' ) ?? 'visual', + postId: select( 'core/editor' ).getCurrentPostId(), + sureformsKeys: + select( editorStore ).getEditedPostAttribute( 'meta' ), + blockCount: select( blockEditorStore ).getBlockCount(), + blocks: select( 'core/block-editor' ).getBlocks(), + }; + } ); const shouldIframe = useShouldIframe(); @@ -107,17 +111,28 @@ const SureformsFormSpecificSettings = () => { '.block-editor-iframe__body' ); - // This is the real readiness check - if ( ! getIframeBody || ! getIframeBody.children.length ) { + if ( ! getIframeBody ) { return false; } - setDocumentBody( getIframeBody ); - + // The iframe body receives helper overlays (block-canvas-cover, + // collaborators-overlay-full, a11y-speak-intro-text) before the + // block editor itself mounts. Only treat the iframe as ready once + // the root container AND block-list layout exist; otherwise plugins + // that delay editor boot (e.g. ThirstyAffiliates) can leave + // downstream effects with a null rootContainer, which skips the + // .srfm-form-container scope class and the custom submit button. const getRootContainer = getIframeBody.querySelector( '.is-root-container' ); + const blockListLayout = getIframeBody.querySelector( + '.block-editor-block-list__layout' + ); - // Iframe body is fully ready + if ( ! getRootContainer || ! blockListLayout ) { + return false; + } + + setDocumentBody( getIframeBody ); setRootContainer( getRootContainer ); setRootHtmlTag( iframeDoc.querySelector( 'html' ) ); clearInterval( intervalId ); @@ -137,7 +152,11 @@ const SureformsFormSpecificSettings = () => { clearInterval( intervalId ); clearTimeout( timeoutId ); }; - }, [ editorMode ] ); + // `shouldIframe` selects the polling branch (top body vs. iframe body), + // so changes to it must restart the polling — otherwise a late flip from + // false → true (e.g. block types finish registering after first render) + // leaves us stuck on the top-document branch. + }, [ editorMode, shouldIframe ] ); const isPageBreak = blocks.some( ( block ) => block.name === 'srfm/page-break' diff --git a/src/admin/single-form-settings/components/Compliance.js b/src/admin/single-form-settings/components/Compliance.js index f405896e7..78938714b 100644 --- a/src/admin/single-form-settings/components/Compliance.js +++ b/src/admin/single-form-settings/components/Compliance.js @@ -1,75 +1,77 @@ import { __ } from '@wordpress/i18n'; -import { store as editorStore } from '@wordpress/editor'; -import { useDispatch } from '@wordpress/data'; -import { Input, Switch, Label, Container, Title } from '@bsf/force-ui'; +import { useEffect } from '@wordpress/element'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { Title } from '@bsf/force-ui'; import TabContentWrapper from '@Components/tab-content-wrapper'; +import { ComplianceFields } from '@Admin/shared-components/compliance'; +import { srfmEditFormMeta } from '@Components/tab-content-wrapper/edit-form-meta'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; +/** + * Compliance Settings panel — rendered as a sibling of Form Restriction + * inside the Advanced Settings tab (`Dialog.js` mounts both side-by-side + * inside the tab's `component` Fragment). + * + * Wires into the tab's Save button via the per-slot dirty map in Redux + * (`formSettings.tabDirtyContributions`). `FormRestriction` ORs the + * aggregate into its own `isDirty`, so the same Save button responds + * to Compliance edits without Compliance having to live inside + * FormRestriction's render tree. + * + * Writes route through `srfmEditFormMeta` so the value lands in the + * shared `formSettings.values` slice that `TabContentWrapper.handleSave` + * reads when building the POST payload (and the existing core/editor + * consumers — the post sidebar etc. — still see the change via the + * mirror inside `srfmEditFormMeta`). + * + * Dirty derivation compares the edited buffer vs the saved snapshot + * via `core/editor` selectors — the panel has no local React state + * buffer, so saved-vs-edited on the editor store is the authoritative + * comparison. + * + * @param {Object} props Component props. + * @param {Array} props.complianceData Current `_srfm_compliance` array + * (single item today). + */ const Compliance = ( { complianceData } ) => { - const { editPost } = useDispatch( editorStore ); + const { setTabDirtyContribution } = useDispatch( SRFM_STORE_NAME ); - const handleToggle = ( id, status ) => { + /** + * Handle field change and stage to Redux + core/editor. + * + * @param {string} key - Field key to update. + * @param {*} value - New value. + */ + const handleChange = ( key, value ) => { const updatedData = complianceData.map( ( item ) => ( { ...item, - [ id ]: status, + [ key ]: value, } ) ); - - editPost( { - meta: { - _srfm_compliance: updatedData, - }, - } ); + srfmEditFormMeta( '_srfm_compliance', updatedData ); }; - const ComplianceSwitch = ( { id, label, value, onChange, key } ) => { - return ( - <Switch - key={ key } - label={ label } - value={ value } - onChange={ ( val ) => onChange( id, val ) } - /> - ); - }; + // Dirty derivation: edited buffer vs saved snapshot. No local + // React state in this component — writes go straight through + // `srfmEditFormMeta`, so saved-vs-edited on the editor store is + // the source of truth. + const isDirty = useSelect( ( select ) => { + const editor = select( 'core/editor' ); + const edited = editor.getEditedPostAttribute( 'meta' ) + ?._srfm_compliance; + const saved = editor.getCurrentPostAttribute( 'meta' ) + ?._srfm_compliance; + return JSON.stringify( edited ) !== JSON.stringify( saved ); + }, [] ); - const switches = [ - { - id: 'gdpr', - label: { - heading: __( 'Enable GDPR Compliance', 'sureforms' ), - description: __( - 'When enabled, this form will not store user IP, browser name, or device name in entries.', - 'sureforms' - ), - }, - }, - { - id: 'do_not_store_entries', - label: { - heading: __( - 'Never store entry data after form submission', - 'sureforms' - ), - description: __( - 'When enabled this form will never store Entries.', - 'sureforms' - ), - }, - condition: complianceData[ 0 ]?.gdpr, - }, - { - id: 'auto_delete_entries', - label: { - heading: __( 'Automatically delete entries', 'sureforms' ), - description: __( - 'When enabled this form will automatically delete entries after a certain period of time.', - 'sureforms' - ), - }, - condition: - complianceData[ 0 ]?.gdpr && - ! complianceData[ 0 ]?.do_not_store_entries, - }, - ]; + // Push our slot's contribution into Redux. The host + // (`FormRestriction`) reads the aggregate via + // `selectTabDirtyContributionsAggregate` and ORs it into the Save + // button's `isDirty`. Cleanup on unmount clears the slot so a tab + // switch / discard doesn't leave a stale `true`. + useEffect( () => { + setTabDirtyContribution( 'compliance', isDirty ); + return () => setTabDirtyContribution( 'compliance', false ); + }, [ isDirty, setTabDirtyContribution ] ); return ( <TabContentWrapper className="!mt-0"> @@ -79,62 +81,11 @@ const Compliance = ( { complianceData } ) => { className="mb-4" title={ __( 'Compliance Settings', 'sureforms' ) } /> - <Container direction="column" className="gap-6"> - { switches.map( - ( { id, label, condition = true } ) => - condition && - ComplianceSwitch( { - id, - label, - value: complianceData[ 0 ]?.[ id ], - onChange: handleToggle, - key: id, - } ) - ) } - { complianceData[ 0 ]?.auto_delete_entries && - ! complianceData[ 0 ]?.do_not_store_entries && - complianceData[ 0 ]?.gdpr && ( - <Container direction="column" className="gap-1.5"> - <Input - aria-label={ __( - 'Entries older than the selected days will be deleted.', - 'sureforms' - ) } - size="md" - type="number" - value={ - complianceData[ 0 ]?.auto_delete_days - } - label={ __( - 'Entries Time Period', - 'sureforms' - ) } - onChange={ ( value ) => { - value = parseInt( value ); - - if ( value < 0 ) { - value = 1; - } - - value = value.toString(); - - handleToggle( - 'auto_delete_days', - value - ); - } } - /> - <Container gap="0" align="center"> - <Label tag="p" size="sm" variant="help"> - { __( - 'Entries older than the days set will be deleted automatically.', - 'sureforms' - ) } - </Label> - </Container> - </Container> - ) } - </Container> + <ComplianceFields + context="form" + values={ complianceData[ 0 ] } + onChange={ handleChange } + /> </> </TabContentWrapper> ); diff --git a/src/admin/single-form-settings/components/FormCustomCssPanel.js b/src/admin/single-form-settings/components/FormCustomCssPanel.js index 7d9ef58dd..cb7ba460e 100644 --- a/src/admin/single-form-settings/components/FormCustomCssPanel.js +++ b/src/admin/single-form-settings/components/FormCustomCssPanel.js @@ -1,18 +1,64 @@ import { __ } from '@wordpress/i18n'; -import { dispatch } from '@wordpress/data'; +import { useDispatch, useSelect, select as wpSelect } from '@wordpress/data'; import { useRef, useEffect, + useMemo, useState, useLayoutEffect, } from '@wordpress/element'; +import { store as editorStore } from '@wordpress/editor'; import editorStyles from './editor.lazy.scss'; import { TextArea, Label, Container } from '@bsf/force-ui'; import TabContentWrapper from '@Components/tab-content-wrapper'; +import { srfmEditFormMeta } from '@Components/tab-content-wrapper/edit-form-meta'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; const FormCustomCssPanel = ( { formCustomCssData } ) => { const tabRef = useRef( null ); - const [ customCSS, setCustomCSS ] = useState( formCustomCssData ); + + // `data` is the live editing state; `prevData` is the last-saved + // baseline. Both start from the post-meta value on mount so isDirty + // reads false until the user edits. + const [ data, setData ] = useState( formCustomCssData || '' ); + const [ prevData, setPrevData ] = useState( formCustomCssData || '' ); + const [ isSaving, setIsSaving ] = useState( false ); + + const isDirty = useMemo( () => data !== prevData, [ data, prevData ] ); + + // Push the local dirty signal into the store so the dialog's + // unsaved-changes guard can read it. + const { setSingleFormSettingUnsave } = useDispatch( SRFM_STORE_NAME ); + useEffect( () => { + setSingleFormSettingUnsave( isDirty ); + }, [ isDirty, setSingleFormSettingUnsave ] ); + + // Unmount cleanup — covers every exit path so the central flag + // doesn't leak past a discard / tab switch. + useEffect( () => { + return () => { + setSingleFormSettingUnsave( false ); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [] ); + + // Listen for the discard signal dispatched by the dialog's "Discard + // & continue" branch. Each bump is one discard event; the ref skips + // the initial render so the tab doesn't reset on mount. + const discardCounter = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectSingleFormSettingDiscardCounter?.() || + 0, + [] + ); + const lastDiscardCounter = useRef( discardCounter ); + useEffect( () => { + if ( discardCounter === lastDiscardCounter.current ) { + return; + } + lastDiscardCounter.current = discardCounter; + setData( prevData ); + }, [ discardCounter ] ); // Use the editor styles. This is important to make sure the editor styles are applied to the custom CSS editor. useLayoutEffect( () => { @@ -51,11 +97,7 @@ const FormCustomCssPanel = ( { formCustomCssData } ) => { codeMirrorEditor?.addEventListener( 'keyup', function () { editor?.codemirror?.save(); const value = editor?.codemirror?.getValue(); - - setCustomCSS( value ); - dispatch( 'core/editor' ).editPost( { - meta: { _srfm_form_custom_css: value }, - } ); + setData( value ); } ); } }; @@ -65,6 +107,35 @@ const FormCustomCssPanel = ( { formCustomCssData } ) => { return cleanupEditors; // Remove existing editors when the component is unmounted }, [ tabRef ] ); + // Returns null on valid; an error string otherwise. Stages the + // in-flight value into Redux `values` so `handleSave` reads the + // right payload. Custom CSS has no validation today; the function + // shape is kept for parity with the other migrated tabs. + const validateBeforeSave = () => { + srfmEditFormMeta( '_srfm_form_custom_css', data ); + return null; + }; + + const onSaveSuccess = () => { + // `wp_kses_post` runs server-side on `_srfm_form_custom_css`. If + // the user wrote CSS containing `<`/`>` (e.g. attribute + // selectors) the persisted bytes differ from local `data`. + // Re-baseline from `getCurrentPostAttribute` — the entity record + // that `TabContentWrapper.handleSave` just synced via + // `receiveEntityRecords` with the sanitized response. We read + // `current` rather than `edited` because `srfmEditFormMeta` + // during typing pushes the pre-sanitize value into the edited + // buffer; the current attribute is the post-save canonical bytes. + const savedMeta = + wpSelect( editorStore ).getCurrentPostAttribute( 'meta' ) || {}; + const saved = + savedMeta._srfm_form_custom_css !== undefined + ? savedMeta._srfm_form_custom_css + : data; + setData( saved ); + setPrevData( saved ); + }; + return ( <TabContentWrapper title={ __( 'Custom CSS', 'sureforms' ) } @@ -73,6 +144,13 @@ const FormCustomCssPanel = ( { formCustomCssData } ) => { 'Add custom CSS rules to style this specific form independently of global styles.', 'sureforms' ) } + tabId="form_custom_css" + showSaveButton={ true } + validate={ validateBeforeSave } + isDirty={ isDirty } + isSaving={ isSaving } + onSavingChange={ setIsSaving } + onSaveSuccess={ onSaveSuccess } > <Container direction="column" className="gap-2"> <Label @@ -90,7 +168,7 @@ const FormCustomCssPanel = ( { formCustomCssData } ) => { aria-label={ __( 'Custom CSS Panel', 'sureforms' ) } id="srfm-css-editor" size="sm" - value={ customCSS } + value={ data } ref={ tabRef } /> </div> diff --git a/src/admin/single-form-settings/components/QuillEditor.js b/src/admin/single-form-settings/components/QuillEditor.js index 3dd407712..b1efa7caa 100644 --- a/src/admin/single-form-settings/components/QuillEditor.js +++ b/src/admin/single-form-settings/components/QuillEditor.js @@ -10,7 +10,14 @@ import { ChevronDownIcon } from 'lucide-react'; import { Label, Tabs, TextArea } from '@bsf/force-ui'; import { applyFilters } from '@wordpress/hooks'; -const Editor = ( { handleContentChange, content, allData = false } ) => { +const Editor = ( { + handleContentChange, + content, + allData = false, + // SF-2815 start: context prop — 'global' uses generic tags only. + context = 'form', + // SF-2815 end. +} ) => { const quillRef = useRef( null ); const textAreaRef = useRef( null ); @@ -47,7 +54,11 @@ const Editor = ( { handleContentChange, content, allData = false } ) => { index = length - 1; } - quillInstance.insertText( index, text ); + // Pass `'user'` as the source so the resulting `text-change` event + // is tagged as user-driven; the visual-tab onChange below filters on + // `source === 'user'` to ignore synthetic emissions (mount-time + // normalization, parent-prop sync). + quillInstance.insertText( index, text, 'user' ); }; const insertSmartTag = ( tag ) => { @@ -86,10 +97,21 @@ const Editor = ( { handleContentChange, content, allData = false } ) => { } }; - const genericSmartTags = window.srfm_block_data?.smart_tags_array - ? Object.entries( window.srfm_block_data.smart_tags_array ) + // SF-2815 start: srfm_block_data exists in the block editor only; + // fall back to srfm_admin so generic tags work on the settings page. + const rawGenericSmartTags = + window.srfm_block_data?.smart_tags_array || + window.srfm_admin?.smart_tags_array; + const genericSmartTags = rawGenericSmartTags + ? Object.entries( rawGenericSmartTags ) : []; - const formSmartTags = window.sureforms?.formSpecificSmartTags ?? []; + // In the global settings context there is no specific form, so skip + // form-specific tags entirely. + const formSmartTags = + context === 'global' + ? [] + : window.sureforms?.formSpecificSmartTags ?? []; + // SF-2815 end. let formSmartTagsAllData = {}; if ( allData ) { @@ -132,16 +154,41 @@ const Editor = ( { handleContentChange, content, allData = false } ) => { const formConfirmationSmartTags = applyFilters( 'srfm.formSettings.formConfirmationSmartTags', - [ - { - tags: allData ? formSmartTagsAllData : formSmartTags, - label: __( 'Form input tags', 'sureforms' ), - }, - { - tags: genericSmartTags, - label: __( 'Generic tags', 'sureforms' ), - }, - ] + // SF-2815 start: in global context show generic tags only, plus + // `{all_data}` when the caller opts in via the `allData` prop. + // Field-specific tags are intentionally omitted because the global + // settings don't know which form they'll apply to. + context === 'global' + ? [ + ...( allData + ? [ + { + tags: [ + [ + '{all_data}', + __( 'All Data', 'sureforms' ), + ], + ], + label: __( 'Form data', 'sureforms' ), + }, + ] + : [] ), + { + tags: genericSmartTags, + label: __( 'Generic tags', 'sureforms' ), + }, + ] + : [ + { + tags: allData ? formSmartTagsAllData : formSmartTags, + label: __( 'Form input tags', 'sureforms' ), + }, + { + tags: genericSmartTags, + label: __( 'Generic tags', 'sureforms' ), + }, + ] + // SF-2815 end. ); return ( @@ -187,7 +234,19 @@ const Editor = ( { handleContentChange, content, allData = false } ) => { formats={ formats } modules={ modules } value={ content } - onChange={ ( newContent ) => { + onChange={ ( newContent, _delta, source ) => { + // Quill tags each emission with its origin: + // 'user' for real keystrokes / format toolbar + // clicks, 'api' for programmatic content set + // (mount-time normalization + value-prop + // resync after fetch / discard), 'silent' + // for muted internal updates. Only propagate + // user-driven changes so the page-level + // dirty signal isn't flipped on by + // normalization of the initial content. + if ( source !== 'user' ) { + return; + } handleContentChange( newContent ); } } className="[&>div]:border [&>div]:border-field-border [&>div]:border-solid [&>div]:rounded-b-lg [&_.ql-editor]:min-h-[18.75rem]" diff --git a/src/admin/single-form-settings/components/SpamProtection.js b/src/admin/single-form-settings/components/SpamProtection.js index 75550b5b8..2bc849aac 100644 --- a/src/admin/single-form-settings/components/SpamProtection.js +++ b/src/admin/single-form-settings/components/SpamProtection.js @@ -1,7 +1,7 @@ import { __ } from '@wordpress/i18n'; import { store as editorStore } from '@wordpress/editor'; -import { useDispatch, useSelect } from '@wordpress/data'; -import { useState, useEffect } from '@wordpress/element'; +import { useDispatch, useSelect, select as wpSelect } from '@wordpress/data'; +import { useEffect, useMemo, useRef, useState } from '@wordpress/element'; import { Select, Label, Container } from '@bsf/force-ui'; import TabContentWrapper from '@Components/tab-content-wrapper'; import RadioGroup from '@Admin/components/RadioGroup'; @@ -9,13 +9,27 @@ import apiFetch from '@wordpress/api-fetch'; import { Info } from 'lucide-react'; import svg from '@Svg/svgs.json'; import parse from 'html-react-parser'; +import { srfmEditFormMeta } from '@Components/tab-content-wrapper/edit-form-meta'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; + +const DEFAULT_DATA = { + _srfm_captcha_security_type: 'none', + _srfm_form_recaptcha: '', +}; const SpamProtection = () => { - const { editPost } = useDispatch( editorStore ); const sureformsKeys = useSelect( ( select ) => select( editorStore ).getEditedPostAttribute( 'meta' ) ); + // `data` is the live editing state; `prevData` is the last-saved + // baseline. Both start at the defaults on mount; the load useEffect + // below syncs them from `sureformsKeys` so isDirty reads false until + // the user edits. + const [ data, setData ] = useState( DEFAULT_DATA ); + const [ prevData, setPrevData ] = useState( DEFAULT_DATA ); + const [ isSaving, setIsSaving ] = useState( false ); + const [ keys, setKeys ] = useState( { v2Checkbox: { site: '', secret: '' }, v2Invisible: { site: '', secret: '' }, @@ -28,9 +42,47 @@ const SpamProtection = () => { useState( false ); const [ showErr, setShowErr ] = useState( false ); - const updateMeta = ( option, value ) => { - editPost( { meta: { [ option ]: value } } ); - }; + const isDirty = useMemo( + () => JSON.stringify( data ) !== JSON.stringify( prevData ), + [ data, prevData ] + ); + + // Push the local dirty signal into the store so the dialog's + // unsaved-changes guard can read it without holding a reference to + // this component. + const { setSingleFormSettingUnsave } = useDispatch( SRFM_STORE_NAME ); + useEffect( () => { + setSingleFormSettingUnsave( isDirty ); + }, [ isDirty, setSingleFormSettingUnsave ] ); + + // Unmount cleanup — covers every exit path so the central flag + // doesn't leak past a discard / tab switch. + useEffect( () => { + return () => { + setSingleFormSettingUnsave( false ); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [] ); + + // Listen for the discard signal dispatched by the dialog's "Discard + // & continue" branch. Each bump of `discardCounter` is one discard + // event; the ref skips the initial render so the tab doesn't reset + // itself on mount. + const discardCounter = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectSingleFormSettingDiscardCounter?.() || + 0, + [] + ); + const lastDiscardCounter = useRef( discardCounter ); + useEffect( () => { + if ( discardCounter === lastDiscardCounter.current ) { + return; + } + lastDiscardCounter.current = discardCounter; + setData( prevData ); + setShowErr( false ); + }, [ discardCounter ] ); const validateKeys = ( type ) => { const { site, secret } = keys[ type ] || {}; @@ -40,7 +92,7 @@ const SpamProtection = () => { useEffect( () => { const fetchData = async () => { try { - const data = await apiFetch( { + const fetched = await apiFetch( { path: `sureforms/v1/srfm-global-settings?options_to_fetch=srfm_security_settings_options`, method: 'GET', headers: { @@ -49,7 +101,7 @@ const SpamProtection = () => { }, } ); - const opts = data?.srfm_security_settings_options || {}; + const opts = fetched?.srfm_security_settings_options || {}; const keyMap = { v2Checkbox: { site: opts.srfm_v2_checkbox_site_key, @@ -100,35 +152,108 @@ const SpamProtection = () => { fetchData(); }, [] ); - const handleSecurityTypeChange = ( value ) => { - const keyTypeMap = { - 'cf-turnstile': 'turnstile', - hcaptcha: 'hcaptcha', + // Load existing per-form meta into local state on mount. Both `data` + // and `prevData` start from the same loaded value so isDirty is + // false until the user edits. + useEffect( () => { + const loaded = { + _srfm_captcha_security_type: + sureformsKeys?._srfm_captcha_security_type || 'none', + _srfm_form_recaptcha: + sureformsKeys?._srfm_form_recaptcha || '', }; + setData( loaded ); + setPrevData( loaded ); + }, [] ); - if ( keyTypeMap[ value ] && ! validateKeys( keyTypeMap[ value ] ) ) { - setShowErr( true ); - return; - } - + const handleSecurityTypeChange = ( value ) => { setShowErr( false ); - updateMeta( '_srfm_captcha_security_type', value ); + setData( ( prev ) => ( { + ...prev, + _srfm_captcha_security_type: value, + } ) ); }; const handleRecaptchaVersionChange = ( value ) => { - const keyTypeMap = { - 'v2-checkbox': 'v2Checkbox', - 'v2-invisible': 'v2Invisible', - 'v3-reCAPTCHA': 'v3', - }; + setShowErr( false ); + setData( ( prev ) => ( { + ...prev, + _srfm_form_recaptcha: value, + } ) ); + }; - if ( keyTypeMap[ value ] && ! validateKeys( keyTypeMap[ value ] ) ) { - setShowErr( true ); - return; + // Returns null on valid; an error string for TabContentWrapper to + // surface as a toast otherwise. Also stages the in-flight `data` + // into Redux `values` so `handleSave` reads the right payload. + const validateBeforeSave = () => { + const type = data._srfm_captcha_security_type; + let error = ''; + + if ( type === 'cf-turnstile' && ! validateKeys( 'turnstile' ) ) { + error = __( + 'Cloudflare Turnstile API keys are not configured. Set them in Global Settings.', + 'sureforms' + ); + } else if ( type === 'hcaptcha' && ! validateKeys( 'hcaptcha' ) ) { + error = __( + 'hCaptcha API keys are not configured. Set them in Global Settings.', + 'sureforms' + ); + } else if ( type === 'g-recaptcha' ) { + const version = data._srfm_form_recaptcha; + const keyTypeMap = { + 'v2-checkbox': 'v2Checkbox', + 'v2-invisible': 'v2Invisible', + 'v3-reCAPTCHA': 'v3', + }; + if ( ! version ) { + error = __( + 'Please select a reCAPTCHA version.', + 'sureforms' + ); + } else if ( ! validateKeys( keyTypeMap[ version ] ) ) { + error = __( + 'reCAPTCHA API keys for the selected version are not configured. Set them in Global Settings.', + 'sureforms' + ); + } } + if ( error ) { + setShowErr( true ); + return error; + } setShowErr( false ); - updateMeta( '_srfm_form_recaptcha', value ); + srfmEditFormMeta( + '_srfm_captcha_security_type', + data._srfm_captcha_security_type + ); + srfmEditFormMeta( '_srfm_form_recaptcha', data._srfm_form_recaptcha ); + return null; + }; + + const onSaveSuccess = () => { + // Re-baseline from the entity record's `current` meta (synced by + // `receiveEntityRecords` in TabContentWrapper.handleSave) rather + // than the editor's edited buffer (which still holds the user's + // pre-sanitize typed value pushed by `srfmEditFormMeta`). + // `_srfm_captcha_security_type` and `_srfm_form_recaptcha` use + // `sanitize_text_field` today — no-op for the known enum values, + // but reading the canonical post-save value keeps the pattern + // aligned with FormCustomCss (which IS mutated by `wp_kses_post`) + // so future sanitizer changes can't quietly re-introduce a + // save → dirty flip. + const savedMeta = + wpSelect( editorStore ).getCurrentPostAttribute( 'meta' ) || {}; + const next = { + _srfm_captcha_security_type: + savedMeta._srfm_captcha_security_type ?? + data._srfm_captcha_security_type, + _srfm_form_recaptcha: + savedMeta._srfm_form_recaptcha ?? data._srfm_form_recaptcha, + }; + setData( next ); + setPrevData( next ); }; const securityTypeOptions = [ @@ -153,12 +278,13 @@ const SpamProtection = () => { return ( <TabContentWrapper title={ __( 'Spam Protection', 'sureforms' ) } - shouldShowAutoSaveText - autoSaveHelpText={ __( - 'Choose a spam protection method for this form to prevent unwanted submissions.', - 'sureforms' - ) } - shouldAddHelpTextPadding={ false } + tabId="spam_protection" + showSaveButton={ true } + validate={ validateBeforeSave } + isDirty={ isDirty } + isSaving={ isSaving } + onSavingChange={ setIsSaving } + onSaveSuccess={ onSaveSuccess } > <div className="space-y-6"> { /* Security Type */ } @@ -168,10 +294,7 @@ const SpamProtection = () => { { __( 'Spam Protection Type', 'sureforms' ) } </Label> <Select - value={ - sureformsKeys._srfm_captcha_security_type || - 'none' - } + value={ data._srfm_captcha_security_type } onChange={ handleSecurityTypeChange } options={ securityTypeOptions } > @@ -185,7 +308,7 @@ const SpamProtection = () => { { securityTypeOptions.find( ( o ) => o.value === - sureformsKeys._srfm_captcha_security_type + data._srfm_captcha_security_type )?.label || __( 'None', 'sureforms' ) } </Select.Button> <Select.Options> @@ -195,7 +318,7 @@ const SpamProtection = () => { value={ option.value } selected={ option.value === - sureformsKeys._srfm_captcha_security_type + data._srfm_captcha_security_type } > { option.label } @@ -213,8 +336,7 @@ const SpamProtection = () => { </div> { /* reCAPTCHA versions */ } - { sureformsKeys._srfm_captcha_security_type === - 'g-recaptcha' && ( + { data._srfm_captcha_security_type === 'g-recaptcha' && ( <> { showRecaptchaConflictNotice && ( <Container className="w-full p-3 gap-2 border border-solid border-alert-border-warning bg-alert-background-warning rounded-lg"> @@ -240,7 +362,7 @@ const SpamProtection = () => { label={ option.label } value={ option.value } checked={ - sureformsKeys._srfm_form_recaptcha === + data._srfm_form_recaptcha === option.value } onChange={ () => diff --git a/src/admin/single-form-settings/components/dialog/Dialog.js b/src/admin/single-form-settings/components/dialog/Dialog.js index 1ba87e530..d72a5bdfa 100644 --- a/src/admin/single-form-settings/components/dialog/Dialog.js +++ b/src/admin/single-form-settings/components/dialog/Dialog.js @@ -3,6 +3,7 @@ import { useLayoutEffect, createPortal, useEffect, + useRef, memo, useContext, useMemo, @@ -12,6 +13,8 @@ import { Button, Container, Title, + Toaster, + toast as bsfToast, } from '@bsf/force-ui'; import SidebarNav from './SidebarNav'; import { @@ -43,13 +46,15 @@ import EmailNotification from '../email-settings/EmailNotification'; import FormConfirmSetting from '../form-confirm-setting'; import { setFormSpecificSmartTags, cn } from '@Utils/Helpers'; import toast from 'react-hot-toast'; -import { useDispatch, useSelect } from '@wordpress/data'; +import { useDispatch, useSelect, select } from '@wordpress/data'; import { store as blockEditorStore } from '@wordpress/block-editor'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; import FormRestriction from '../form-restrictions/FormRestriction'; import { FormRestrictionContext } from '../form-restrictions/context'; import FeaturePreview from '../FeaturePreview'; import OttoKitPage from '@Admin/settings/pages/OttoKit'; import ottoKitIcon from '@Image/ottokit.png'; +import ConfirmationDialog from '@Admin/components/ConfirmationDialog'; const Dialog = ( { open, @@ -68,6 +73,98 @@ const Dialog = ( { editMeta(); }, [] ); + const { + discardFormSettingsState, + discardFormSettingValues, + discardChanges, + keepChanges, + confirmBackDiscard, + cancelBackDiscard, + } = useDispatch( SRFM_STORE_NAME ); + + // Active sub-form dirty signal — pushed by the tab via + // `setSingleFormSettingUnsave`. Drives the close / tab-switch / + // Esc / backdrop / beforeunload guards below. + const isDialogDirty = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectSingleFormSettingUnsave?.() || false, + [] + ); + // Active sub-form in-flight Save signal — pushed by + // `TabContentWrapper.handleSave` around its await. The guards below + // short-circuit while this is true so a tab-switch / close during + // an in-flight POST can't trigger a discard that would revert local + // state for a save the server has already accepted. + const isDialogSaving = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectSingleFormSettingSaving?.() || false, + [] + ); + + // Copy payload for the dialog-level back-arrow discard modal. Set by + // the active tab via `requestBackDiscard`; the tab subscribes to the + // confirm counter to react when the user confirms. + const pendingBackDiscard = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectPendingBackDiscard?.() || null, + [] + ); + + // Centralized toast queue. Tabs and helpers call `notify.success/.error` + // from `@Utils/notify`, which dispatches `requestToast` — that bumps + // `toastCounter` and stashes the payload in `pendingToast`. The + // listener below reads the payload and fires @bsf/force-ui's + // imperative `toast.success/.error(...)` exactly once per bump. + const toastCounter = useSelect( + ( s ) => s( SRFM_STORE_NAME )?.selectToastCounter?.() || 0, + [] + ); + const lastToastCounter = useRef( toastCounter ); + useEffect( () => { + if ( toastCounter === lastToastCounter.current ) { + return; + } + lastToastCounter.current = toastCounter; + const payload = + select( SRFM_STORE_NAME )?.selectPendingToast?.(); + if ( ! payload || ! payload.message ) { + return; + } + // Dismiss any in-flight toast so only the latest action is on + // screen at a time — matches the `toast.dismiss()` pattern the + // migrated call sites used to inline. + bsfToast.dismiss(); + const fire = + payload.type === 'error' ? bsfToast.error : bsfToast.success; + fire( payload.message, { duration: payload.duration ?? 5000 } ); + }, [ toastCounter ] ); + + // `{ type: 'tab' | 'close', tab?: string }` while the guard modal is + // asking the user to confirm. + const [ pendingAction, setPendingAction ] = useState( null ); + + // Native browser confirmation when the user closes the browser tab + // or navigates away with the dialog open AND dirty. + useEffect( () => { + if ( ! open || ! isDialogDirty ) { + return undefined; + } + const handler = ( e ) => { + e.preventDefault(); + e.returnValue = ''; + }; + window.addEventListener( 'beforeunload', handler ); + return () => window.removeEventListener( 'beforeunload', handler ); + }, [ open, isDialogDirty ] ); + + // Tear down the Redux `formSettings` slice on dialog close so the + // next open starts from a clean slate. + useEffect( () => { + if ( ! open ) { + discardFormSettingsState(); + } + }, [ open ] ); + // Create a root element for the dialog useLayoutEffect( () => { let dialogRoot = document.getElementById( 'srfm-dialog-root' ); @@ -86,8 +183,10 @@ const Dialog = ( { }; const isFullscreen = useSelect( - ( select ) => - select( 'core/edit-post' ).isFeatureActive( 'fullscreenMode' ), + // Param renamed to `wpSelect` to avoid shadowing the imported + // `select` from `@wordpress/data` used by the toast listener below. + ( wpSelect ) => + wpSelect( 'core/edit-post' ).isFeatureActive( 'fullscreenMode' ), [] ); @@ -116,6 +215,18 @@ const Dialog = ( { return () => window.removeEventListener( 'resize', updateMargin ); }, [ open, isFullscreen ] ); + useEffect( () => { + const dialogWrapper = document.querySelector( '.srfm-dialog-panel' ); + if ( ! dialogWrapper ) { + return; + } + if ( ! isFullscreen ) { + dialogWrapper.style.marginTop = '40px'; + } else { + dialogWrapper.style.removeProperty( 'margin-top' ); + } + }, [ open, isFullscreen ] ); + const emailNotificationData = sureformsKeys._srfm_email_notification || []; const complianceData = sureformsKeys._srfm_compliance || []; const formCustomCssData = sureformsKeys._srfm_form_custom_css || []; @@ -123,6 +234,79 @@ const Dialog = ( { targetTab ?? 'email_notification' ); + const performAction = ( action ) => { + if ( ! action ) { + return; + } + if ( 'tab' === action.type ) { + setSelectedTab( action.tab ); + return; + } + if ( 'close' === action.type ) { + setOpen( false ); + } + }; + + const requestTabSwitch = ( nextTab ) => { + // Hold tab clicks while a save POST is in flight — the in-flight + // edits will be the post-save baseline once the await resolves, + // and switching tabs mid-await would let "Discard & continue" + // roll back an already-accepted save. + if ( isDialogSaving ) { + return; + } + if ( ! isDialogDirty || nextTab === selectedTab ) { + setSelectedTab( nextTab ); + return; + } + setPendingAction( { type: 'tab', tab: nextTab } ); + }; + + const requestClose = () => { + if ( isDialogSaving ) { + return; + } + if ( ! isDialogDirty ) { + if ( typeof close === 'function' ) { + close(); + } else { + setOpen( false ); + } + return; + } + setPendingAction( { type: 'close' } ); + }; + + // Wrap `setOpen` so Esc / backdrop close attempts also flow through + // the guard. `ForceUIDialog` calls `setOpen(false)` on those paths. + const guardedSetOpen = ( nextOpen ) => { + if ( false === nextOpen && isDialogSaving ) { + return; + } + if ( false === nextOpen && isDialogDirty ) { + setPendingAction( { type: 'close' } ); + return; + } + setOpen( nextOpen ); + }; + + const onConfirmDiscard = () => { + discardFormSettingValues(); + // Flips the centralized dirty flag false + bumps the discard + // counter so the active tab resets its local React state. + discardChanges(); + const next = pendingAction; + setPendingAction( null ); + performAction( next ); + }; + + const onCancelDiscard = () => { + // API-symmetric "stay" branch. No state change today; gives us a + // single hook to extend later. + keepChanges(); + setPendingAction( null ); + }; + const [ parentTab, setParentTab ] = useState( null ); const [ pluginConnected, setPluginConnected ] = useState( @@ -570,7 +754,7 @@ const Dialog = ( { exitOnEsc scrollLock open={ open } - setOpen={ setOpen } + setOpen={ guardedSetOpen } className="[&>div>div]:h-full z-99999 border-radius-none" > <ForceUIDialog.Backdrop /> @@ -590,7 +774,7 @@ const Dialog = ( { variant="ghost" size="sm" className="p-1" - onClick={ close } + onClick={ requestClose } icon={ <XIcon /> } /> </Container> @@ -599,7 +783,7 @@ const Dialog = ( { <SidebarNav tabs={ tabs } selectedTab={ selectedTab } - setSelectedTab={ setSelectedTab } + setSelectedTab={ requestTabSwitch } parentTab={ parentTab } /> { /* Content Area */ } @@ -614,6 +798,69 @@ const Dialog = ( { </div> </div> </Container> + <ConfirmationDialog + isOpen={ pendingAction !== null } + title={ __( 'Unsaved changes', 'sureforms' ) } + description={ __( + 'You have unsaved changes. Discard them to continue, or stay to save your changes.', + 'sureforms' + ) } + confirmButtonText={ __( + 'Discard & continue', + 'sureforms' + ) } + cancelButtonText={ __( 'Keep editing', 'sureforms' ) } + onConfirm={ onConfirmDiscard } + onCancel={ onCancelDiscard } + destructiveConfirmButton={ true } + /> + { /* + * Centralized back-arrow discard modal. Tabs that own + * a "back arrow" (e.g. EmailConfirmation editor) + * dispatch `requestBackDiscard({ ...copy })` with + * caller-supplied copy. On confirm we bump the + * `backDiscardConfirmCounter` so the originating tab + * fires its own navigation (e.g. `handleBackNotification`). + */ } + <ConfirmationDialog + isOpen={ pendingBackDiscard !== null } + title={ pendingBackDiscard?.title || '' } + description={ pendingBackDiscard?.description || '' } + confirmButtonText={ + pendingBackDiscard?.confirmText || + __( 'Discard & go back', 'sureforms' ) + } + cancelButtonText={ + pendingBackDiscard?.cancelText || + __( 'Keep editing', 'sureforms' ) + } + onConfirm={ confirmBackDiscard } + onCancel={ cancelBackDiscard } + destructiveConfirmButton={ true } + /> + { /* + * Single Toaster mount for the entire dialog. Every + * tab + helper goes through `notify` (in @Utils), + * which dispatches `requestToast`; the listener above + * fires @bsf/force-ui's imperative `toast.success/.error` + * on each bump. RTL + z-index config matches the + * page-level mounts elsewhere in the admin. + */ } + <Toaster + position={ + srfm_admin?.is_rtl ? 'top-left' : 'top-right' + } + design="stack" + theme="light" + autoDismiss={ true } + dismissAfter={ 5000 } + className={ cn( + 'z-[999999]', + srfm_admin?.is_rtl + ? '[&>li>div>div.absolute]:right-auto [&>li>div>div.absolute]:left-[0.75rem!important]' + : '' + ) } + /> </ForceUIDialog.Panel> </ForceUIDialog>, renderRoot diff --git a/src/admin/single-form-settings/components/email-settings/EmailConfirmation.js b/src/admin/single-form-settings/components/email-settings/EmailConfirmation.js index 4b508bfbe..a4a65aba1 100644 --- a/src/admin/single-form-settings/components/email-settings/EmailConfirmation.js +++ b/src/admin/single-form-settings/components/email-settings/EmailConfirmation.js @@ -1,13 +1,18 @@ import { __ } from '@wordpress/i18n'; -import Editor from '../QuillEditor'; -import { useState, useEffect } from '@wordpress/element'; -import { useDebouncedCallback } from 'use-debounce'; +import { + useCallback, + useState, + useEffect, + useMemo, + useRef, +} from '@wordpress/element'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { applyFilters } from '@wordpress/hooks'; import { Container, Switch } from '@bsf/force-ui'; -import ModalInputBox from '@Components/force-ui-components/ModalInputBox'; import ModalWarning from '@Components/force-ui-components/ModalWarning'; import TabContentWrapper from '@Components/tab-content-wrapper'; -import FromEmail from './FromEmail'; -import { singleFormEmailOptionsWithFilter } from '@Components/hooks'; +import { EmailNotificationFields } from '@Admin/shared-components/email-notification'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; const EmailConfirmation = ( props ) => { const { @@ -16,9 +21,16 @@ const EmailConfirmation = ( props ) => { handleBackNotification, setHasValidationErrors, } = props; - const [ formData, setFormData ] = useState( { + + // Populated initial state. For Add New this carries the suggested + // defaults (template name, {site_title} / {admin_email} placeholders); + // for Edit it's seeded from `data` so the form mounts with the entry's + // saved values. + const initFormData = () => ( { id: data.id || false, - status: data.status || true, + // Preserve `false` (disabled) — `data.status || true` was forcing a + // disabled notification back to enabled on mount. + status: data.status ?? true, is_raw_format: data.is_raw_format || false, name: data.name || 'New Notification', email_to: data.email_to || '', @@ -31,391 +43,355 @@ const EmailConfirmation = ( props ) => { from_email: data.from_email || '{admin_email}', } ); - const [ prevData, setPrevData ] = useState( {} ); // Previous saved data before making any changes. + // Empty baseline used as `prevData` for the Add New flow only. + // + // Intentionally dirty-on-mount: when the user clicks "Add New", they + // have explicitly asked to create a notification. The populated + // template defaults (template name, {site_title}, {admin_email}) ARE + // the proposed payload — saving them as-is is a valid outcome. With + // `formData` carrying those defaults and `prevData` blank, the JSON + // diff reads as "unsaved" on mount so Save activates immediately and + // the dialog's unsaved-changes guard catches accidental dismissal. + // + // Trade-off: closing the browser tab right after opening Add New + // without typing fires the native `beforeunload` prompt. Acceptable + // because the alternative (deferring dirty until first keystroke) + // would let users walk away from an in-flight "Add New" with no + // indication they had pending work. + const initBlankData = () => ( { + id: false, + status: true, + is_raw_format: false, + name: '', + email_to: '', + subject: '', + email_reply_to: '', + email_bcc: '', + email_cc: '', + email_body: '', + from_name: '', + from_email: '', + } ); + const [ formData, setFormData ] = useState( initFormData ); + // Edit: snapshot of the entry on mount (formData == prevData → clean). + // Add New: blank baseline so the diff against the populated formData + // reads dirty on mount. `onSaveSuccess` re-snaps prevData = formData + // after a successful save in either flow. + const [ prevData, setPrevData ] = useState( () => + data?.id ? initFormData() : initBlankData() + ); + // Tab-owned in-flight save flag. TabContentWrapper toggles this via + // `onSavingChange` around the POST so the Save button locks during the + // network call (prevents double-fires). + const [ isSaving, setIsSaving ] = useState( false ); const [ dynamicSubject, setDynamicSubject ] = useState( - data.subject || '' + data?.subject || '' ); - const handleOnChangeEmailBodyContent = ( newContent ) => { - setFormData( { ...formData, email_body: newContent } ); - }; - useEffect( () => { - setFormData( { ...formData, subject: dynamicSubject } ); - }, [ dynamicSubject ] ); + // Ref holds the callback to fire when the user confirms the + // dialog-level back-arrow discard modal. We can't ship the function + // itself through Redux, so we stash it locally and react to the + // confirm-counter bump below. + const onBackConfirmRef = useRef( null ); - const genericSmartTags = window.srfm_block_data?.smart_tags_array - ? Object.entries( window.srfm_block_data.smart_tags_array ) - : []; - const genericEmailSmartTags = window.srfm_block_data?.smart_tags_array_email - ? Object.entries( window.srfm_block_data.smart_tags_array_email ) - : []; - const formSmartTags = window.sureforms?.formSpecificSmartTags ?? []; - - const formEmailSmartTags = - window.sureforms?.formSpecificEmailSmartTags ?? []; + const localIsDirty = useMemo( + () => JSON.stringify( formData ) !== JSON.stringify( prevData ), + [ formData, prevData ] + ); - // Remove the required error class from the input field on change - const maybeRemoveRequiredError = ( e ) => { - const queryId = - e === 'subject' - ? '#srfm-email-notification-subject' - : '#srfm-email-notification-to'; - const inputField = document.querySelector( queryId ); - if ( inputField ) { - inputField.classList.remove( 'outline-focus-error-border' ); + // Per-slot dirty contributions from filter-driven extension panels + // (e.g. pro "Attach Uploaded Files" rendered via + // `srfm.singleFormEmail.settings`). Same shape as FormRestriction's + // `extensionDirtyMap`: the setter is `useCallback([])`-stable and + // rides through the filter ctx as a plain function prop, so pro + // can call it without needing a Redux dispatch or cross-bundle + // React Context. + const [ extensionDirtyMap, setExtensionDirtyMap ] = useState( {} ); + const registerExtensionDirty = useCallback( ( slot, value ) => { + if ( ! slot ) { + return; } - }; + setExtensionDirtyMap( ( prev ) => { + if ( prev[ slot ] === value ) { + return prev; + } + return { ...prev, [ slot ]: value }; + } ); + }, [] ); + const extensionsIsDirty = useMemo( + () => Object.values( extensionDirtyMap ).some( Boolean ), + [ extensionDirtyMap ] + ); - // Function to remove the required error class if the condition is met - const removeErrorClassIfNeeded = ( selector, condition ) => { - if ( condition ) { - const inputElement = document.querySelector( selector ); - inputElement?.classList.remove( 'outline-focus-error-border' ); - } - }; + const isDirty = localIsDirty || extensionsIsDirty; - // if required fields values are changed by smart tags then remove the required error + // Push the local dirty signal into the store so the dialog's + // unsaved-changes guard (tab switch / X / Esc / backdrop / beforeunload) + // can read it without holding a reference to this component. + const { setSingleFormSettingUnsave, requestBackDiscard } = useDispatch( + SRFM_STORE_NAME + ); useEffect( () => { - removeErrorClassIfNeeded( - '#srfm-email-notification-to', - formData.email_to - ); - removeErrorClassIfNeeded( - '#srfm-email-notification-subject', - dynamicSubject - ); - }, [ formData.email_to, dynamicSubject ] ); + setSingleFormSettingUnsave( isDirty ); + }, [ isDirty, setSingleFormSettingUnsave ] ); - // Set previous data one time on component load. + // Unmount cleanup — covers every exit path (back-arrow discard, dialog + // close, tab switch via Discard & continue). Without this, the central + // flag would stay `true` after a local back-arrow discard and mis-fire + // the dialog popup on the next tab click. useEffect( () => { - setPrevData( formData ); + return () => { + setSingleFormSettingUnsave( false ); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [] ); - const onClickBack = () => { - if ( handleConfirmEmail( formData ) ) { - handleBackNotification(); + // Listen for the discard signal dispatched by the dialog's "Discard & + // continue" branch. Each bump of `discardCounter` is one discard event; + // the ref skips the initial render so the tab doesn't reset itself on + // mount. + const discardCounter = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectSingleFormSettingDiscardCounter?.() || + 0, + [] + ); + const lastDiscardCounter = useRef( discardCounter ); + useEffect( () => { + if ( discardCounter === lastDiscardCounter.current ) { + return; } - }; + lastDiscardCounter.current = discardCounter; + setFormData( prevData ); + setDynamicSubject( prevData?.subject || '' ); + }, [ discardCounter ] ); - // On cancel button clicked. - const onCancel = () => { - if ( formData.id ) { - handleConfirmEmail( prevData ); + // Listen for the dialog-level back-arrow discard confirm. Each bump of + // `backDiscardConfirmCounter` means the user clicked "Discard & go + // back" in the centralized modal — fire the callback we stashed in + // `onBackConfirmRef` (set by `onClickBack` when the modal was opened). + const backDiscardConfirmCounter = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectBackDiscardConfirmCounter?.() || 0, + [] + ); + const lastBackDiscardCounter = useRef( backDiscardConfirmCounter ); + useEffect( () => { + if ( backDiscardConfirmCounter === lastBackDiscardCounter.current ) { + return; } - handleBackNotification(); - }; + lastBackDiscardCounter.current = backDiscardConfirmCounter; + const cb = onBackConfirmRef.current; + onBackConfirmRef.current = null; + cb?.(); + }, [ backDiscardConfirmCounter ] ); + + // Clear any stale form-level validation error flag when the user edits. + // Validation runs at Save click (`validateBeforeSave`), not on every + // keystroke — keeps toasts from spamming during typing. + useEffect( () => { + setHasValidationErrors( false ); + }, [ formData ] ); - const debounced = useDebouncedCallback( ( value ) => { - if ( ! handleConfirmEmail( value ) ) { - setHasValidationErrors( true ); + /** + * Field change handler shared with EmailNotificationFields. Routes + * subject through `dynamicSubject` so the smart-tag append flow keeps + * working, and merges everything else into local `formData`. + * + * @param {string} key Field key (matches the FormData property). + * @param {*} value New value. + */ + const handleChange = ( key, value ) => { + if ( key === 'subject' ) { + setDynamicSubject( value ); + return; // The subject useEffect below mirrors into formData. } - }, 500 ); + setFormData( ( prev ) => ( { ...prev, [ key ]: value } ) ); + }; + // Mirror dynamicSubject into formData so isDirty / Save payload see it. useEffect( () => { - setHasValidationErrors( false ); + setFormData( ( prev ) => ( { ...prev, subject: dynamicSubject } ) ); + }, [ dynamicSubject ] ); - if ( formData.id ) { - /** - * Only do autosave, if it is an existing data item. - */ - debounced( formData ); + const onClickBack = () => { + const isValid = handleConfirmEmail( formData, { silent: true } ); + if ( isValid && ! isDirty ) { + handleBackNotification(); + return; } - }, [ formData ] ); + const reason = ! isValid ? 'invalid' : 'dirty'; + // Stash the navigation callback locally — Redux can't carry + // function references. The confirm-counter listener above will + // fire it when the user clicks "Discard & go back". + onBackConfirmRef.current = handleBackNotification; + requestBackDiscard( { + title: + reason === 'invalid' + ? __( 'Some fields need attention', 'sureforms' ) + : __( 'Unsaved changes', 'sureforms' ), + description: + reason === 'invalid' + ? __( + 'A recipient email address and subject line are required before this notification can be saved. Fix the highlighted fields, or discard your changes to go back.', + 'sureforms' + ) + : __( + 'You have unsaved changes for this notification. Discard them to go back, or stay to save them.', + 'sureforms' + ), + confirmText: __( 'Discard & go back', 'sureforms' ), + cancelText: + reason === 'invalid' + ? __( 'Stay & fix', 'sureforms' ) + : __( 'Keep editing', 'sureforms' ), + } ); + }; - const emailHelpText = __( - 'Comma separated values are also accepted.', - 'sureforms' - ); + const validateBeforeSave = () => { + // `handleConfirmEmail` runs the side effects (red border on the + // invalid input + `setHasValidationErrors(true)`); we still call + // it with `silent: true` so it doesn't emit its own toast. The + // returned boolean tells us validity; we compute the *specific* + // toast copy locally so the user knows which field to fix. + if ( handleConfirmEmail( formData, { silent: true } ) ) { + return null; + } + const missingEmail = ! ( formData.email_to || '' ).trim(); + const missingSubject = ! ( formData.subject || '' ).trim(); + if ( missingEmail && missingSubject ) { + return __( + 'Please provide a recipient email address and subject line.', + 'sureforms' + ); + } + if ( missingEmail ) { + return __( + 'Please provide a recipient email address.', + 'sureforms' + ); + } + return __( 'Please provide a subject line.', 'sureforms' ); + }; - const emailNotificationOptions = [ - { - id: 'name', - component: ( - <ModalInputBox - label={ __( 'Name', 'sureforms' ) } - id="srfm-email-notification-name" - value={ formData.name } - onChange={ ( newInput ) => - setFormData( { - ...formData, - name: newInput, - } ) - } - showSmartTagList={ false } - smartTagList={ [ - { - tags: formSmartTags, - label: __( 'Form input tags', 'sureforms' ), - }, - { - tags: genericSmartTags, - label: __( 'Generic tags', 'sureforms' ), - }, - ] } - tagFor="srfm-email-notification-name" - setTargetData={ ( tag ) => - setDynamicSubject( dynamicSubject + tag ) - } - /> - ), - }, - { - id: 'send-email-to', - component: ( - <ModalInputBox - label={ __( 'Send Email To', 'sureforms' ) } - id="srfm-email-notification-to" - value={ formData.email_to } - onChange={ ( e ) => { - setFormData( { - ...formData, - email_to: e, - } ); - maybeRemoveRequiredError( 'email_to' ); - } } - required={ true } - helpText={ emailHelpText } - smartTagList={ [ - { - tags: formEmailSmartTags, - label: __( 'Form input tags', 'sureforms' ), - }, - { - tags: genericEmailSmartTags, - label: __( 'Generic tags', 'sureforms' ), - }, - ] } - tagFor="emailConfirmation.sendEmailTo" - setTargetData={ ( tag ) => - setFormData( { - ...formData, - email_to: formData.email_to + tag, - } ) - } - /> - ), - }, - { - id: 'subject', - component: ( - <ModalInputBox - label={ __( 'Subject', 'sureforms' ) } - id="srfm-email-notification-subject" - value={ dynamicSubject } - onChange={ ( e ) => { - setDynamicSubject( e ); - maybeRemoveRequiredError( 'subject' ); - } } - required={ true } - smartTagList={ [ - { - tags: formSmartTags, - label: __( 'Form input tags', 'sureforms' ), - }, - { - tags: genericSmartTags, - label: __( 'Generic tags', 'sureforms' ), - }, - ] } - tagFor="emailConfirmation.Subject" - setTargetData={ ( tag ) => - setDynamicSubject( dynamicSubject + tag ) - } - /> - ), - }, - { - id: 'email-body', - component: ( - <div className="py-2 gap-6"> - <Editor - handleContentChange={ handleOnChangeEmailBodyContent } - content={ formData.email_body } - formData={ formData } - setFormData={ setFormData } - allData={ true } - /> - </div> - ), - }, - { - id: 'is-raw-format', - component: ( - <> - <Switch - size="sm" - label={ { - heading: __( 'Send as Raw HTML', 'sureforms' ), - description: __( - 'When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.', - 'sureforms' - ), - } } - checked={ formData.is_raw_format } - onChange={ ( checked ) => - setFormData( ( prev ) => ( { - ...prev, - is_raw_format: checked, - } ) ) - } - /> - { formData.is_raw_format && ( - <ModalWarning - message={ __( - 'Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.', - 'sureforms' - ) } + const onSaveSuccess = () => setPrevData( formData ); + + // Resolve filter-driven extension panels for the Email Notification + // editor. Seed the array with our own `is-raw-format` entry so pro + // callbacks that anchor relative to it (e.g. AttachUploads splices + // after `is-raw-format`) keep their existing behaviour. Then split + // the result by id into two render zones: + // + // - `inlineExtensions` — rendered between Email Body and From + // Name (matches the position those entries had in master's + // single-form options array). Includes `is-raw-format` itself + // plus anything anchored to it. + // - `trailingExtensions` — rendered after Reply To. Catches + // panels that were pushed to the end of the array in master + // (e.g. `email-conditional-logic` = "Add Trigger Conditions"). + // + // The id allowlist below is the explicit set known to anchor near + // `is-raw-format`. Anything else defaults to the trailing zone — + // that matches master's "pushed to end" default for plain + // `.push()` filter callbacks. + const INLINE_EXTENSION_IDS = [ 'is-raw-format', 'attach-uploads' ]; + const filteredEmailSettings = applyFilters( + 'srfm.singleFormEmail.settings', + [ + { + id: 'is-raw-format', + component: ( + <div key="is-raw-format" className="space-y-3"> + <Switch + size="sm" + label={ { + heading: __( + 'Send as Raw HTML', + 'sureforms' + ), + description: __( + 'When enabled, the email body HTML will be preserved exactly as written and wrapped in a professional email template.', + 'sureforms' + ), + } } + checked={ formData.is_raw_format } + onChange={ ( checked ) => + setFormData( ( prev ) => ( { + ...prev, + is_raw_format: checked, + } ) ) + } /> - ) } - </> - ), - }, + { formData.is_raw_format && ( + <ModalWarning + message={ __( + 'Smart tags that reference user-submitted fields will not be escaped in raw HTML mode. Avoid inserting untrusted field values directly into the email body.', + 'sureforms' + ) } + /> + ) } + </div> + ), + }, + ], { - id: 'from-email', - component: ( - <FromEmail - formData={ formData } - setFormData={ setFormData } - genericSmartTags={ genericSmartTags } - genericEmailSmartTags={ genericEmailSmartTags } - formSmartTags={ formSmartTags } - formEmailSmartTags={ formEmailSmartTags } - /> - ), - }, - { - id: 'cc', - component: ( - <ModalInputBox - label={ __( 'CC', 'sureforms' ) } - id="srfm-email-notification-cc" - value={ formData.email_cc } - onChange={ ( e ) => - setFormData( { - ...formData, - email_cc: e, - } ) - } - helpText={ emailHelpText } - required={ false } - smartTagList={ [ - { - tags: formEmailSmartTags, - label: __( 'Form input tags', 'sureforms' ), - }, - { - tags: genericEmailSmartTags, - label: __( 'Generic tags', 'sureforms' ), - }, - ] } - tagFor="emailConfirmation.CC" - setTargetData={ ( tag ) => - setFormData( { - ...formData, - email_cc: formData.email_cc + tag, - } ) - } - labelWithInfoTooltip={ true } - /> - ), - }, - { - id: 'bcc', - component: ( - <ModalInputBox - label={ __( 'BCC', 'sureforms' ) } - id="srfm-email-notification-bcc" - value={ formData.email_bcc } - onChange={ ( e ) => - setFormData( { - ...formData, - email_bcc: e, - } ) - } - required={ false } - helpText={ emailHelpText } - smartTagList={ [ - { - tags: formEmailSmartTags, - label: __( 'Form input tags', 'sureforms' ), - }, - { - tags: genericEmailSmartTags, - label: __( 'Generic tags', 'sureforms' ), - }, - ] } - tagFor="emailConfirmation.BCC" - setTargetData={ ( tag ) => - setFormData( { - ...formData, - email_bcc: formData.email_bcc + tag, - } ) - } - labelWithInfoTooltip={ true } - /> - ), - }, - { - id: 'reply-to', - component: ( - <ModalInputBox - label={ __( 'Reply To', 'sureforms' ) } - id="srfm-email-notification-reply-to" - value={ formData.email_reply_to } - onChange={ ( e ) => - setFormData( { - ...formData, - email_reply_to: e, - } ) - } - required={ false } - helpText={ emailHelpText } - smartTagList={ [ - { - tags: formEmailSmartTags, - label: __( 'Form input tags', 'sureforms' ), - }, - { - tags: genericEmailSmartTags, - label: __( 'Generic tags', 'sureforms' ), - }, - ] } - tagFor="emailConfirmation.replyTo" - setTargetData={ ( tag ) => - setFormData( { - ...formData, - email_reply_to: formData.email_reply_to + tag, - } ) - } - labelWithInfoTooltip={ true } - /> - ), - }, - ]; - - // Apply filters to the email options. - // This allows us to modify the email notification options. - let filterOptions = singleFormEmailOptionsWithFilter( - emailNotificationOptions, - { ...props, formData, setFormData } + ...props, + formData, + setFormData, + // Filter-driven extension panels (e.g. pro AttachUploads, + // EmailConditionalLogic) push their own dirty boolean via + // this callback so the host Save button activates on + // extension edits. Stable reference so the consumer + // effect deps don't churn. + registerExtensionDirty, + } + ); + const inlineExtensions = filteredEmailSettings.filter( ( option ) => + INLINE_EXTENSION_IDS.includes( option.id ) + ); + const trailingExtensions = filteredEmailSettings.filter( + ( option ) => ! INLINE_EXTENSION_IDS.includes( option.id ) ); - - // if filterOptions is empty, return null to avoid rendering - if ( ! filterOptions || filterOptions.length === 0 ) { - filterOptions = emailNotificationOptions; - } return ( <TabContentWrapper title={ __( 'Email Notifications', 'sureforms' ) } - actionBtnText={ __( 'Cancel', 'sureforms' ) } - actionBtnVariant="outline" - onClickAction={ onCancel } onClickBack={ onClickBack } shouldShowAutoSaveText={ true } + tabId="email_notification" + showSaveButton={ true } + validate={ validateBeforeSave } + isDirty={ isDirty } + isSaving={ isSaving } + onSavingChange={ setIsSaving } + onSaveSuccess={ onSaveSuccess } > <Container direction="column" className="gap-4 px-2"> - { filterOptions.map( ( option ) => option.component ) } + <EmailNotificationFields + context="form" + values={ formData } + onChange={ handleChange } + showNameField={ true } + showAllDataTag={ true } + dynamicSubject={ dynamicSubject } + setDynamicSubject={ setDynamicSubject } + onValidationError={ setHasValidationErrors } + // `is-raw-format` + anchored extensions (e.g. + // pro AttachUploads which splices after it) + // render between Email Body and From Name — + // matches master's single-form options + // ordering. + renderAfterEmailBody={ inlineExtensions.map( + ( option ) => option.component + ) } + // Trailing extension panels — pushed to the + // end of the filter array (e.g. pro + // EmailConditionalLogic = "Add Trigger + // Conditions") render after Reply To. + renderAfterFields={ trailingExtensions.map( + ( option ) => option.component + ) } + /> </Container> </TabContentWrapper> ); diff --git a/src/admin/single-form-settings/components/email-settings/EmailNotification.js b/src/admin/single-form-settings/components/email-settings/EmailNotification.js index 446c2ee77..739224daf 100644 --- a/src/admin/single-form-settings/components/email-settings/EmailNotification.js +++ b/src/admin/single-form-settings/components/email-settings/EmailNotification.js @@ -1,20 +1,20 @@ import { __ } from '@wordpress/i18n'; import EmailConfirmation from './EmailConfirmation'; import { useEffect, useState, forwardRef } from '@wordpress/element'; -import { store as editorStore } from '@wordpress/editor'; -import { useDispatch } from '@wordpress/data'; +import { + srfmEditFormMeta, + srfmSaveFormMeta, +} from '@Components/tab-content-wrapper/edit-form-meta'; import { Button, Container, Switch, Table, - Toaster, - toast, Tooltip, } from '@bsf/force-ui'; import { Copy, PenLine, Trash } from 'lucide-react'; import TabContentWrapper from '@Components/tab-content-wrapper'; -import { cn } from '@Utils/Helpers'; +import { notify } from '@Utils/notify'; import { applyFilters, doAction } from '@wordpress/hooks'; const CustomButton = forwardRef( @@ -54,7 +54,6 @@ const EmailNotification = ( { const [ showConfirmation, setShowConfirmation ] = useState( false ); const [ currData, setCurrData ] = useState( [] ); const [ isPopup, setIsPopup ] = useState( null ); - const { editPost } = useDispatch( editorStore ); const getNextUniqueId = () => { if ( ! emailNotificationData || emailNotificationData.length === 0 ) { @@ -75,12 +74,13 @@ const EmailNotification = ( { const filterData = emailNotificationData.filter( ( el ) => el.id !== data.id ); - updateMeta( '_srfm_email_notification', filterData ); + // Commit immediately so the deletion isn't seen as an "unsaved + // change" — no Save button activation, no unsaved-changes popup. + srfmSaveFormMeta( '_srfm_email_notification', filterData ); doAction( 'srfm.emailNotification.deleted', data ); - toast.dismiss(); - toast.success( __( 'Email notification deleted!', 'sureforms' ), { + notify.success( __( 'Email notification deleted!', 'sureforms' ), { duration: 500, } ); }; @@ -94,12 +94,11 @@ const EmailNotification = ( { doAction( 'srfm.emailNotification.duplicated', data, duplicateData ); - toast.dismiss(); - toast.success( __( 'Email notification duplicated!', 'sureforms' ), { + notify.success( __( 'Email notification duplicated!', 'sureforms' ), { duration: 500, } ); }; - const handleUpdateEmailData = ( newData ) => { + const handleUpdateEmailData = ( newData, { silent = false } = {} ) => { let { email_to, subject } = newData; let hasError = false; @@ -128,14 +127,30 @@ const EmailNotification = ( { } if ( hasError ) { - toast.dismiss(); - toast.error( - __( - 'Please provide a recipient email address and subject line.', - 'sureforms' - ), - { duration: 500 } - ); + if ( ! silent ) { + // Branch the toast copy so the user knows exactly which + // required field is missing. + const missingEmail = ! email_to; + const missingSubject = ! subject; + let message; + if ( missingEmail && missingSubject ) { + message = __( + 'Please provide a recipient email address and subject line.', + 'sureforms' + ); + } else if ( missingEmail ) { + message = __( + 'Please provide a recipient email address.', + 'sureforms' + ); + } else { + message = __( + 'Please provide a subject line.', + 'sureforms' + ); + } + notify.error( message, { duration: 500 } ); + } setHasValidationErrors( true ); return false; } @@ -153,15 +168,10 @@ const EmailNotification = ( { } ); } updateMeta( '_srfm_email_notification', currEmailData ); - toast.dismiss(); return true; }; function updateMeta( option, value ) { - const option_array = {}; - option_array[ option ] = value; - editPost( { - meta: option_array, - } ); + srfmEditFormMeta( option, value ); } const handleToggle = ( data ) => { const updatedData = emailNotificationData.map( ( el ) => { @@ -170,20 +180,11 @@ const EmailNotification = ( { } return el; } ); - updateMeta( '_srfm_email_notification', updatedData ); - - toast.dismiss(); - if ( ! data.status ) { - toast.success( - __( 'Email Notification enabled successfully.', 'sureforms' ), - { duration: 500 } - ); - } else { - toast.success( - __( 'Email Notification disabled successfully.', 'sureforms' ), - { duration: 500 } - ); - } + // Commit immediately so flipping status isn't seen as an "unsaved + // change" — it shouldn't activate Save or trip the discard popup. + // The Switch in the table re-renders from the new data, so the + // "enabled/disabled successfully" toast is redundant. + srfmSaveFormMeta( '_srfm_email_notification', updatedData ); }; const handleBackNotification = () => { setShowConfirmation( false ); @@ -205,9 +206,6 @@ const EmailNotification = ( { }, ]; - const isRTL = srfm_admin?.is_rtl; - const toasterPosition = isRTL ? 'top-left' : 'top-right'; - useEffect( () => { function handleClickOutside() { setIsPopup( null ); @@ -222,28 +220,16 @@ const EmailNotification = ( { }, [ isPopup ] ); if ( showConfirmation ) { + // Toaster is mounted once at the dialog level (Dialog.js). + // `notify.success/.error` calls from this branch route through + // the store and surface there. return ( - <> - <Toaster - position={ toasterPosition } - design="stack" - theme="light" - autoDismiss={ true } - dismissAfter={ 5000 } - className={ cn( - 'z-[999999]', - isRTL - ? '[&>li>div>div.absolute]:right-auto [&>li>div>div.absolute]:left-[0.75rem!important]' - : '' - ) } - /> - <EmailConfirmation - setHasValidationErrors={ setHasValidationErrors } - handleConfirmEmail={ handleUpdateEmailData } - handleBackNotification={ handleBackNotification } - data={ currData } - /> - </> + <EmailConfirmation + setHasValidationErrors={ setHasValidationErrors } + handleConfirmEmail={ handleUpdateEmailData } + handleBackNotification={ handleBackNotification } + data={ currData } + /> ); } @@ -268,20 +254,14 @@ const EmailNotification = ( { 'Control email alerts sent to admins or users after a form submission.', 'sureforms' ) } + // The listing view itself has nothing to "save" — toggle and + // delete are immediate-commit; Add Notification opens the + // editor sub-view which renders its own Save button. Hide the + // header Save here so the regression flagged on the prior PR + // (perma-disabled Save) doesn't appear. + showSaveButton={ false } + tabId="email_notification" > - <Toaster - position={ toasterPosition } - design="stack" - theme="light" - autoDismiss={ true } - dismissAfter={ 5000 } - className={ cn( - 'z-[999999]', - isRTL - ? '[&>li>div>div.absolute]:right-auto [&>li>div>div.absolute]:left-[0.75rem!important]' - : '' - ) } - /> <Table className="rounded-md"> <Table.Head> { headerContent.map( ( header, index ) => ( diff --git a/src/admin/single-form-settings/components/email-settings/FromEmail.js b/src/admin/single-form-settings/components/email-settings/FromEmail.js index 8216a8276..5e372c2e5 100644 --- a/src/admin/single-form-settings/components/email-settings/FromEmail.js +++ b/src/admin/single-form-settings/components/email-settings/FromEmail.js @@ -1,9 +1,12 @@ -import { __, sprintf } from '@wordpress/i18n'; +import { __ } from '@wordpress/i18n'; import { useEffect, useState } from '@wordpress/element'; -import svg from '@Svg/svgs.json'; -import parse from 'html-react-parser'; import ModalInputBox from '@Components/force-ui-components/ModalInputBox'; +import WarningBox from '@Components/misc/WarningBox'; import { Container } from '@bsf/force-ui'; +import { + getFromEmailWarningMessage, + renderSureMailRecommendation, +} from '@Utils/emailValidation'; const FromEmail = ( { formData, @@ -16,132 +19,21 @@ const FromEmail = ( { const [ fromEmailWarningMessage, setFromEmailWarningMessage ] = useState( '' ); - /** - * Validate and show warning message for From Email - */ - const validateAndShowFromEmailWarning = () => { - const fromEmail = formData?.from_email || ''; - const userEnteredUrl = fromEmail?.split( '@' )[ 1 ] || ''; - const siteUrl = window?.srfm_block_data?.site_url || ''; - const isValidEmail = - /^[\p{L}\p{N}._%+-]+@[\p{L}\p{N}.-]+\.[\p{L}]{2,}$/u.test( - fromEmail - ); - - // If value starts with '{', no warning should be displayed. To avoid issue with smart tags. - let warningMessage = ''; + useEffect( () => { + const warningResult = getFromEmailWarningMessage( + formData?.from_email + ); - if ( fromEmail.startsWith( '{' ) && fromEmail.endsWith( '}' ) ) { - if ( srfm_block_data?.is_suremails_active ) { - warningMessage = sprintf( - // Translators: %1$s is the website domain, %2$s is the suggested admin email. - __( - "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).", - 'sureforms' - ), - siteUrl, - siteUrl - ); - } else { - warningMessage = ( - <> - { sprintf( - // Translators: %s is the website domain. - __( - "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ", - 'sureforms' - ), - siteUrl - ) } - { __( - 'We strongly recommend that you install the free ', - 'sureforms' - ) } - <a - href="https://suremails.com?utm_medium=sureforms" - target="_blank" - rel="noopener noreferrer" - > - SureMail - </a> - { __( - ' plugin! The Setup Wizard makes it easy to fix your emails. ', - 'sureforms' - ) } - { sprintf( - // Translators: %s is the website domain. - __( - ' Alternately, try using a From Address that matches your website domain (admin@%s).', - 'sureforms' - ), - siteUrl - ) } - </> - ); - } - } else if ( fromEmail === '' || ! isValidEmail ) { - warningMessage = __( - "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.", - 'sureforms' + if ( warningResult?.type === 'jsx' ) { + setFromEmailWarningMessage( + renderSureMailRecommendation( + warningResult.siteUrl, + warningResult.messageType + ) ); - } else if ( userEnteredUrl !== siteUrl ) { - if ( srfm_block_data?.is_suremails_active ) { - warningMessage = sprintf( - // Translators: %1$s is the website domain, %2$s is the suggested admin email. - __( - "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).", - 'sureforms' - ), - siteUrl, - siteUrl - ); - } else { - warningMessage = ( - <> - { sprintf( - // Translators: %s is the website domain. - __( - "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ", - 'sureforms' - ), - siteUrl - ) } - { __( - 'We strongly recommend that you install the free ', - 'sureforms' - ) } - <a - href="https://suremails.com?utm_medium=sureforms" - target="_blank" - rel="noopener noreferrer" - > - SureMail - </a> - { __( - ' plugin! The Setup Wizard makes it easy to fix your emails. ', - 'sureforms' - ) } - { sprintf( - // Translators: %s is the website domain. - __( - ' Alternately, try using a From Address that matches your website domain (admin@%s).', - 'sureforms' - ), - siteUrl - ) } - </> - ); - } } else { - warningMessage = undefined; + setFromEmailWarningMessage( warningResult ); } - - setFromEmailWarningMessage( warningMessage ); - }; - - useEffect( () => { - // Validate and show warning message for From Email - validateAndShowFromEmailWarning(); }, [ formData ] ); const fromEmailHelpText = __( @@ -214,20 +106,11 @@ const FromEmail = ( { <Container direction="column" className="gap-0" align="stretch"> { fromEmailWarningMessage && ( - <ModalWarning message={ fromEmailWarningMessage } /> + <WarningBox message={ fromEmailWarningMessage } /> ) } </Container> </> ); }; -const ModalWarning = ( { message } ) => { - return ( - <Container className="w-full p-3 gap-2 border border-solid border-alert-border-warning bg-alert-background-warning rounded-lg"> - <span className="size-5">{ parse( svg?.warning ) }</span> - <span className="text-sm font-normal">{ message }</span> - </Container> - ); -}; - export default FromEmail; diff --git a/src/admin/single-form-settings/components/form-confirm-setting/DefaultConfirmationTypes.js b/src/admin/single-form-settings/components/form-confirm-setting/DefaultConfirmationTypes.js index 80f7ded64..8697cae8f 100644 --- a/src/admin/single-form-settings/components/form-confirm-setting/DefaultConfirmationTypes.js +++ b/src/admin/single-form-settings/components/form-confirm-setting/DefaultConfirmationTypes.js @@ -1,182 +1,47 @@ -import Editor from '../QuillEditor'; -import { __ } from '@wordpress/i18n'; -import { useEffect, useRef, useState } from '@wordpress/element'; -import { Select, Label, Input } from '@bsf/force-ui'; -import RadioGroup from '@Admin/components/RadioGroup'; -import { useDebouncedCallback } from 'use-debounce'; -import { getWordPressPages } from '@Utils/Helpers'; - -const AFTER_SUBMISSION_OPTIONS = [ - { - label: __( 'Hide Form', 'sureforms' ), - value: 'hide form', - }, - { - label: __( 'Reset Form', 'sureforms' ), - value: 'reset form', - }, -]; - +import { ConfirmationFields } from '@Admin/shared-components/form-confirmation'; + +/** + * Form-Level Default Confirmation Types Component + * + * Uses shared ConfirmationFields component for consistency with global settings. + * Adds form-specific features like query parameters. + * + * @param {Object} props + * @param {Object} props.data - Current confirmation data + * @param {Function} props.setData - Data setter + * @param {Array} props.pageOptions - WordPress pages for dropdown + * @param {string} props.errorMessage - Validation error message + * @param {Function} props.setErrorMessage - Error message setter + * @param {Function} props.keyValueComponent - Query params UI renderer + */ const DefaultConfirmationTypes = ( { data, setData, pageOptions, - setPageOptions, setErrorMessage, errorMessage, keyValueComponent, } ) => { - const [ canDisplayError, setCanDisplayError ] = useState( false ); - const controllerRef = useRef( null ); - const handlePageSearch = useDebouncedCallback( ( keyword = '' ) => { - controllerRef.current?.abort(); - controllerRef.current = new AbortController(); - getWordPressPages( setPageOptions, { - search: keyword, - selectedUrl: data?.page_url || '', - signal: controllerRef.current.signal, - } ); - }, 300 ); - - const handleEditorChange = ( newContent ) => { - setData( { ...data, message: newContent } ); + /** + * Handle field change and update parent state. + * @param {string} key + * @param {*} value + */ + const handleChange = ( key, value ) => { + setData( { ...data, [ key ]: value } ); }; - useEffect( () => { - // Do not display pre-validation message right after changing tabs or confirmation type. - setCanDisplayError( false ); - }, [ data?.confirmation_type ] ); - - useEffect( () => { - return () => { - handlePageSearch.cancel(); - controllerRef.current?.abort(); - }; - }, [ handlePageSearch ] ); - return ( - <> - { data?.confirmation_type === 'same page' && ( - <> - <div> - <Editor - handleContentChange={ handleEditorChange } - content={ data?.message } - /> - </div> - <div className="space-y-2"> - <Label> - { __( 'After Form Submission', 'sureforms' ) } - </Label> - <RadioGroup cols={ 2 }> - { AFTER_SUBMISSION_OPTIONS.map( - ( option, index ) => ( - <RadioGroup.Option - key={ index } - label={ option.label } - value={ option.value } - checked={ - data?.submission_action === - option.value - } - onChange={ () => - setData( { - ...data, - submission_action: option.value, - } ) - } - /> - ) - ) } - </RadioGroup> - </div> - </> - ) } - - { data?.confirmation_type === 'different page' && ( - <> - <div className="space-y-6"> - <div className="space-y-1.5"> - <Label htmlFor="select-page"> - { __( 'Select Page to redirect', 'sureforms' ) } - </Label> - <Select - options={ pageOptions } - value={ data?.page_url } - onChange={ ( value ) => { - setCanDisplayError( true ); - setErrorMessage( null ); - setData( { - ...data, - page_url: value, - } ); - } } - combobox - searchFn={ handlePageSearch } - debounceDelay={ 0 } - searchPlaceholder={ __( - 'Search for a page', - 'sureforms' - ) } - > - <Select.Button - id="select-page" - placeholder={ __( - 'Select a page', - 'sureforms' - ) } - > - { - pageOptions?.find( - ( option ) => - option.value === data?.page_url - )?.label - } - </Select.Button> - <Select.Options> - { pageOptions?.map( ( option ) => ( - <Select.Option - key={ option.value } - value={ option.value } - selected={ - option.value === data?.page_url - } - > - { option.label } - </Select.Option> - ) ) } - </Select.Options> - </Select> - </div> - </div> - { keyValueComponent() } - </> - ) } - { data?.confirmation_type === 'custom url' && ( - <> - <div className="space-y-1.5"> - <Label htmlFor="custom-url-input" required> - { __( 'Custom URL', 'sureforms' ) } - </Label> - <Input - id="custom-url-input" - value={ data?.custom_url } - onChange={ ( value ) => { - setCanDisplayError( true ); - setData( { ...data, custom_url: value } ); - } } - size="md" - /> - { canDisplayError && errorMessage && ( - <Label variant="error" size="sm"> - { errorMessage } - </Label> - ) } - </div> - { keyValueComponent() } - </> - ) } - </> + <ConfirmationFields + context="form" + data={ data } + onChange={ handleChange } + pageOptions={ pageOptions } + errorMessage={ errorMessage } + setErrorMessage={ setErrorMessage } + showQueryParams={ true } + renderQueryParams={ keyValueComponent } + /> ); }; diff --git a/src/admin/single-form-settings/components/form-confirm-setting/index.js b/src/admin/single-form-settings/components/form-confirm-setting/index.js index be57668cf..580c85eb9 100644 --- a/src/admin/single-form-settings/components/form-confirm-setting/index.js +++ b/src/admin/single-form-settings/components/form-confirm-setting/index.js @@ -1,59 +1,83 @@ import { useDispatch, useSelect } from '@wordpress/data'; import { store as editorStore } from '@wordpress/editor'; -import { useEffect, useState } from '@wordpress/element'; +import { useEffect, useMemo, useRef, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import ComponentKeyValueUI from '@Components/misc/ComponentKeyValueUI'; -import { useDebouncedCallback } from 'use-debounce'; import { applyFilters } from '@wordpress/hooks'; import DefaultConfirmationTypes from './DefaultConfirmationTypes'; import { Label } from '@bsf/force-ui'; import RadioGroup from '@Admin/components/RadioGroup'; import TabContentWrapper from '@Components/tab-content-wrapper'; import { getWordPressPages } from '@Utils/Helpers'; +import { srfmEditFormMeta } from '@Components/tab-content-wrapper/edit-form-meta'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; -const FormConfirmSetting = ( { toast, setHasValidationErrors } ) => { +const FormConfirmSetting = ( { setHasValidationErrors } ) => { const sureforms_keys = useSelect( ( select ) => select( editorStore ).getEditedPostAttribute( 'meta' ) ); - const { editPost } = useDispatch( editorStore ); + // `data` is the live editing state; `prevData` is the last-saved baseline. + // Both start from the post-meta value on mount so isDirty reads false + // until the user edits a field. `onSaveSuccess` re-baselines after a + // successful POST. const [ data, setData ] = useState( {} ); + const [ prevData, setPrevData ] = useState( {} ); const [ pageOptions, setPageOptions ] = useState( [] ); const [ errorMessage, setErrorMessage ] = useState( null ); - const [ showSuccess, setShowSuccess ] = useState( null ); + // Tab-owned in-flight save flag. TabContentWrapper toggles this via + // `onSavingChange` around the POST so the Save button locks during + // the network call. + const [ isSaving, setIsSaving ] = useState( false ); - const handleSaveChanges = () => { - const validationStatus = validateForm(); + const isDirty = useMemo( + () => JSON.stringify( data ) !== JSON.stringify( prevData ), + [ data, prevData ] + ); - setErrorMessage( validationStatus ); - if ( '' !== validationStatus ) { - setHasValidationErrors( true ); - toast.dismiss(); - return false; - } - updateMeta( '_srfm_form_confirmation', [ data ] ); - setShowSuccess( true ); - toast.dismiss(); - }; + // Push the local dirty signal into the store so the dialog's + // unsaved-changes guard (tab switch / X / Esc / backdrop / beforeunload) + // can read it without holding a reference to this component. + const { setSingleFormSettingUnsave } = useDispatch( SRFM_STORE_NAME ); + useEffect( () => { + setSingleFormSettingUnsave( isDirty ); + }, [ isDirty, setSingleFormSettingUnsave ] ); - const debounced = useDebouncedCallback( handleSaveChanges, 500 ); + // Unmount cleanup — covers every exit path (dialog close, tab switch + // via Discard & continue). Without this, the central flag would stay + // `true` and mis-fire the guard on the next tab click. + useEffect( () => { + return () => { + setSingleFormSettingUnsave( false ); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [] ); + // Listen for the discard signal dispatched by the dialog's "Discard & + // continue" branch. Each bump of `discardCounter` is one discard event; + // the ref skips the initial render so the tab doesn't reset itself on + // mount. + const discardCounter = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectSingleFormSettingDiscardCounter?.() || + 0, + [] + ); + const lastDiscardCounter = useRef( discardCounter ); useEffect( () => { - if ( null !== errorMessage ) { - setErrorMessage( validateForm() ); + if ( discardCounter === lastDiscardCounter.current ) { + return; } + lastDiscardCounter.current = discardCounter; + setData( prevData ); + }, [ discardCounter ] ); + // Clear any stale form-level validation error flag when the user edits. + // Validation runs at Save click (`validateBeforeSave`), not on every + // keystroke. + useEffect( () => { setHasValidationErrors( false ); - debounced( data ); }, [ data ] ); - useEffect( () => { - if ( true === showSuccess ) { - setTimeout( () => { - setShowSuccess( false ); - toast.dismiss(); - }, 500 ); - } - }, [ showSuccess ] ); const handleQueryParamsChange = ( queryParams ) => { setData( { ...data, query_params: queryParams } ); @@ -91,7 +115,10 @@ const FormConfirmSetting = ( { toast, setHasValidationErrors } ) => { } if ( 'custom url' === data?.confirmation_type ) { if ( ! data?.custom_url ) { - validation = __( 'This field is required.', 'sureforms' ); + validation = __( + 'Please provide a custom URL.', + 'sureforms' + ); } else { try { const newURL = new URL( data?.custom_url ); @@ -122,24 +149,35 @@ const FormConfirmSetting = ( { toast, setHasValidationErrors } ) => { return validation; }; - function updateMeta( option, value ) { - const option_array = {}; - option_array[ option ] = value; - editPost( { - meta: option_array, - } ); - } + // Returns null on valid; an error string for TabContentWrapper to + // surface as a toast otherwise. Also stages the in-flight `data` into + // Redux `values` so `handleSave` reads the right payload, mirroring + // the EmailConfirmation pattern where `handleConfirmEmail` stages on + // validation success. + const validateBeforeSave = () => { + const error = validateForm(); + setErrorMessage( error ); + if ( error !== '' ) { + setHasValidationErrors( true ); + return error; + } + srfmEditFormMeta( '_srfm_form_confirmation', [ data ] ); + return null; + }; + + const onSaveSuccess = () => setPrevData( data ); useEffect( () => { - const formConfirmationData = sureforms_keys._srfm_form_confirmation; + const formConfirmationData = sureforms_keys?._srfm_form_confirmation; // Fetch the first page of options and include saved value for label hydration. getWordPressPages( setPageOptions, { selectedUrl: formConfirmationData?.[ 0 ]?.page_url || '', } ); - if ( formConfirmationData ) { + if ( formConfirmationData?.[ 0 ] ) { setData( formConfirmationData[ 0 ] ); + setPrevData( formConfirmationData[ 0 ] ); } }, [] ); @@ -231,6 +269,13 @@ const FormConfirmSetting = ( { toast, setHasValidationErrors } ) => { 'sureforms' ) } showTitleHelpText={ true } + tabId="form_confirmation" + showSaveButton={ true } + validate={ validateBeforeSave } + isDirty={ isDirty } + isSaving={ isSaving } + onSavingChange={ setIsSaving } + onSaveSuccess={ onSaveSuccess } > <div className="space-y-6"> <div className="space-y-2"> diff --git a/src/admin/single-form-settings/components/form-restrictions/FormRestriction.js b/src/admin/single-form-settings/components/form-restrictions/FormRestriction.js index e407ca48e..bd498585c 100644 --- a/src/admin/single-form-settings/components/form-restrictions/FormRestriction.js +++ b/src/admin/single-form-settings/components/form-restrictions/FormRestriction.js @@ -1,12 +1,17 @@ import { __ } from '@wordpress/i18n'; import { + useCallback, useContext, createInterpolateElement, isValidElement, useMemo, useEffect, + useRef, + useState, } from '@wordpress/element'; -import { useSelect } from '@wordpress/data'; +import { select, useDispatch, useSelect } from '@wordpress/data'; +import { store as editorStore } from '@wordpress/editor'; +import { decodeJson } from '@Utils/Helpers'; import { FormRestrictionContext } from './context'; import { Container, @@ -16,27 +21,115 @@ import { Label, TextArea, Tooltip, - toast, } from '@bsf/force-ui'; import { Info } from 'lucide-react'; import TabContentWrapper from '@Components/tab-content-wrapper'; import DatePickerModal from '@Components/force-ui-components/DatePickerModal'; import TimePicker from '@Components/force-ui-components/TimePicker'; import { applyFilters } from '@wordpress/hooks'; +import { srfmEditFormMeta } from '@Components/tab-content-wrapper/edit-form-meta'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; +import { notify } from '@Utils/notify'; const FormRestriction = ( { setHasValidationErrors } ) => { - const { updateMeta, preserveMetaData } = useContext( - FormRestrictionContext + const { updateMeta, preserveMetaData, rawMeta, editMeta, setPreserveMetaData } = + useContext( FormRestrictionContext ); + + // Tab-owned in-flight save flag. TabContentWrapper toggles this via + // `onSavingChange` around the POST so the Save button locks during + // the network call. + const [ isSaving, setIsSaving ] = useState( false ); + + // `preserveMetaData` (from context) is the live editing state; + // `rawMeta` is the last-saved post-meta baseline. isDirty compares + // the two; after a successful Save the response.meta updates + // `rawMeta` and `onSaveSuccess` re-syncs `preserveMetaData` to it. + const localIsDirty = useMemo( + () => + JSON.stringify( preserveMetaData ) !== JSON.stringify( rawMeta ), + [ preserveMetaData, rawMeta ] ); + // Per-slot dirty contributions from filter-driven extension panels + // (e.g. pro modules rendered via `srfm_form_restriction_additional_settings`). + // The setter below is passed through the filter's second arg so panels + // can push their own dirty boolean up without needing cross-bundle + // React Context or extra Redux state. Slots auto-clean on unmount via + // the panel's effect cleanup (`registerExtensionDirty(slot, false)`). + const [ extensionDirtyMap, setExtensionDirtyMap ] = useState( {} ); + const registerExtensionDirty = useCallback( ( slot, value ) => { + if ( ! slot ) { + return; + } + setExtensionDirtyMap( ( prev ) => { + if ( prev[ slot ] === value ) { + return prev; + } + return { ...prev, [ slot ]: value }; + } ); + }, [] ); + const extensionsIsDirty = useMemo( + () => Object.values( extensionDirtyMap ).some( Boolean ), + [ extensionDirtyMap ] + ); + + // Sibling-panel dirty contributions via the Redux per-slot map. + // Compliance Settings is a Dialog.js-level sibling (not a child of + // this component) and pushes its own slot via + // `setTabDirtyContribution`. We OR-fold the aggregate into the + // Save button's `isDirty` so the same button responds to those + // edits without restructuring the dialog tree. + const tabSiblingsIsDirty = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectTabDirtyContributionsAggregate?.() || + false, + [] + ); + + const isDirty = localIsDirty || extensionsIsDirty || tabSiblingsIsDirty; + + // Push the local dirty signal into the store so the dialog's + // unsaved-changes guard can read it. + const { setSingleFormSettingUnsave } = useDispatch( SRFM_STORE_NAME ); + useEffect( () => { + setSingleFormSettingUnsave( isDirty ); + }, [ isDirty, setSingleFormSettingUnsave ] ); + + // Unmount cleanup — covers every exit path so the central flag + // doesn't leak past a discard / tab switch. + useEffect( () => { + return () => { + setSingleFormSettingUnsave( false ); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [] ); + + // Listen for the discard signal dispatched by the dialog's "Discard + // & continue" branch. Each bump is one discard event; the ref skips + // the initial render so the tab doesn't reset on mount. + const discardCounter = useSelect( + ( s ) => + s( SRFM_STORE_NAME )?.selectSingleFormSettingDiscardCounter?.() || + 0, + [] + ); + const lastDiscardCounter = useRef( discardCounter ); + useEffect( () => { + if ( discardCounter === lastDiscardCounter.current ) { + return; + } + lastDiscardCounter.current = discardCounter; + editMeta(); + }, [ discardCounter ] ); + // Read compliance meta directly — it lives in a separate post-meta key // (`_srfm_compliance`) outside FormRestrictionContext. When GDPR + Never // Store are both on, `Form_Submit` returns before inserting an entry // (inc/form-submit.php:538), so the entries-table-driven cap (and any // recurring extension that hooks `srfm_form_restriction_entries_count`) // has no row to count and silently does not enforce. - const isNeverStoreEntriesEnabled = useSelect( ( select ) => { - const meta = select( 'core/editor' ).getEditedPostAttribute( 'meta' ); + const isNeverStoreEntriesEnabled = useSelect( ( wpSelect ) => { + const meta = wpSelect( 'core/editor' ).getEditedPostAttribute( 'meta' ); const compliance = Array.isArray( meta?._srfm_compliance ) ? meta._srfm_compliance[ 0 ] : null; @@ -118,27 +211,65 @@ const FormRestriction = ( { setHasValidationErrors } ) => { preserveMetaData?.meridiem, ] ); - // Update parent component's validation state and show toast + // Mirror the date/time validation error into the parent's flag so + // any downstream consumers know there's an issue. Toast is now + // surfaced from `validateBeforeSave` at Save click (not on every + // keystroke) — matches the EmailConfirmation pattern. useEffect( () => { - const hasError = !! dateTimeValidationError; - - // Update parent component's validation state if ( setHasValidationErrors ) { - setHasValidationErrors( hasError ); - } - - // Show toast notification when validation error occurs - if ( hasError ) { - toast.error( dateTimeValidationError, { - duration: 4000, - } ); + setHasValidationErrors( !! dateTimeValidationError ); } }, [ dateTimeValidationError, setHasValidationErrors ] ); - // Apply filter and sanitize for security + // Returns null on valid; an error string for TabContentWrapper to + // surface as a toast otherwise. Stages the in-flight preserveMetaData + // into Redux `values` so `handleSave` reads the right payload. + const validateBeforeSave = () => { + if ( dateTimeValidationError ) { + return dateTimeValidationError; + } + srfmEditFormMeta( + '_srfm_form_restriction', + JSON.stringify( preserveMetaData || {} ) + ); + return null; + }; + + // After a successful Save the response.meta updates the editor + // store → re-sync the preserve buffer to the just-saved value so + // isDirty drops to false. + // + // IMPORTANT: read the latest meta imperatively from + // `select(editorStore)` rather than relying on the closure's + // `rawMeta`. `handleSave` dispatches `editPost(response.meta)` and + // `commitSavedMeta(...)` synchronously right before invoking + // `onSaveSuccess`, but those dispatches haven't yet propagated to a + // re-render — so the closure's `rawMeta` still reflects the + // pre-save value. Calling `editMeta()` (which closes over the + // stale `rawMeta`) would reset `preserveMetaData` to the pre-save + // baseline, making the just-saved field appear to revert in the + // UI. + const onSaveSuccess = () => { + const latestMeta = + select( editorStore ).getEditedPostAttribute( 'meta' ) || {}; + setPreserveMetaData( + decodeJson( latestMeta?._srfm_form_restriction ) || {} + ); + notify.success( __( 'Form settings saved.', 'sureforms' ) ); + }; + + // Apply filter and sanitize for security. + // The 2nd arg is a context bag forwarded to every callback so + // extension panels (e.g. pro IP restriction) can push their own + // `isDirty` boolean via `registerExtensionDirty(slot, isDirty)`. + // This avoids cross-bundle React Context — the setter is a stable + // `useCallback` reference and crosses the bundle boundary as a + // plain function prop, which works because the @wordpress/hooks + // registry is shared between bundles via `wp.hooks`. let additionalSettings = applyFilters( 'srfm_form_restriction_additional_settings', - [] + [], + { registerExtensionDirty } ); // Lightweight security validation for admin context @@ -165,6 +296,22 @@ const FormRestriction = ( { setHasValidationErrors } ) => { 'Set limits on how many times a form can be submitted and manage compliance options, including GDPR and data retention.', 'sureforms' ) } + tabId="advanced-settings" + showSaveButton={ true } + validate={ validateBeforeSave } + isDirty={ isDirty } + isSaving={ isSaving } + onSavingChange={ setIsSaving } + onSaveSuccess={ onSaveSuccess } + // Advanced Settings hosts the pro Password Protection + // sub-panel, which writes the form's password to + // `post.password` (WP's native password field) rather + // than to our meta blob. Flush the entity record after + // the meta POST so password changes actually persist + // server-side — without this, the user types a password, + // clicks Save, sees the success toast, but reload shows + // the password unchanged because only meta was POSTed. + commitEntityOnSave={ true } > <div id="srfm-form-restriction-panel" /> <Title diff --git a/src/admin/single-form-settings/components/form-restrictions/context.js b/src/admin/single-form-settings/components/form-restrictions/context.js index bf3d286e3..1b5399fd2 100644 --- a/src/admin/single-form-settings/components/form-restrictions/context.js +++ b/src/admin/single-form-settings/components/form-restrictions/context.js @@ -4,7 +4,7 @@ */ import { useState, createContext } from '@wordpress/element'; -import { useSelect, useDispatch } from '@wordpress/data'; +import { useSelect } from '@wordpress/data'; import { decodeJson, deepCopy } from '@Utils/Helpers'; // React context for form restriction meta state @@ -30,8 +30,7 @@ export const useFormRestrictionMeta = () => { * @return {JSX.Element} Provider wrapper with context value */ export const FormRestrictionProvider = ( { children } ) => { - const rawMeta = useFormRestrictionMeta(); // Raw meta from post - const { editPost } = useDispatch( 'core/editor' ); // WP editor dispatcher + const rawMeta = useFormRestrictionMeta(); // Raw meta from post (= saved baseline) const [ preserveMetaData, setPreserveMetaData ] = useState( null ); // Temporary buffer for editing const [ newMeta, setNewMeta ] = useState( false ); // Flag to indicate we're creating a new restriction @@ -63,27 +62,16 @@ export const FormRestrictionProvider = ( { children } ) => { }; /** - * Updates a key in the actual form meta (post-level). - * Skips update if we're in "new template" creation mode. + * Stages a meta key into the preserve buffer only — the explicit Save + * in `FormRestriction` flushes the buffer through Redux + REST. Kept + * as a separate name from `updatePreserveMeta` so existing consumers + * keep working; both functions now have identical semantics. * * @param {string} key - Field name to update * @param {*} value - New value to assign */ const updateMeta = ( key, value ) => { - const shouldUpdate = updatePreserveMeta( key, value ); - - if ( ! shouldUpdate || newMeta ) { - return; - } - - const updated = deepCopy( rawMeta ); - if ( updated ) { - updated[ key ] = value; - - editPost( { - meta: { _srfm_form_restriction: JSON.stringify( updated ) }, - } ); - } + updatePreserveMeta( key, value ); }; /** diff --git a/src/admin/single-form-settings/components/useContainerDynamicClass.js b/src/admin/single-form-settings/components/useContainerDynamicClass.js index 396fc7ed7..87bcb7610 100644 --- a/src/admin/single-form-settings/components/useContainerDynamicClass.js +++ b/src/admin/single-form-settings/components/useContainerDynamicClass.js @@ -1,14 +1,22 @@ import { useEffect } from '@wordpress/element'; import { validateClassName } from '../utils'; const useContainerDynamicClass = ( props ) => { - const { sureformsKeys, documentBody, shouldIframe, editorMode } = props; + const { sureformsKeys, documentBody, editorMode } = props; const getStyleWrapper = () => { - if ( shouldIframe ) { + // Detect from the DOM rather than the `shouldIframe` prediction: + // when the iframe body actually rendered, `documentBody` IS the + // `.block-editor-iframe__body` and is already the style wrapper. + // Falling back to `.editor-styles-wrapper` covers the non-iframe + // case where `documentBody` is the top-level `<body>`. + if ( documentBody?.classList?.contains( 'block-editor-iframe__body' ) ) { return documentBody; } - return documentBody?.querySelector( '.editor-styles-wrapper' ); + return ( + documentBody?.querySelector( '.editor-styles-wrapper' ) ?? + documentBody + ); }; const addRootClass = () => { @@ -64,7 +72,6 @@ const useContainerDynamicClass = ( props ) => { sureformsKeys?._srfm_additional_classes, editorMode, documentBody, - shouldIframe, ] ); }; diff --git a/src/admin/single-form-settings/tabs/StyleSettings.js b/src/admin/single-form-settings/tabs/StyleSettings.js index 9af385fee..c3ecc1db9 100644 --- a/src/admin/single-form-settings/tabs/StyleSettings.js +++ b/src/admin/single-form-settings/tabs/StyleSettings.js @@ -34,7 +34,6 @@ function StyleSettings( props ) { iframeBody, editorMode, rootHtmlTag, - shouldIframe, } = props; let sureformsKeys = useSelect( @@ -46,7 +45,17 @@ function StyleSettings( props ) { [ editorStore ] ); const formStyling = sureformsKeys?._srfm_forms_styling || {}; - const rootRef = shouldIframe ? iframeBody : iframeBody?.querySelector( '.editor-styles-wrapper' ); + // Derive the style root from the actual DOM. `useShouldIframe()` is a + // best-effort prediction of what WP will do; `iframeBody` is the source + // of truth for what actually rendered. When the iframe body itself is + // passed in, target it directly; otherwise fall back to the + // `.editor-styles-wrapper` inside the top document. + const isIframedBody = iframeBody?.classList?.contains( + 'block-editor-iframe__body' + ); + const rootRef = isIframedBody + ? iframeBody + : iframeBody?.querySelector( '.editor-styles-wrapper' ) ?? iframeBody; const deviceType = useDeviceType(); const [ submitBtn, setSubmitBtn ] = useState( null ); diff --git a/src/admin/tw-base.scss b/src/admin/tw-base.scss index 225cf68d5..9dfa0bbf3 100644 --- a/src/admin/tw-base.scss +++ b/src/admin/tw-base.scss @@ -70,7 +70,7 @@ } } // Hide WP notices in entries screen -#wpbody:has( #srfm-entries-root, #srfm-survey-reports-root, #srfm-survey-empty-state-root, #srfm-quiz-entries-root, #srfm-payments-react-container, #srfm-learn-root ) { +#wpbody:has( #srfm-entries-root, #srfm-survey-reports-root, #srfm-survey-empty-state-root, #srfm-quiz-entries-root, #srfm-payments-react-container, #srfm-learn-root, #srfm-partial-entries-empty-state-root ) { #wpbody-content > .notice { display: none; } diff --git a/src/blocks/dropdown/edit.js b/src/blocks/dropdown/edit.js index 9de169548..5c7cb7608 100644 --- a/src/blocks/dropdown/edit.js +++ b/src/blocks/dropdown/edit.js @@ -525,24 +525,30 @@ const Edit = ( props ) => { label={ __( 'Allow Multiple', 'sureforms' ) } checked={ multiSelect } onChange={ ( checked ) => - setAttributes( { - multiSelect: checked, - ...( checked && { - dynamicDefaultValue: '', - } ), - } ) + setAttributes( { multiSelect: checked } ) } /> ), }, { id: 'dynamicDefaultValue', - component: ! multiSelect ? ( + component: ( <SRFMTextControl label={ __( 'Dynamic Default Value', 'sureforms' ) } className="srfm-with-dropdown" value={ dynamicDefaultValue } withSmartTagDropdown={ true } + help={ + multiSelect + ? __( + 'Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose label matches a value will be preselected. You can also chain multiple smart tags separated by pipes.', + 'sureforms' + ) + : __( + 'Use a smart tag like {get_input:country}. The first option whose label matches the resolved value will be preselected.', + 'sureforms' + ) + } data={ { value: dynamicDefaultValue, label: 'dynamicDefaultValue', @@ -551,7 +557,7 @@ const Edit = ( props ) => { setAttributes( { dynamicDefaultValue: value } ) } /> - ) : null, + ), }, { id: 'minMaxComponent', diff --git a/src/blocks/multi-choice/edit.js b/src/blocks/multi-choice/edit.js index 6ca3740f4..c321751ac 100644 --- a/src/blocks/multi-choice/edit.js +++ b/src/blocks/multi-choice/edit.js @@ -620,24 +620,30 @@ const Edit = ( props ) => { label={ __( 'Single Choice Only', 'sureforms' ) } checked={ singleSelection } onChange={ ( checked ) => - setAttributes( { - singleSelection: checked, - ...( ! checked && { - dynamicDefaultValue: '', - } ), - } ) + setAttributes( { singleSelection: checked } ) } /> ), }, { id: 'dynamicDefaultValue', - component: singleSelection ? ( + component: ( <SRFMTextControl label={ __( 'Dynamic Default Value', 'sureforms' ) } className="srfm-with-dropdown" value={ dynamicDefaultValue } withSmartTagDropdown={ true } + help={ + singleSelection + ? __( + 'Use a smart tag like {get_input:country}. The first option whose title matches the resolved value will be preselected.', + 'sureforms' + ) + : __( + 'Use a smart tag like {get_input:colors} and pass pipe separated values in the URL (for example ?colors=Red|Blue). Every option whose title matches a value will be checked. You can also chain multiple smart tags separated by pipes.', + 'sureforms' + ) + } data={ { value: dynamicDefaultValue, label: 'dynamicDefaultValue', @@ -646,7 +652,7 @@ const Edit = ( props ) => { setAttributes( { dynamicDefaultValue: value } ) } /> - ) : null, + ), }, { id: 'min-max', diff --git a/src/components/misc/WarningBox.js b/src/components/misc/WarningBox.js new file mode 100644 index 000000000..5009c42b0 --- /dev/null +++ b/src/components/misc/WarningBox.js @@ -0,0 +1,21 @@ +import { Container } from '@bsf/force-ui'; +import svg from '@Svg/svgs.json'; +import parse from 'html-react-parser'; + +/** + * Warning box component for displaying warning messages. + * + * @param {Object} props - Component props. + * @param {string} props.message - The warning message to display. + * @return {JSX.Element} The warning box component. + */ +const WarningBox = ( { message } ) => { + return ( + <Container className="w-full p-3 gap-2 border border-solid border-alert-border-warning bg-alert-background-warning rounded-lg"> + <span className="size-5">{ parse( svg?.warning ) }</span> + <span className="text-sm font-normal">{ message }</span> + </Container> + ); +}; + +export default WarningBox; diff --git a/src/components/tab-content-wrapper/edit-form-meta.js b/src/components/tab-content-wrapper/edit-form-meta.js new file mode 100644 index 000000000..2f0997ef6 --- /dev/null +++ b/src/components/tab-content-wrapper/edit-form-meta.js @@ -0,0 +1,115 @@ +import { dispatch, select } from '@wordpress/data'; +import { store as editorStore } from '@wordpress/editor'; +import { store as coreStore } from '@wordpress/core-data'; +import apiFetch from '@wordpress/api-fetch'; +import { __ } from '@wordpress/i18n'; + +import { STORE_NAME as SRFM_STORE_NAME } from '../../store/constants'; +import { notify } from '@Utils/notify'; +// Side-effect import: ensures the `sureforms` store is registered in the +// shared `wp.data` registry by the time any consumer of this helper runs, +// even when imported from a separate webpack entry (e.g. pro bundles). +import '../../store/store'; + +/** + * Single write surface for form-settings meta. Pushes the value into our + * Redux `values` slice (the source of truth for the dirty signal) and + * mirrors it onto WP's `core/editor` so block sidebar panels still see + * the change. + * + * @param {string} metaKey Post meta key, e.g. `_srfm_email_notification`. + * @param {*} value New value (string, array, or object — caller decides shape). + */ +export const srfmEditFormMeta = ( metaKey, value ) => { + dispatch( SRFM_STORE_NAME )?.setFormSettingValue?.( metaKey, value ); + dispatch( editorStore )?.editPost?.( { + meta: { [ metaKey ]: value }, + } ); +}; + +/** + * Immediate-commit variant of `srfmEditFormMeta`. Used for list-mutation + * actions (status toggle, delete) that should not be seen as "dirty" — the + * caller doesn't want the user to have to click a Save button afterwards. + * + * Flow: optimistic local commit (both baseline + values) → POST to + * `/sureforms/v1/form-settings` → sync `core/editor` and Redux baseline + * with the server's sanitized response so the dialog's + * `selectSingleFormSettingUnsave` guard stays false through the round-trip. + * On failure, the local update is reverted and an error toast is shown. + * + * @param {string} metaKey Post meta key, e.g. `_srfm_email_notification`. + * @param {*} value New value to persist. + * @return {Promise<void>} + */ +export const srfmSaveFormMeta = async ( metaKey, value ) => { + const srfmStore = select( SRFM_STORE_NAME ); + // Snapshot for rollback on POST failure. We need *both* the pre-save + // baseline and the pre-save value because they may differ — the user + // could have pending edits when toggle/delete is clicked. + const previousValue = srfmStore?.selectFormSettingValue?.( metaKey ); + const previousBaseline = + srfmStore?.selectFormSettingBaselineValue?.( metaKey ); + + // Optimistic: commit baseline AND values atomically so the staged + // state matches the about-to-be-saved payload immediately. Keeps the + // dirty signal from flipping mid-flight. + dispatch( SRFM_STORE_NAME )?.commitSavedMeta?.( { [ metaKey ]: value } ); + dispatch( editorStore )?.editPost?.( { + meta: { [ metaKey ]: value }, + } ); + + const editorSelect = select( editorStore ); + const postId = editorSelect.getCurrentPostId(); + if ( ! postId ) { + // No persistent post yet — baseline already synced above. + return; + } + + const postType = editorSelect.getCurrentPostType(); + const savedMeta = editorSelect.getCurrentPostAttribute( 'meta' ) || {}; + + try { + const response = await apiFetch( { + path: '/sureforms/v1/form-settings', + method: 'POST', + data: { post_id: postId, meta_data: { [ metaKey ]: value } }, + } ); + + const mergedMeta = { ...savedMeta, ...( response?.meta || {} ) }; + dispatch( coreStore ).receiveEntityRecords( + 'postType', + postType, + [ { id: postId, meta: mergedMeta } ], + undefined, + false + ); + + if ( response?.meta && Object.keys( response.meta ).length > 0 ) { + // Sync edited buffer with the sanitized response so + // Gutenberg's `isEditedPostDirty` reads clean (the buffer + // still holds the user's pre-sanitize value pushed during + // typing via `srfmEditFormMeta`). Idempotent against the + // entity record we just synced. + dispatch( editorStore ).editPost( { meta: response.meta } ); + dispatch( SRFM_STORE_NAME ).commitSavedMeta( response.meta ); + } + } catch ( error ) { + // Atomic revert in one dispatch — writes baseline AND value for + // this key in a single new state. Subscribers comparing the two + // can't observe an intermediate equal state between hops. + dispatch( SRFM_STORE_NAME ).revertOnSaveFailure( { + [ metaKey ]: { + baseline: previousBaseline, + value: previousValue, + }, + } ); + // Only surface `error.message` when it came from the REST handler + // (which sets `error.code`); raw network failures throw a + // `TypeError` with a translator-unfriendly message. + const friendly = error?.code + ? error.message + : __( 'Failed to save. Please try again.', 'sureforms' ); + notify.error( friendly ); + } +}; diff --git a/src/components/tab-content-wrapper/tab-content-wrapper.js b/src/components/tab-content-wrapper/tab-content-wrapper.js index 1403c2e5c..3d7ef9b38 100644 --- a/src/components/tab-content-wrapper/tab-content-wrapper.js +++ b/src/components/tab-content-wrapper/tab-content-wrapper.js @@ -1,7 +1,15 @@ import { Button, Container, Title, Label } from '@bsf/force-ui'; import { cn } from '@Utils/Helpers'; -import { ArrowLeftIcon } from 'lucide-react'; +import { ArrowLeftIcon, Save, LoaderCircle } from 'lucide-react'; import { __ } from '@wordpress/i18n'; +import { useDispatch, select, dispatch } from '@wordpress/data'; +import { store as editorStore } from '@wordpress/editor'; +import { store as coreStore } from '@wordpress/core-data'; +import apiFetch from '@wordpress/api-fetch'; + +import { STORE_NAME as SRFM_STORE_NAME } from '../../store/constants'; +import { getTabMetaKeys } from './tab-meta-key-registry'; +import { notify } from '@Utils/notify'; const TabContentWrapper = ( { children, @@ -14,7 +22,7 @@ const TabContentWrapper = ( { actionBtnVariant = 'primary', actionLeftContent, actionBtnDisabled = false, - hideTitle = false, // Hide the title from the content area. + hideTitle = false, shouldShowAutoSaveText = false, showTitleHelpText = false, titleHelpText = '', @@ -23,7 +31,211 @@ const TabContentWrapper = ( { 'sureforms' ), shouldAddHelpTextPadding = true, + // Header Save button — opt-in. Tabs that own the explicit Save flow + // pass `showSaveButton={true}` alongside `tabId` / `validate` / + // `isDirty` / `isSaving` / `onSavingChange` / `onSaveSuccess`. Default + // `false` keeps un-migrated tabs from rendering a perma-disabled + // button while we roll out the new flow tab by tab. + showSaveButton = false, + // Validate before POST. Return `null` to proceed, or an error string + // to abort + surface as a toast. + validate, + // Tab-owned dirty flag. Drives the Save button's `disabled` state. + isDirty: customIsDirty, + // Tab-owned in-flight save flag. The wrapper flips this via + // `onSavingChange(true|false)` around the POST so the Save button + // locks during the network call (prevents double-fires). + isSaving = false, + onSavingChange, + // Fires after a successful POST so the tab can re-baseline its local + // state (e.g. `setPrevData(formData)`). + onSaveSuccess, + // Resolves the meta-keys owned by this tab via the registry. + tabId, + // Opt-in: after a successful meta POST, also commit any pending edits + // to the post entity itself (title / content / `post.password` / + // other top-level attributes) via core-data's + // `saveEditedEntityRecord`. Needed by tabs that surface a core + // post attribute alongside meta — today that's Advanced Settings + // (the Password Protection sub-panel writes `post.password` + // directly, since WP's native password field is the source of truth). + // Default `false` because most tabs ONLY edit meta and shouldn't + // silently flush unrelated Gutenberg edits. + commitEntityOnSave = false, } ) => { + const metaKeys = tabId ? getTabMetaKeys( tabId ) : []; + + const { + commitSavedMeta, + setSingleFormSettingSaving, + revertOnSaveFailure, + } = useDispatch( SRFM_STORE_NAME ); + + const handleSave = async () => { + // Contract for tabs / extensions plugging into this Save: + // + // 1. Every staged change MUST go through `srfmEditFormMeta`. We + // build the POST payload below from Redux `values`; meta + // written via `editPost({meta:...})` alone is invisible here + // and would be silently dropped from the save. + // 2. `validate()` may dispatch additional `srfmEditFormMeta` + // calls right before returning `null` (the "commit on + // validate" pattern used by FormCustomCss + SpamProtection). + // That's safe today because `setFormSettingValue` is a plain + // action — the next-line `selectFormSettingValue` read sees + // the update synchronously. Don't switch the action to a + // `controls`/generator yield without revisiting this read. + if ( typeof validate === 'function' ) { + const validationError = validate(); + if ( validationError ) { + notify.error( validationError ); + return; + } + } + + const editorSelect = select( editorStore ); + const postId = editorSelect.getCurrentPostId(); + const savedMeta = editorSelect.getCurrentPostAttribute( 'meta' ) || {}; + const srfmStore = select( SRFM_STORE_NAME ); + + // Read the save payload from our Redux `values` slice — never from + // `core/editor` — so the bytes we POST match exactly what the user + // changed, with no autosave or block-sidebar drift mixed in. + const metaData = metaKeys.reduce( ( acc, key ) => { + const value = srfmStore.selectFormSettingValue( key ); + if ( value !== undefined ) { + acc[ key ] = value; + } + return acc; + }, {} ); + + if ( ! postId || Object.keys( metaData ).length === 0 ) { + if ( typeof onSaveSuccess === 'function' ) { + onSaveSuccess(); + } + notify.success( __( 'Form settings saved.', 'sureforms' ) ); + return; + } + + const postType = editorSelect.getCurrentPostType(); + + // Snapshot per-key { baseline, value } so we can revert on POST + // failure. baseline + value may differ (the user could have + // pending edits when Save is clicked). + const previousState = metaKeys.reduce( ( acc, key ) => { + acc[ key ] = { + baseline: srfmStore.selectFormSettingBaselineValue( key ), + value: srfmStore.selectFormSettingValue( key ), + }; + return acc; + }, {} ); + + // Optimistic baseline commit: align baseline with the about-to-be- + // saved payload BEFORE the await yields. Keeps the dialog's + // `singleFormSettingUnsave` signal from briefly flipping true + // while the POST is in flight. + commitSavedMeta( metaData ); + + if ( typeof onSavingChange === 'function' ) { + onSavingChange( true ); + } + // Mirror in-flight save to Redux so the dialog's tab-switch / + // close guards can block during the await. Without this, a + // "Discard & continue" click mid-POST would revert local React + // state for a save the server has already accepted. + setSingleFormSettingSaving?.( true ); + try { + const response = await apiFetch( { + path: '/sureforms/v1/form-settings', + method: 'POST', + data: { post_id: postId, meta_data: metaData }, + } ); + + const mergedMeta = { ...savedMeta, ...( response?.meta || {} ) }; + dispatch( coreStore ).receiveEntityRecords( + 'postType', + postType, + [ { id: postId, meta: mergedMeta } ], + undefined, + false + ); + + if ( response?.meta && Object.keys( response.meta ).length > 0 ) { + // Push the sanitized response into the editor's edited + // buffer so it matches the entity record. Without this, + // the buffer would still hold the user's pre-sanitize + // typed value (pushed by `srfmEditFormMeta` during + // typing) and Gutenberg's `isEditedPostDirty` would + // stay true — leaving the core "Update" button active + // even though our own save round-trip is complete. + // Idempotent: response.meta matches the value we just + // receiveEntityRecords-synced, so Gutenberg's dirty + // detection now reads clean. + dispatch( editorStore ).editPost( { meta: response.meta } ); + commitSavedMeta( response.meta ); + } + + // Opt-in entity flush. When the tab handles a top-level post + // attribute alongside meta (e.g. Advanced Settings → + // Password Protection writes `post.password` directly), our + // meta POST above doesn't touch the entity record. Without + // this flush, the Save toast appears successful but + // `post.password` stays in the editor's edited buffer + // unsaved server-side. `saveEditedEntityRecord` POSTs a + // diff payload to core's `/wp/v2/...` endpoint so only the + // edited attributes are sent; meta we just synced is + // equal-to-current and won't be re-sent. + if ( commitEntityOnSave ) { + try { + await dispatch( coreStore ).saveEditedEntityRecord( + 'postType', + postType, + postId + ); + } catch ( err ) { + // Don't fail the whole Save on a partial entity + // flush failure — the meta is already persisted. + // Surface a softer warning so the user knows the + // entity-level changes didn't land. + notify.error( + __( + 'Settings saved, but post attributes (password / title / content) failed to update. Retry to persist them.', + 'sureforms' + ) + ); + } + } + + if ( typeof onSaveSuccess === 'function' ) { + onSaveSuccess(); + } + + notify.success( + response?.message || + __( 'Form settings saved.', 'sureforms' ) + ); + } catch ( error ) { + // Atomic revert: one dispatch writes baseline AND value for + // every affected key in a single new state, so subscribers + // comparing `value` vs `baseline` can't observe an + // intermediate equal state between hops. + revertOnSaveFailure?.( previousState ); + // Only surface `error.message` when it came from the REST + // handler (which sets `error.code`) — a raw network failure + // throws a `TypeError` with a translator-unfriendly message + // like "Failed to fetch" that's worse than the static copy. + const friendly = error?.code + ? error.message + : __( 'Failed to save form settings.', 'sureforms' ); + notify.error( friendly ); + } finally { + if ( typeof onSavingChange === 'function' ) { + onSavingChange( false ); + } + setSingleFormSettingSaving?.( false ); + } + }; + const handleBack = () => { if ( typeof onClickBack !== 'function' ) { return; @@ -41,7 +253,6 @@ const TabContentWrapper = ( { }; return ( - // Add the spacing only if title is not hidden. <div className={ cn( 'pb-8', ! hideTitle && 'space-y-7' ) }> <Container align="center" justify="between"> <Container className="gap-0" direction="column"> @@ -77,15 +288,13 @@ const TabContentWrapper = ( { shouldAddHelpTextPadding ? 'pl-7' : '' ) } > - { shouldShowAutoSaveText && ( - <Label - size="sm" - variant="help" - className="text-text-on-button-disabled font-normal" - > - { autoSaveHelpText } - </Label> - ) } + <Label + size="sm" + variant="help" + className="text-text-on-button-disabled font-normal" + > + { autoSaveHelpText } + </Label> </Container.Item> ) } </Container> @@ -102,6 +311,26 @@ const TabContentWrapper = ( { { actionBtnText } </Button> ) } + { showSaveButton && ( + <Button + size="md" + variant="primary" + onClick={ handleSave } + disabled={ ! customIsDirty || isSaving } + iconPosition="left" + icon={ + isSaving ? ( + <LoaderCircle className="animate-spin size-4" /> + ) : ( + <Save /> + ) + } + > + { isSaving + ? __( 'Saving…', 'sureforms' ) + : __( 'Save', 'sureforms' ) } + </Button> + ) } </Container> </Container> <div diff --git a/src/components/tab-content-wrapper/tab-meta-key-registry.js b/src/components/tab-content-wrapper/tab-meta-key-registry.js new file mode 100644 index 000000000..9eccef1f2 --- /dev/null +++ b/src/components/tab-content-wrapper/tab-meta-key-registry.js @@ -0,0 +1,32 @@ +import { applyFilters } from '@wordpress/hooks'; + +/** + * Free-side map of dialog tab id → the post meta keys that tab owns. + * Pro tabs append entries via the `srfm.formSettings.tabMetaKeys` filter. + * + * Used by `TabContentWrapper.handleSave` to build the REST POST payload + * scoped to a single tab without dirtying meta the user didn't touch. + * + * @type {Object<string, string[]>} + */ +export const TAB_META_KEYS = { + email_notification: [ '_srfm_email_notification' ], + form_confirmation: [ '_srfm_form_confirmation' ], + spam_protection: [ + '_srfm_captcha_security_type', + '_srfm_form_recaptcha', + ], + form_custom_css: [ '_srfm_form_custom_css' ], + 'advanced-settings': [ '_srfm_form_restriction', '_srfm_compliance' ], +}; + +/** + * Resolve a tab's owned meta keys, applying the pro extension filter. + * + * @param {string} tabId Tab identifier (matches the `tabId` prop on TabContentWrapper). + * @return {string[]} Meta keys for this tab; empty array if unknown. + */ +export const getTabMetaKeys = ( tabId ) => { + const map = applyFilters( 'srfm.formSettings.tabMetaKeys', TAB_META_KEYS ); + return Array.isArray( map?.[ tabId ] ) ? map[ tabId ] : []; +}; diff --git a/src/store/actions.js b/src/store/actions.js index 12ac0ad8a..bed227d94 100644 --- a/src/store/actions.js +++ b/src/store/actions.js @@ -1,16 +1,14 @@ /** - * Action to update the global state with new data. + * Actions for the SureForms store. */ /** - * Update the global state with new data + * Update the global state with new data. * - * @param {Object} payload - The new global data to be set - * @param {Object} payload.srfmGlobalData - The global data for SureForms. - * @return {Object} Action object to update the global state + * @param {Object} payload - The new global data to be set. + * @return {Object} Action object to update the global state. */ export const updateSrfmGlobalData = ( payload ) => { - // add validation for payload if necessary if ( ! payload || typeof payload !== 'object' ) { throw new Error( 'Invalid payload: must be an object.' ); } @@ -20,3 +18,335 @@ export const updateSrfmGlobalData = ( payload ) => { payload, }; }; + +/** + * Stage a single form-settings meta key/value into `formSettings.values`. + * Source of truth for the dialog's per-tab Save payload — `srfmEditFormMeta` + * funnels every staged write here so the Save button reads the same bytes + * the user changed (not whatever `core/editor` happens to hold). + * + * @param {string} metaKey Post meta key, e.g. `_srfm_email_notification`. + * @param {*} value New value; caller decides shape. + * @return {Object} Action object. + */ +export const setFormSettingValue = ( metaKey, value ) => ( { + type: 'SRFM_FORM_SETTINGS_SET_VALUE', + metaKey, + value, +} ); + +/** + * Commit a server-sanitized response into `formSettings`. Writes both + * `baseline` and `values` so dirty diffs immediately fall to false on a + * successful save round-trip. + * + * @param {Object} values `{ [metaKey]: value }` from the REST response. + * @return {Object} Action object. + */ +export const commitSavedMeta = ( values ) => ( { + type: 'SRFM_FORM_SETTINGS_COMMIT_SAVED_META', + values: values || {}, +} ); + +/** + * Atomic POST-failure revert. Replaces the 2-step + * `commitSavedMeta(prevBaselines) → srfmEditFormMeta(prevValue)` dance + * with a single dispatch so subscribers comparing `value` vs `baseline` + * never see the brief window where the two were equal (which would + * flip a Redux-baseline-derived `isDirty` selector through false → + * true and trigger any subscribed effects). + * + * Each entry in `entries` carries the per-key pre-save baseline and + * value to restore — both written in one reducer hop. + * + * @param {Object} entries `{ [metaKey]: { baseline, value } }`. + * @return {Object} Action object. + */ +export const revertOnSaveFailure = ( entries ) => ( { + type: 'SRFM_FORM_SETTINGS_REVERT_ON_FAILURE', + entries: entries || {}, +} ); + +/** + * Reset `formSettings.values` back to `formSettings.baseline`. Dispatched + * by the dialog's "Discard & continue" branch to wipe in-flight edits + * before navigating to a different tab or closing the dialog. + * + * @return {Object} Action object. + */ +export const discardFormSettingValues = () => ( { + type: 'SRFM_FORM_SETTINGS_DISCARD_VALUES', +} ); + +/** + * Tear the entire `formSettings` slice down. Dispatched on dialog close + * so the next mount starts from a clean slate. + * + * @return {Object} Action object. + */ +export const discardFormSettingsState = () => ( { + type: 'SRFM_FORM_SETTINGS_DISCARD', +} ); + +/** + * Push the active sub-form's local dirty signal into Redux so the + * dialog's tab-switch / close guard can read it without holding a + * reference to the tab component. + * + * @param {boolean} unsaved Whether the active sub-form has unsaved edits. + * @return {Object} Action object. + */ +export const setSingleFormSettingUnsave = ( unsaved ) => ( { + type: 'SRFM_SINGLE_FORM_SETTING_SET_UNSAVE', + unsaved, +} ); + +/** + * Bump the discard counter. Tabs subscribe to + * `selectSingleFormSettingDiscardCounter` and reset their local React + * state when it changes. + * + * @return {Object} Action object. + */ +export const discardChanges = () => ( { + type: 'SRFM_SINGLE_FORM_SETTING_DISCARD', +} ); + +/** + * Push the active sub-form's in-flight Save signal into Redux. The + * dialog's tab-switch / close / Esc / backdrop guards read this and + * block the interception while a POST is mid-flight — without the + * lock, a "Discard & continue" click during the await would revert + * local React state even though the server has already accepted the + * save. + * + * `TabContentWrapper.handleSave` toggles this around its await; tabs + * with their own custom save flow (none today) would need to do the + * same if they want the guard to respect their in-flight window. + * + * @param {boolean} saving Whether a save POST is currently in flight. + * @return {Object} Action object. + */ +export const setSingleFormSettingSaving = ( saving ) => ( { + type: 'SRFM_SINGLE_FORM_SETTING_SET_SAVING', + saving: !! saving, +} ); + +/** + * Record a single panel's dirty contribution under its own slot in + * `formSettings.tabDirtyContributions`. Used by sibling panels that + * can't reach the tab owner's local React state directly (e.g. + * Compliance Settings is a `Dialog.js`-level sibling of the Form + * Restriction panel but should still drive the same Save button). + * + * The aggregate `selectTabDirtyContributionsAggregate` returns true + * if any slot is dirty — the tab owner ORs it into its own + * `isDirty` prop on TabContentWrapper. + * + * Slots auto-clean on consumer unmount via a `setTabDirtyContribution( + * slot, false )` in the effect cleanup, so a tab switch / discard + * doesn't leave a stale `true` in the map. + * + * @param {string} slot Stable slot id (e.g. `'compliance'`). + * @param {boolean} dirty Latest dirty boolean for this slot. + * @return {Object} Action object. + */ +export const setTabDirtyContribution = ( slot, dirty ) => ( { + type: 'SRFM_FORM_SETTINGS_SET_TAB_DIRTY_CONTRIBUTION', + slot, + dirty: !! dirty, +} ); + +/** + * No-op marker for the popup's "Stay" branch. Kept for symmetry with + * `discardChanges` so the dialog has a single hook to extend later. + * + * @return {Object} Action object. + */ +export const keepChanges = () => ( { + type: 'SRFM_SINGLE_FORM_SETTING_KEEP', +} ); + +/** + * Open the dialog-level back-arrow discard modal with caller-supplied + * copy. The modal is rendered by `Dialog.js`; the active tab subscribes + * to `selectBackDiscardConfirmCounter` to fire its own + * `handleBackNotification` / equivalent when the user confirms. + * + * @param {Object} payload Copy for the confirmation modal. + * @param {string} payload.title Modal title. + * @param {string} payload.description Modal body copy. + * @param {string} payload.confirmText Confirm button label (destructive). + * @param {string} payload.cancelText Cancel button label. + * @return {Object} Action object. + */ +export const requestBackDiscard = ( payload ) => ( { + type: 'SRFM_FORM_SETTINGS_REQUEST_BACK_DISCARD', + payload: payload || {}, +} ); + +/** + * Confirm branch of the back-arrow discard modal. Clears the pending + * payload AND bumps `backDiscardConfirmCounter` so the tab that opened + * the modal can react. + * + * @return {Object} Action object. + */ +export const confirmBackDiscard = () => ( { + type: 'SRFM_FORM_SETTINGS_CONFIRM_BACK_DISCARD', +} ); + +/** + * Cancel branch of the back-arrow discard modal. Clears the pending + * payload without bumping the counter. + * + * @return {Object} Action object. + */ +export const cancelBackDiscard = () => ( { + type: 'SRFM_FORM_SETTINGS_CANCEL_BACK_DISCARD', +} ); + +/** + * Queue a toast for the dialog-level Toaster to surface. Consumers call + * `notify.success/.error(...)` from `src/utils/notify.js` rather than + * dispatching this directly — the helper wraps this action so non-React + * call sites (e.g. `srfmSaveFormMeta`) can still emit toasts cleanly. + * + * Writes `pendingToast` AND bumps `toastCounter`. Dialog.js subscribes + * to the counter and dismisses + fires the underlying @bsf/force-ui + * `toast.success/.error` on every bump. + * + * @param {Object} payload Toast payload. + * @param {string} payload.type `'success' | 'error'`. + * @param {string} payload.message Toast body copy. + * @param {number} [payload.duration] Auto-dismiss delay in ms. + * @return {Object} Action object. + */ +export const requestToast = ( payload ) => ( { + type: 'SRFM_FORM_SETTINGS_REQUEST_TOAST', + payload: payload || {}, +} ); + +/** + * Register / update a tab save adapter. Used by tab components that own + * their own save logic (e.g. pro tabs) so the global-settings header + * Save button can route to them. + * + * @param {string} slug Tab slug. + * @param {Object} options Adapter state. + * @param {boolean} options.isDirty Whether this tab has unsaved changes. + * @param {boolean} options.isSaving Whether this tab is currently saving. + * @return {Object} Action object. + */ +export const setGlobalSettingsTabAdapter = ( + slug, + { isDirty = false, isSaving = false } = {} +) => ( { + type: 'SRFM_GLOBAL_SETTINGS_SET_TAB_ADAPTER', + slug, + isDirty, + isSaving, +} ); + +/** + * Remove a previously-registered tab save adapter (unmount cleanup). + * + * @param {string} slug Tab slug. + * @return {Object} Action object. + */ +export const removeGlobalSettingsTabAdapter = ( slug ) => ( { + type: 'SRFM_GLOBAL_SETTINGS_REMOVE_TAB_ADAPTER', + slug, +} ); + +/** + * Push the aggregate free-tab dirty signal into Redux. `Component.js` + * dispatches this on every render so the tab-switch guard / pro tabs + * can read it without holding a reference to `Component`. + * + * @param {boolean} isDirty Aggregate dirty signal. + * @return {Object} Action object. + */ +export const setGlobalSettingsPageDirty = ( isDirty ) => ( { + type: 'SRFM_GLOBAL_SETTINGS_SET_PAGE_DIRTY', + isDirty, +} ); + +/** + * Request navigation to a different tab. The guard reads `pendingNav` + * and surfaces the "Unsaved changes" modal; on confirm it clears + * `pendingNav` and navigates. + * + * @param {string} to Target search string (e.g. `?page=…&tab=…`). + * @return {Object} Action object. + */ +export const requestGlobalSettingsNavigation = ( to ) => ( { + type: 'SRFM_GLOBAL_SETTINGS_REQUEST_NAV', + to, +} ); + +/** + * Clear the pending navigation (popup confirmed or cancelled). + * + * @return {Object} Action object. + */ +export const clearGlobalSettingsPendingNav = () => ( { + type: 'SRFM_GLOBAL_SETTINGS_CLEAR_PENDING_NAV', +} ); + +/** + * Record a global-settings extension panel's dirty contribution under + * its own slot in `globalSettings.extensionDirty`. Used by pro sub- + * sections that render via filter (e.g. the IP / Country / Keyword + * Defaults under Global Defaults → Form Restrictions) to push their + * locally-computed `isDirty` boolean up to the host page so the + * header Save button reflects their edits too. + * + * Slots auto-clean on consumer unmount via a + * `setGlobalSettingsExtensionDirty( slot, false )` in the effect + * cleanup. + * + * @param {string} slot Stable slot id (e.g. `'advanced-restrictions'`). + * @param {boolean} dirty Latest dirty boolean for this slot. + * @return {Object} Action object. + */ +export const setGlobalSettingsExtensionDirty = ( slot, dirty ) => ( { + type: 'SRFM_GLOBAL_SETTINGS_SET_EXTENSION_DIRTY', + slot, + dirty: !! dirty, +} ); + +/** + * Bump the extension-save request counter, scoped to the tab whose + * header Save button was clicked. Registered extension panels subscribe + * via `selectGlobalSettingsExtensionSaveCounter` and check + * `selectGlobalSettingsExtensionSaveTab` so a save on Tab A doesn't + * trigger an extension registered for Tab B (and so a third-party + * extension written without an internal `if (isDirty)` guard can't + * POST empty payloads on every header click). + * + * @param {string} [tab] Tab slug whose Save button fired. Optional for + * backward-compat: `null` means "broadcast to all". + * @return {Object} Action object. + */ +export const requestGlobalSettingsExtensionSave = ( tab = null ) => ( { + type: 'SRFM_GLOBAL_SETTINGS_REQUEST_EXTENSION_SAVE', + tab, +} ); + +/** + * Record a global-settings extension panel's in-flight `isSaving` + * boolean under its own slot. Mirrors `setGlobalSettingsExtensionDirty` + * — the host ORs the aggregate into the header Save button's + * `isSaving` so the spinner shows even when only an extension panel + * is mid-POST. + * + * @param {string} slot Stable slot id matching the dirty contribution. + * @param {boolean} saving Whether this slot is currently POSTing. + * @return {Object} Action object. + */ +export const setGlobalSettingsExtensionSaving = ( slot, saving ) => ( { + type: 'SRFM_GLOBAL_SETTINGS_SET_EXTENSION_SAVING', + slot, + saving: !! saving, +} ); diff --git a/src/store/reducer.js b/src/store/reducer.js index ed2503835..d663a5971 100644 --- a/src/store/reducer.js +++ b/src/store/reducer.js @@ -1,20 +1,88 @@ /** * Reducer for managing global state in SureForms. - * This reducer handles the global state of the SureForms plugin, allowing for updates to the global data structure. - * It is designed to be extensible, allowing other plugins like "sureforms-pro" to extend the default state. */ -/** - * Initial state for the SureForms store. - * This state can be extended by other plugins like "sureforms-pro". - * This will be used to store data that is shared across the SureForms plugin. - * - * @type {Object} - * @property {Object} srfmGlobalData - The global data for SureForms. - * This will hold various data structures used across the plugin. - */ const defaultState = { srfmGlobalData: {}, + // Single-form-settings dialog state. + formSettings: { + // Per-meta-key server snapshot. `TabContentWrapper.handleSave` + // snapshots this pre-save and reverts to it on POST failure. + baseline: {}, + // Per-meta-key in-flight staged edits. `srfmEditFormMeta` writes + // here; the save payload is built by reading from this slice. + values: {}, + // Active sub-form dirty flag — pushed by the tab via + // `setSingleFormSettingUnsave`. The dialog's tab-switch / close + // guard reads this. + singleFormSettingUnsave: false, + // Active sub-form in-flight Save flag — pushed by + // `TabContentWrapper.handleSave` around its await. The dialog's + // guards read this and block tab-switch / close while a POST is + // pending so a mid-await "Discard" can't revert local state for + // a save the server has already accepted. + singleFormSettingSaving: false, + // Incremented by `discardChanges`. Tabs subscribe and reset their + // local React state when it bumps. + discardCounter: 0, + // Copy for the dialog-level back-arrow discard modal. Set by the + // active tab via `requestBackDiscard`, cleared on confirm/cancel. + // Shape: `{ title, description, confirmText, cancelText }`. + pendingBackDiscard: null, + // Incremented by `confirmBackDiscard`. Tabs subscribe to fire + // their own back-navigation callback when the user confirms. + backDiscardConfirmCounter: 0, + // Latest toast payload — Dialog.js subscribes to the counter + // below and fires @bsf/force-ui's `toast.success/.error` for + // each new value. Copy-only; rendering happens at the dialog. + pendingToast: null, + // Incremented on every `requestToast`. Counter pattern so the + // listener fires once per dispatch even if the payload is + // reference-equal. + toastCounter: 0, + // Per-slot dirty contributions from sibling panels that can't + // reach the tab owner's local React state (e.g. Compliance + // Settings is a Dialog.js-level sibling of Form Restriction + // but still drives the same Save button). The tab owner reads + // `selectTabDirtyContributionsAggregate` and ORs it into its + // own `isDirty`. Each consumer cleans up its slot on unmount + // via `setTabDirtyContribution(slot, false)`. + tabDirtyContributions: {}, + }, + globalSettings: { + // Map of tab slug → { isDirty, isSaving } registered by tab + // components that own their own save logic (e.g. pro tabs). The + // header Save button reads from here when an entry exists for the + // active tab; otherwise it falls back to free's per-tab dirty + // tracking inside Component.js. + tabAdapters: {}, + // Aggregate free-tab dirty signal pushed from Component.js, so the + // tab-switch guard can decide whether to intercept without holding + // a reference to Component's local state. + pageDirty: false, + // `{ to: '?page=...&tab=...' }` while a tab-switch is blocked and + // the "Unsaved changes" modal is asking the user to confirm. + pendingNav: null, + // Per-slot dirty contributions from extension panels rendered into + // global-settings pages via filters (e.g. pro IP/Country/Keyword + // Defaults under Global Defaults → Form Restrictions). Host + // `Component.js` ORs the aggregate into the header Save button's + // `isDirty` so the button reflects extension edits too. + extensionDirty: {}, + // Per-slot `isSaving` contributions, parallel to `extensionDirty`. + // Host ORs into the header Save button's `isSaving` so the + // spinner shows even when only an extension panel is mid-POST. + extensionSaving: {}, + // Incremented when the host's Save button is clicked. Extension + // panels subscribe to the counter and fire their own POSTs on + // each bump — parallel to the host's `saveAllDirtyTabs`. + extensionSaveCounter: 0, + // Tab slug attached to the most-recent + // `requestGlobalSettingsExtensionSave` bump. Extensions filter + // on this so a save on a different tab doesn't trigger their + // POST. `null` means broadcast (back-compat path). + extensionSaveTab: null, + }, }; /** @@ -34,8 +102,282 @@ function reducer( state = defaultState, action ) { ...action.payload, }, }; + + case 'SRFM_FORM_SETTINGS_SET_VALUE': + return { + ...state, + formSettings: { + ...state.formSettings, + values: { + ...state.formSettings.values, + [ action.metaKey ]: action.value, + }, + }, + }; + case 'SRFM_FORM_SETTINGS_COMMIT_SAVED_META': { + const next = { ...action.values }; + return { + ...state, + formSettings: { + ...state.formSettings, + baseline: { ...state.formSettings.baseline, ...next }, + values: { ...state.formSettings.values, ...next }, + }, + }; + } + case 'SRFM_FORM_SETTINGS_REVERT_ON_FAILURE': { + // Single-hop revert: write baseline AND value for each + // affected key in one new state object so any subscriber + // comparing the two through useSelect never observes the + // intermediate "equal" state that the previous 2-step + // revert produced. + const entries = action.entries || {}; + const nextBaseline = { ...state.formSettings.baseline }; + const nextValues = { ...state.formSettings.values }; + Object.keys( entries ).forEach( ( key ) => { + const entry = entries[ key ] || {}; + nextBaseline[ key ] = entry.baseline; + nextValues[ key ] = entry.value; + } ); + return { + ...state, + formSettings: { + ...state.formSettings, + baseline: nextBaseline, + values: nextValues, + }, + }; + } + case 'SRFM_FORM_SETTINGS_DISCARD_VALUES': + return { + ...state, + formSettings: { + ...state.formSettings, + values: { ...state.formSettings.baseline }, + }, + }; + case 'SRFM_FORM_SETTINGS_DISCARD': + // Lifecycle reset on dialog close. Wipe `globalSettings` too — + // the dialog and the global-settings page are mutually + // exclusive views, so any registered adapters / pending nav / + // extension slots from a prior visit are stale state once the + // dialog closes. + return { + ...state, + formSettings: { + baseline: {}, + values: {}, + singleFormSettingUnsave: false, + singleFormSettingSaving: false, + discardCounter: 0, + pendingBackDiscard: null, + backDiscardConfirmCounter: 0, + pendingToast: null, + toastCounter: 0, + tabDirtyContributions: {}, + }, + globalSettings: { + tabAdapters: {}, + pageDirty: false, + pendingNav: null, + extensionDirty: {}, + extensionSaving: {}, + extensionSaveCounter: 0, + extensionSaveTab: null, + }, + }; + case 'SRFM_SINGLE_FORM_SETTING_SET_UNSAVE': + return { + ...state, + formSettings: { + ...state.formSettings, + singleFormSettingUnsave: !! action.unsaved, + }, + }; + case 'SRFM_SINGLE_FORM_SETTING_SET_SAVING': + return { + ...state, + formSettings: { + ...state.formSettings, + singleFormSettingSaving: !! action.saving, + }, + }; + case 'SRFM_SINGLE_FORM_SETTING_DISCARD': + return { + ...state, + formSettings: { + ...state.formSettings, + singleFormSettingUnsave: false, + discardCounter: + ( state.formSettings.discardCounter || 0 ) + 1, + }, + }; + case 'SRFM_SINGLE_FORM_SETTING_KEEP': + // No state change today. Dispatched from the popup's "Stay" + // branch so behaviour is symmetric and we have a single hook + // to extend later. + return state; + + case 'SRFM_FORM_SETTINGS_REQUEST_BACK_DISCARD': + return { + ...state, + formSettings: { + ...state.formSettings, + pendingBackDiscard: action.payload || null, + }, + }; + case 'SRFM_FORM_SETTINGS_CONFIRM_BACK_DISCARD': + return { + ...state, + formSettings: { + ...state.formSettings, + pendingBackDiscard: null, + backDiscardConfirmCounter: + ( state.formSettings.backDiscardConfirmCounter || 0 ) + + 1, + }, + }; + case 'SRFM_FORM_SETTINGS_CANCEL_BACK_DISCARD': + return { + ...state, + formSettings: { + ...state.formSettings, + pendingBackDiscard: null, + }, + }; + case 'SRFM_FORM_SETTINGS_REQUEST_TOAST': + return { + ...state, + formSettings: { + ...state.formSettings, + pendingToast: action.payload || null, + toastCounter: + ( state.formSettings.toastCounter || 0 ) + 1, + }, + }; + case 'SRFM_FORM_SETTINGS_SET_TAB_DIRTY_CONTRIBUTION': { + if ( ! action.slot ) { + return state; + } + const current = + state.formSettings.tabDirtyContributions || {}; + // Skip if value is already what we'd set — avoids unnecessary + // re-renders for consumers subscribed via useSelect. + if ( current[ action.slot ] === action.dirty ) { + return state; + } + return { + ...state, + formSettings: { + ...state.formSettings, + tabDirtyContributions: { + ...current, + [ action.slot ]: action.dirty, + }, + }, + }; + } + + case 'SRFM_GLOBAL_SETTINGS_SET_TAB_ADAPTER': + return { + ...state, + globalSettings: { + ...state.globalSettings, + tabAdapters: { + ...state.globalSettings.tabAdapters, + [ action.slug ]: { + isDirty: !! action.isDirty, + isSaving: !! action.isSaving, + }, + }, + }, + }; + case 'SRFM_GLOBAL_SETTINGS_REMOVE_TAB_ADAPTER': { + const { [ action.slug ]: _, ...rest } = + state.globalSettings.tabAdapters; + return { + ...state, + globalSettings: { + ...state.globalSettings, + tabAdapters: rest, + }, + }; + } + case 'SRFM_GLOBAL_SETTINGS_SET_PAGE_DIRTY': + return { + ...state, + globalSettings: { + ...state.globalSettings, + pageDirty: !! action.isDirty, + }, + }; + case 'SRFM_GLOBAL_SETTINGS_REQUEST_NAV': + return { + ...state, + globalSettings: { + ...state.globalSettings, + pendingNav: { to: action.to }, + }, + }; + case 'SRFM_GLOBAL_SETTINGS_CLEAR_PENDING_NAV': + return { + ...state, + globalSettings: { + ...state.globalSettings, + pendingNav: null, + }, + }; + case 'SRFM_GLOBAL_SETTINGS_SET_EXTENSION_DIRTY': { + if ( ! action.slot ) { + return state; + } + const current = state.globalSettings.extensionDirty || {}; + if ( current[ action.slot ] === action.dirty ) { + return state; + } + return { + ...state, + globalSettings: { + ...state.globalSettings, + extensionDirty: { + ...current, + [ action.slot ]: action.dirty, + }, + }, + }; + } + case 'SRFM_GLOBAL_SETTINGS_REQUEST_EXTENSION_SAVE': + return { + ...state, + globalSettings: { + ...state.globalSettings, + extensionSaveCounter: + ( state.globalSettings.extensionSaveCounter || 0 ) + + 1, + extensionSaveTab: action.tab || null, + }, + }; + case 'SRFM_GLOBAL_SETTINGS_SET_EXTENSION_SAVING': { + if ( ! action.slot ) { + return state; + } + const current = state.globalSettings.extensionSaving || {}; + if ( current[ action.slot ] === action.saving ) { + return state; + } + return { + ...state, + globalSettings: { + ...state.globalSettings, + extensionSaving: { + ...current, + [ action.slot ]: action.saving, + }, + }, + }; + } + default: - // If the action type is not recognized, return the current state unchanged. return state; } } diff --git a/src/store/selectors.js b/src/store/selectors.js index 636dc8345..fc9675e42 100644 --- a/src/store/selectors.js +++ b/src/store/selectors.js @@ -1,10 +1,114 @@ /* - * Selectors for the SureForms store + * Selectors for the SureForms store. */ +export const selectSrfmGlobalData = ( state ) => state.srfmGlobalData; + +export const selectFormSettingValue = ( state, metaKey ) => + state.formSettings?.values?.[ metaKey ]; + +export const selectFormSettingBaselineValue = ( state, metaKey ) => + state.formSettings?.baseline?.[ metaKey ]; + +export const selectSingleFormSettingUnsave = ( state ) => + !! state.formSettings?.singleFormSettingUnsave; + +export const selectSingleFormSettingSaving = ( state ) => + !! state.formSettings?.singleFormSettingSaving; + +export const selectSingleFormSettingDiscardCounter = ( state ) => + state.formSettings?.discardCounter || 0; + +export const selectPendingBackDiscard = ( state ) => + state.formSettings?.pendingBackDiscard || null; + +export const selectBackDiscardConfirmCounter = ( state ) => + state.formSettings?.backDiscardConfirmCounter || 0; + +export const selectPendingToast = ( state ) => + state.formSettings?.pendingToast || null; + +export const selectToastCounter = ( state ) => + state.formSettings?.toastCounter || 0; + /** - * Select the global data from the store. + * Aggregate per-slot dirty contributions into a single boolean — true + * if any sibling panel that registered a slot has reported dirty. * - * @param {Object} state - The current state of the store + * Used by the tab owner (e.g. `FormRestriction`) to OR-fold sibling + * panels' dirty signals into the Save button's `isDirty` prop without + * those siblings needing to live inside the owner's render tree. + * + * @param {Object} state Store state. + * @return {boolean} True if any slot is dirty. */ -export const selectSrfmGlobalData = ( state ) => state.srfmGlobalData; +export const selectTabDirtyContributionsAggregate = ( state ) => { + const map = state.formSettings?.tabDirtyContributions || {}; + return Object.values( map ).some( Boolean ); +}; + +export const selectGlobalSettingsTabAdapter = ( state, slug ) => + state.globalSettings?.tabAdapters?.[ slug ] || null; + +export const selectAnyGlobalSettingsTabAdapterDirty = ( state ) => { + const map = state.globalSettings?.tabAdapters || {}; + return Object.values( map ).some( ( a ) => !! a?.isDirty ); +}; + +export const selectGlobalSettingsPageDirty = ( state ) => + !! state.globalSettings?.pageDirty; + +export const selectGlobalSettingsPendingNav = ( state ) => + state.globalSettings?.pendingNav || null; + +/** + * Aggregate per-slot dirty contributions from global-settings extension + * panels (filter-driven sub-sections) into a single boolean. Used by + * the host page's header Save button to OR-fold extension dirty into + * its own dirty signal. + * + * @param {Object} state Store state. + * @return {boolean} True if any slot is dirty. + */ +export const selectGlobalSettingsExtensionsDirtyAggregate = ( state ) => { + const map = state.globalSettings?.extensionDirty || {}; + return Object.values( map ).some( Boolean ); +}; + +/** + * Read the extension-save request counter. Extension panels subscribe + * to this and fire their own POSTs on each bump (the host dispatches + * `requestGlobalSettingsExtensionSave` from its Save click handler). + * + * @param {Object} state Store state. + * @return {number} Monotonic counter, starts at 0. + */ +export const selectGlobalSettingsExtensionSaveCounter = ( state ) => + state.globalSettings?.extensionSaveCounter || 0; + +/** + * Read the tab slug attached to the latest extension-save bump. + * Extensions read this alongside the counter and skip their POST when + * the slug doesn't match their host tab. `null` means the host did not + * scope the request (broadcast). + * + * @param {Object} state Store state. + * @return {string|null} Tab slug or null. + */ +export const selectGlobalSettingsExtensionSaveTab = ( state ) => + state.globalSettings?.extensionSaveTab || null; + +/** + * Aggregate per-slot `isSaving` contributions from global-settings + * extension panels. Mirrors + * `selectGlobalSettingsExtensionsDirtyAggregate`. Host ORs into the + * header Save button's `isSaving` so the spinner / "Saving…" label + * surfaces even when only an extension panel is mid-POST. + * + * @param {Object} state Store state. + * @return {boolean} True if any slot is currently saving. + */ +export const selectGlobalSettingsExtensionsSavingAggregate = ( state ) => { + const map = state.globalSettings?.extensionSaving || {}; + return Object.values( map ).some( Boolean ); +}; diff --git a/src/store/store.js b/src/store/store.js index 3bf990653..a202a2e44 100644 --- a/src/store/store.js +++ b/src/store/store.js @@ -1,7 +1,7 @@ /** * WordPress dependencies */ -import { createReduxStore, register } from '@wordpress/data'; +import { createReduxStore, register, select } from '@wordpress/data'; /** * Internal dependencies @@ -25,5 +25,10 @@ export const store = createReduxStore( storeName, { selectors, } ); -register( store ); +// Guard against the "Store 'sureforms' is already registered" warning when +// both free and pro bundles each ship the store module and reach the same +// `wp.data` registry. The probe returns falsy only on first registration. +if ( ! select( storeName ) ) { + register( store ); +} // setInitialState(); diff --git a/src/utils/Helpers.js b/src/utils/Helpers.js index 68c72196a..b03781adb 100644 --- a/src/utils/Helpers.js +++ b/src/utils/Helpers.js @@ -551,6 +551,17 @@ export const addQueryParam = ( url, paramValue, paramKey = 'utm_medium' ) => { try { const urlObj = new URL( url ); urlObj.searchParams.set( paramKey, paramValue ); + + // Keep SureForms attribution deterministic for outbound marketing links. + if ( 'utm_medium' === paramKey ) { + if ( ! urlObj.searchParams.get( 'utm_source' ) ) { + urlObj.searchParams.set( 'utm_source', 'sureforms_plugin' ); + } + if ( ! urlObj.searchParams.get( 'utm_campaign' ) ) { + urlObj.searchParams.set( 'utm_campaign', 'core_plugin' ); + } + } + return urlObj.toString(); } catch ( error ) { console.error( 'Invalid URL:', error ); @@ -1262,6 +1273,20 @@ export function useShouldIframe() { return useSelect( ( _select ) => { const { getEditorSettings, getCurrentPostType, getDeviceType } = _select( editorStore ); + + // Only consider core and SureForms blocks for the apiVersion check — + // third-party plugins (e.g. ThirstyAffiliates' ta/image at apiVersion + // 1) globally register legacy blocks that would otherwise flip this + // heuristic and force a non-iframe path, breaking the editor because + // WP itself still iframes the form editor canvas. + const relevantBlocks = _select( blocksStore ) + .getBlockTypes() + .filter( + ( type ) => + type.name?.startsWith( 'srfm/' ) || + type.name?.startsWith( 'core/' ) + ); + return ( // If the theme is block based and the Gutenberg plugin is active, // we ALWAYS use the iframe for consistency across the post and site @@ -1274,10 +1299,11 @@ export function useShouldIframe() { getDeviceType() !== 'Desktop' || [ 'wp_template', 'wp_block' ].includes( getCurrentPostType() ) || // Finally, still iframe the editor if all blocks are v3 (which means - // they are marked as iframe-compatible). - _select( blocksStore ) - .getBlockTypes() - .every( ( type ) => type.apiVersion >= 3 ) + // they are marked as iframe-compatible). Guard against the empty + // case — `[].every()` returns true vacuously and would force the + // iframe path before any blocks have registered. + ( relevantBlocks.length > 0 && + relevantBlocks.every( ( type ) => type.apiVersion >= 3 ) ) ); }, [] ); } diff --git a/src/utils/emailValidation.js b/src/utils/emailValidation.js new file mode 100644 index 000000000..16ac29931 --- /dev/null +++ b/src/utils/emailValidation.js @@ -0,0 +1,152 @@ +import { __, sprintf } from '@wordpress/i18n'; + +/** + * Validate From Email and return appropriate warning message. + * + * @param {string} fromEmail - The from email value to validate. + * @return {string|JSX.Element|undefined} Warning message or undefined if valid. + */ +/** + * Resolve the bare site host (e.g. "localhost", "example.com"). + * + * srfm_block_data exposes this directly (block editor only). On the global + * settings page only srfm_admin is available, where site_url is the full URL + * — so we derive the hostname from it. + * + * @return {string} Bare host without protocol or "www.". + */ +// SF-2815 start: shared host resolver for form editor + global settings. +const getSiteHost = () => { + const blockHost = window?.srfm_block_data?.site_url; + if ( blockHost ) { + return blockHost; + } + const adminUrl = window?.srfm_admin?.site_url; + if ( ! adminUrl ) { + return ''; + } + try { + return new URL( adminUrl ).hostname.replace( /^www\./, '' ); + } catch ( e ) { + return ''; + } +}; +// SF-2815 end. + +export const getFromEmailWarningMessage = ( fromEmail ) => { + const email = fromEmail || ''; + const userEnteredUrl = email?.split( '@' )[ 1 ] || ''; + const siteUrl = getSiteHost(); + + // If value is a smart tag (starts with '{' and ends with '}'). + if ( email.startsWith( '{' ) && email.endsWith( '}' ) ) { + if ( window.srfm_block_data?.is_suremails_active ) { + return sprintf( + /* translators: %1$s: site URL, %2$s: site URL. */ + __( + "The current 'From Email' address may not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).", + 'sureforms' + ), + siteUrl, + siteUrl + ); + } + return { + type: 'jsx', + siteUrl, + messageType: 'smart_tag', + }; + } + + const isValidEmail = + /^[\p{L}\p{N}._%+-]+@[\p{L}\p{N}.-]+\.[\p{L}]{2,}$/u.test( email ); + + // If email is empty or invalid. + if ( email === '' || ! isValidEmail ) { + return __( + "Please enter a valid email address. Your notifications won't be sent if the field is not filled in correctly.", + 'sureforms' + ); + } + + // If email domain doesn't match site domain. + if ( userEnteredUrl !== siteUrl ) { + if ( window.srfm_block_data?.is_suremails_active ) { + return sprintf( + /* translators: %1$s: site URL, %2$s: site URL. */ + __( + "The current 'From Email' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam. Alternately, try using a From Address that matches your website domain (admin@%2$s).", + 'sureforms' + ), + siteUrl, + siteUrl + ); + } + return { + type: 'jsx', + siteUrl, + messageType: 'domain_mismatch', + }; + } + + return undefined; +}; + +/** + * Render the SureMail recommendation JSX message. + * + * @param {string} siteUrl - The site URL. + * @param {string} messageType - Type of message: 'smart_tag' or 'domain_mismatch'. + * @return {JSX.Element} The warning message JSX. + */ +export const renderSureMailRecommendation = ( siteUrl, messageType ) => { + const smartTagPrefix = sprintf( + /* translators: %s: site URL. */ + __( + "The current 'From Email' address may not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ", + 'sureforms' + ), + siteUrl + ); + const domainMismatchPrefix = sprintf( + /* translators: %s: site URL. */ + __( + "The current 'From Email' address does not match your website domain name (%s). This can cause your notification emails to be blocked or marked as spam. ", + 'sureforms' + ), + siteUrl + ); + const messagePrefix = + messageType === 'smart_tag' ? smartTagPrefix : domainMismatchPrefix; + + const alternateMessage = sprintf( + /* translators: %s: site URL. */ + __( + ' Alternately, try using a From Address that matches your website domain (admin@%s).', + 'sureforms' + ), + siteUrl + ); + + return ( + <> + { messagePrefix } + { __( + 'We strongly recommend that you install the free ', + 'sureforms' + ) } + <a + href="https://suremails.com?utm_medium=sureforms" + target="_blank" + rel="noopener noreferrer" + > + SureMail + </a> + { __( + ' plugin! The Setup Wizard makes it easy to fix your emails. ', + 'sureforms' + ) } + { alternateMessage } + </> + ); +}; diff --git a/src/utils/notify.js b/src/utils/notify.js new file mode 100644 index 000000000..13c163382 --- /dev/null +++ b/src/utils/notify.js @@ -0,0 +1,41 @@ +import { dispatch } from '@wordpress/data'; +import { STORE_NAME as SRFM_STORE_NAME } from '@Store/constants'; +// Side-effect import: ensures the `sureforms` store is registered by the +// time any consumer calls `notify.success/.error`, even when this module +// loads from a separate webpack entry (e.g. pro bundles). +import '@Store/store'; + +const DEFAULT_DURATION = 5000; + +/** + * Internal: dispatch a `requestToast` action with normalized shape. + * + * @param {'success'|'error'} type Toast variant. + * @param {string} message Toast body copy. + * @param {Object} [options] + * @param {number} [options.duration] Auto-dismiss delay in ms. + */ +const enqueue = ( type, message, options = {} ) => { + dispatch( SRFM_STORE_NAME )?.requestToast?.( { + type, + message, + duration: options.duration ?? DEFAULT_DURATION, + } ); +}; + +/** + * Centralized toast surface for the single-form-settings dialog. Tabs and + * helpers call `notify.success(...)` / `notify.error(...)` instead of + * importing `@bsf/force-ui`'s `toast` directly. `Dialog.js` owns the + * `<Toaster>` mount and subscribes to the store; here we just queue the + * payload. + * + * Why dispatch (vs. calling the toast lib directly): the helper works + * from non-React call sites (e.g. async helpers like `srfmSaveFormMeta`) + * and from any tab regardless of which Toaster is mounted, because the + * dispatch flows through the shared store. + */ +export const notify = { + success: ( message, options ) => enqueue( 'success', message, options ), + error: ( message, options ) => enqueue( 'error', message, options ), +}; diff --git a/sureforms.php b/sureforms.php index 5fd4f2caa..73887f9a0 100644 --- a/sureforms.php +++ b/sureforms.php @@ -7,7 +7,7 @@ * Requires PHP: 7.4 * Author: SureForms * Author URI: https://sureforms.com/ - * Version: 2.8.2 + * Version: 2.10.1 * License: GPLv2 or later * Text Domain: sureforms * @@ -25,7 +25,7 @@ define( 'SRFM_BASENAME', plugin_basename( SRFM_FILE ) ); define( 'SRFM_DIR', plugin_dir_path( SRFM_FILE ) ); define( 'SRFM_URL', plugins_url( '/', SRFM_FILE ) ); -define( 'SRFM_VER', '2.8.2' ); +define( 'SRFM_VER', '2.10.1' ); define( 'SRFM_SLUG', 'srfm' ); // ------ ADDITIONAL CONSTANTS ------- // define( 'SRFM_FORMS_POST_TYPE', 'sureforms_form' ); @@ -35,7 +35,7 @@ define( 'SRFM_AI_MIDDLEWARE', 'https://credits.startertemplates.com/sureforms/' ); define( 'SRFM_MIDDLEWARE_BASE_URL', 'https://api.sureforms.com/' ); define( 'SRFM_BILLING_PORTAL', 'https://billing.sureforms.com/' ); -define( 'SRFM_PRO_RECOMMENDED_VER', '2.8.3' ); +define( 'SRFM_PRO_RECOMMENDED_VER', '2.10.0' ); define( 'SRFM_SURETRIGGERS_INTEGRATION_BASE_URL', 'https://app.ottokit.com/' ); diff --git a/tailwind.config.js b/tailwind.config.js index 2cbff1bc2..b10e8da62 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -218,5 +218,5 @@ module.exports = withTW( { preflight: false, }, important: - ':is(#srfm-dashboard-container, #srfm-settings-container, #srfm-page-header, #srfm-dialog-root, #srfm-add-new-form-container, #srfm-suremail-container, #srfm-entries-root, #srfm-survey-reports-root, #srfm-quiz-entries-root, #srfm-survey-empty-state-root, #srfm-forms-root, #srfm-learn-root, #srfm-payments-react-container)', + ':is(#srfm-dashboard-container, #srfm-dashboard-container-tooltip, #srfm-settings-container, #srfm-page-header, #srfm-dialog-root, #srfm-add-new-form-container, #srfm-suremail-container, #srfm-entries-root, #srfm-survey-reports-root, #srfm-quiz-entries-root, #srfm-survey-empty-state-root, #srfm-forms-root, #srfm-learn-root, #srfm-payments-react-container, #srfm-partial-entries-empty-state-root)', } ); diff --git a/tests/unit/admin/test-admin.php b/tests/unit/admin/test-admin.php index 7f433c4c3..57615edbe 100644 --- a/tests/unit/admin/test-admin.php +++ b/tests/unit/admin/test-admin.php @@ -8,6 +8,7 @@ use Yoast\PHPUnitPolyfills\TestCases\TestCase; use SRFM\Admin\Admin; +use SRFM\Inc\Helper; require_once __DIR__ . '/trait-astra-notices-helper.php'; @@ -550,4 +551,72 @@ public function test_render_survey_empty_state() { $output = ob_get_clean(); $this->assertStringContainsString( 'srfm-survey-empty-state-root', $output ); } + + /** + * Test: add_partial_entries_page method exists and is callable. + * + * @since 2.9.0 + */ + public function test_add_partial_entries_page() { + $admin = Admin::get_instance(); + $this->assertTrue( method_exists( $admin, 'add_partial_entries_page' ) ); + } + + /** + * Test: render_partial_entries_empty_state outputs the root div. + * + * @since 2.9.0 + */ + public function test_render_partial_entries_empty_state() { + $admin = Admin::get_instance(); + ob_start(); + $admin->render_partial_entries_empty_state(); + $output = ob_get_clean(); + $this->assertStringContainsString( 'srfm-partial-entries-empty-state-root', $output ); + } + + /** + * Test: add_action_links appends a UTM-tagged upsell link when SureForms + * Pro is not active. Asserts the deterministic source/campaign defaults + * and the placement carried via utm_medium. + */ + public function test_add_action_links_appends_utm_tagged_upsell_when_pro_inactive() { + if ( class_exists( Helper::class ) && Helper::has_pro() ) { + $this->markTestSkipped( 'SureForms Pro is active; upsell branch is not exercised.' ); + } + + $admin = Admin::get_instance(); + $links = $admin->add_action_links( [] ); + + $this->assertCount( 1, $links, 'A single upsell link must be appended when pro is not active.' ); + $this->assertStringContainsString( 'utm_source=sureforms_plugin', $links[0] ); + $this->assertStringContainsString( 'utm_medium=plugin-list', $links[0] ); + $this->assertStringContainsString( 'utm_campaign=core_plugin', $links[0] ); + } + + /** + * Test: add_action_links returns the array unchanged when SureForms + * Pro is active — no upsell link is appended. + */ + public function test_add_action_links_returns_unchanged_when_pro_active() { + if ( ! class_exists( Helper::class ) || ! Helper::has_pro() ) { + $this->markTestSkipped( 'SureForms Pro is not active in this test env.' ); + } + + $admin = Admin::get_instance(); + $input = [ '<a href="#">Existing</a>' ]; + $links = $admin->add_action_links( $input ); + + $this->assertSame( $input, $links ); + } + + /** + * Test: add_upgrade_to_pro is callable. Side-effect (calling + * add_submenu_page) requires the parent menu to be registered, which + * is outside this unit's scope — so we only assert the method exists. + */ + public function test_add_upgrade_to_pro_is_callable() { + $admin = Admin::get_instance(); + $this->assertTrue( method_exists( $admin, 'add_upgrade_to_pro' ) ); + } } diff --git a/tests/unit/inc/admin/test-editor-nudge.php b/tests/unit/inc/admin/test-editor-nudge.php index 8e5018456..208303735 100644 --- a/tests/unit/inc/admin/test-editor-nudge.php +++ b/tests/unit/inc/admin/test-editor-nudge.php @@ -370,6 +370,43 @@ public function test_enqueue_scripts_is_hooked_to_admin_enqueue_scripts() { ); } + /** + * SRFM-2709: when allow_load() passes, the localised create_form_url + * must carry the deterministic UTM keys so the destination flow can + * attribute the click. Asserts on the JSON the script tag will emit. + */ + public function test_enqueue_scripts_tags_create_form_url_with_utm_attribution() { + wp_set_current_user( $this->admin_id ); + + if ( ! defined( 'WP_ADMIN' ) ) { + define( 'WP_ADMIN', true ); + } + + $this->force_block_editor_screen( 'page' ); + $this->set_current_post( $this->post_id ); + + $this->nudge->enqueue_scripts(); + + $handle = SRFM_SLUG . '-editor-nudge'; + $data = wp_scripts()->get_data( $handle, 'data' ); + + $this->assertIsString( $data, 'Localized data must be present after a successful enqueue.' ); + + foreach ( + [ + 'utm_source=sureforms_plugin', + 'utm_medium=editor_nudge', + 'utm_campaign=core_plugin', + ] as $needle + ) { + $this->assertStringContainsString( + $needle, + $data, + "Localized create_form_url must include {$needle}." + ); + } + } + // --------------------------------------------------------------- // handle_dismiss() // --------------------------------------------------------------- diff --git a/tests/unit/inc/admin/test-html-form-detector.php b/tests/unit/inc/admin/test-html-form-detector.php new file mode 100644 index 000000000..404dff51d --- /dev/null +++ b/tests/unit/inc/admin/test-html-form-detector.php @@ -0,0 +1,505 @@ +<?php +/** + * Class Test_Html_Form_Detector + * + * @package sureforms + */ + +use Yoast\PHPUnitPolyfills\TestCases\TestCase; +use SRFM\Inc\Admin\Html_Form_Detector; + +/** + * Tests for Html_Form_Detector. + * + * Coverage strategy: most of the detector is composed of pure + * transforms (`shorthand_to_sides`, `scrub_html_for_ai`, + * `build_form_metadata`, `pick_hex`, `strip_internal_hints`). Those + * are tested directly via reflection — no WP fixtures needed. The + * IO-heavy methods (`enqueue_scripts`, `handle_convert_html_form`, + * `extract_fields_via_ai`) are covered with thin smoke tests that + * verify the public contract under a controlled environment, not + * the full integration path (which is exercised end-to-end in + * Playwright runs). + */ +class Test_Html_Form_Detector extends TestCase { + + /** + * Detector instance under test. + * + * @var Html_Form_Detector + */ + protected $detector; + + /** + * Admin user id used across tests. + * + * @var int + */ + protected $admin_id; + + /** + * Subscriber user id used across tests. + * + * @var int + */ + protected $subscriber_id; + + protected function setUp(): void { + parent::setUp(); + $this->detector = Html_Form_Detector::get_instance(); + $this->admin_id = self::factory()->user->create( [ 'role' => 'administrator' ] ); + $this->subscriber_id = self::factory()->user->create( [ 'role' => 'subscriber' ] ); + } + + protected function tearDown(): void { + wp_set_current_user( 0 ); + wp_delete_user( $this->admin_id ); + wp_delete_user( $this->subscriber_id ); + $GLOBALS['current_screen'] = null; + parent::tearDown(); + } + + /** + * Invoke a protected method on the detector via reflection. + * + * Mirrors the pattern in test-editor-nudge.php — keeps the + * public surface of the class small while still letting us + * exercise the pure transforms in isolation. + * + * @param string $method Method name. + * @param array $args Positional arguments to pass. + * @return mixed Method return value. + */ + protected function call_protected( $method, array $args = [] ) { + $ref = new \ReflectionMethod( Html_Form_Detector::class, $method ); + $ref->setAccessible( true ); + return $ref->invokeArgs( $this->detector, $args ); + } + + /** + * Force a block-editor screen so allow_load() can clear its + * screen-related guard. + */ + protected function force_block_editor_screen( $post_type = 'page' ) { + $screen = \WP_Screen::get( $post_type ); + $screen->id = $post_type; + $screen->post_type = $post_type; + $screen->is_block_editor( true ); + set_current_screen( $screen ); + } + + public function test_allow_load() { + // Non-admin context: false. + $this->assertFalse( $this->detector->allow_load() ); + + // Admin user but non-block-editor screen: false. + wp_set_current_user( $this->admin_id ); + set_current_screen( 'dashboard' ); + $this->assertFalse( $this->detector->allow_load() ); + + // Admin + block editor on a regular post type: true. + $this->force_block_editor_screen( 'page' ); + $this->assertTrue( $this->detector->allow_load() ); + + // Admin + block editor on the SureForms CPT: false (we never + // want to convert from inside the form editor itself). + $this->force_block_editor_screen( SRFM_FORMS_POST_TYPE ); + $this->assertFalse( $this->detector->allow_load() ); + + // Subscriber cap fails the manage_options gate. + wp_set_current_user( $this->subscriber_id ); + $this->force_block_editor_screen( 'page' ); + $this->assertFalse( $this->detector->allow_load() ); + } + + public function test_enqueue_scripts() { + // Without admin context, the script handle must not be enqueued. + $this->detector->enqueue_scripts(); + $this->assertFalse( wp_script_is( SRFM_SLUG . '-html-form-detector', 'enqueued' ) ); + + // With allow_load() passing, the handle should be enqueued. + wp_set_current_user( $this->admin_id ); + $this->force_block_editor_screen( 'page' ); + $this->detector->enqueue_scripts(); + $this->assertTrue( wp_script_is( SRFM_SLUG . '-html-form-detector', 'enqueued' ) ); + } + + public function test_register_rest_endpoint() { + $endpoints = $this->detector->register_rest_endpoint( [] ); + $this->assertArrayHasKey( 'convert-html-form', $endpoints ); + + $args = $endpoints['convert-html-form']['args']; + $this->assertSame( 'array', $args['parsed_fields']['type'] ); + $this->assertSame( 'object', $args['styling']['type'] ); + $this->assertSame( 'string', $args['html']['type'] ); + + // Existing routes are preserved (additive contract). + $existing = [ 'foo' => [ 'methods' => 'GET' ] ]; + $endpoints = $this->detector->register_rest_endpoint( $existing ); + $this->assertArrayHasKey( 'foo', $endpoints ); + $this->assertArrayHasKey( 'convert-html-form', $endpoints ); + + // Non-array input is normalised to an array (defensive contract). + $endpoints = $this->detector->register_rest_endpoint( 'not-an-array' ); + $this->assertIsArray( $endpoints ); + $this->assertArrayHasKey( 'convert-html-form', $endpoints ); + } + + public function test_handle_convert_html_form() { + wp_set_current_user( $this->admin_id ); + + $request = new \WP_REST_Request( 'POST', '/sureforms/v1/convert-html-form' ); + $request->set_header( 'X-WP-Nonce', wp_create_nonce( 'wp_rest' ) ); + $request->set_param( 'form_title', 'Test contact form' ); + $request->set_param( + 'parsed_fields', + [ + [ 'label' => 'Name', 'fieldType' => 'input', 'required' => true ], + [ 'label' => 'Email', 'fieldType' => 'email', 'required' => true ], + ] + ); + $request->set_param( 'submit_text', 'Send' ); + $request->set_param( 'styling', [ 'textColor' => '#111111' ] ); + $request->set_param( 'confidence', 'high' ); + + $result = $this->detector->handle_convert_html_form( $request ); + + $this->assertIsArray( $result ); + $this->assertArrayHasKey( 'form_id', $result ); + $this->assertArrayHasKey( 'shortcode', $result ); + $this->assertGreaterThan( 0, $result['form_id'] ); + $this->assertSame( false, $result['used_ai'] ); + + // Cleanup the created form. + wp_delete_post( (int) $result['form_id'], true ); + } + + public function test_handle_convert_html_form_rejects_missing_nonce() { + wp_set_current_user( $this->admin_id ); + + $request = new \WP_REST_Request( 'POST', '/sureforms/v1/convert-html-form' ); + $request->set_param( + 'parsed_fields', + [ [ 'label' => 'Name', 'fieldType' => 'input', 'required' => true ] ] + ); + + $result = $this->detector->handle_convert_html_form( $request ); + $this->assertInstanceOf( \WP_Error::class, $result ); + $this->assertSame( 'srfm_html_convert_nonce_failed', $result->get_error_code() ); + } + + public function test_handle_convert_html_form_rejects_subscriber_with_forbidden() { + // Locks in the capability-before-nonce order. A subscriber + // (who can hold a valid `wp_rest` nonce — every logged-in + // user gets one via `apiFetch`) must be bounced on the cap + // check, not the nonce check, so a future loosening of + // `current_user_can` cannot promote them to a 'nonce_failed' + // 403 that might be retried with a fresh nonce. + wp_set_current_user( $this->subscriber_id ); + + $request = new \WP_REST_Request( 'POST', '/sureforms/v1/convert-html-form' ); + $request->add_header( 'X-WP-Nonce', wp_create_nonce( 'wp_rest' ) ); + $request->set_param( + 'parsed_fields', + [ [ 'label' => 'Name', 'fieldType' => 'input', 'required' => true ] ] + ); + + $result = $this->detector->handle_convert_html_form( $request ); + $this->assertInstanceOf( \WP_Error::class, $result ); + $this->assertSame( 'srfm_html_convert_forbidden', $result->get_error_code() ); + } + + public function test_apply_native_card_styling() { + $form_id = self::factory()->post->create( [ 'post_type' => SRFM_FORMS_POST_TYPE ] ); + + $this->call_protected( + 'apply_native_card_styling', + [ + $form_id, + [ + 'formBackgroundColor' => '#fff8e7', + 'formPadding' => '24px', + 'formBorderRadius' => '12px', + ], + ] + ); + + $styling = get_post_meta( $form_id, '_srfm_forms_styling', true ); + $this->assertSame( 'color', $styling['bg_type'] ); + $this->assertSame( '#fff8e7', $styling['bg_color'] ); + $this->assertSame( 24.0, $styling['form_padding_top'] ); + $this->assertSame( 12.0, $styling['form_border_radius_top'] ); + $this->assertSame( 'px', $styling['form_padding_unit'] ); + $this->assertTrue( $styling['form_padding_link'] ); + + // Empty styling: meta stays untouched. + $other_form = self::factory()->post->create( [ 'post_type' => SRFM_FORMS_POST_TYPE ] ); + $this->call_protected( 'apply_native_card_styling', [ $other_form, [] ] ); + $this->assertSame( '', get_post_meta( $other_form, '_srfm_forms_styling', true ) ); + + wp_delete_post( $form_id, true ); + wp_delete_post( $other_form, true ); + } + + public function test_shorthand_to_sides() { + // Single value applies to all four sides + `link` is true. + $result = $this->call_protected( 'shorthand_to_sides', [ '24px' ] ); + $this->assertSame( + [ + 'top' => 24.0, + 'right' => 24.0, + 'bottom' => 24.0, + 'left' => 24.0, + 'unit' => 'px', + 'link' => true, + ], + $result + ); + + // Two values → vertical / horizontal. + $result = $this->call_protected( 'shorthand_to_sides', [ '12px 16px' ] ); + $this->assertSame( 12.0, $result['top'] ); + $this->assertSame( 16.0, $result['right'] ); + $this->assertSame( 12.0, $result['bottom'] ); + $this->assertSame( 16.0, $result['left'] ); + $this->assertFalse( $result['link'] ); + + // Three values → top, horizontal, bottom. + $result = $this->call_protected( 'shorthand_to_sides', [ '5px 10px 15px' ] ); + $this->assertSame( 5.0, $result['top'] ); + $this->assertSame( 10.0, $result['right'] ); + $this->assertSame( 15.0, $result['bottom'] ); + $this->assertSame( 10.0, $result['left'] ); + + // Four values → fully specified. + $result = $this->call_protected( 'shorthand_to_sides', [ '1rem 2rem 3rem 4rem' ] ); + $this->assertSame( 'rem', $result['unit'] ); + $this->assertSame( 1.0, $result['top'] ); + $this->assertSame( 4.0, $result['left'] ); + + // Disallowed unit rejected → null. + $this->assertNull( $this->call_protected( 'shorthand_to_sides', [ '10vh' ] ) ); + + // Garbage input rejected. + $this->assertNull( $this->call_protected( 'shorthand_to_sides', [ 'calc(100% - 20px)' ] ) ); + $this->assertNull( $this->call_protected( 'shorthand_to_sides', [ '' ] ) ); + $this->assertNull( $this->call_protected( 'shorthand_to_sides', [ null ] ) ); + + // Five+ tokens are too many — bail. + $this->assertNull( $this->call_protected( 'shorthand_to_sides', [ '1px 2px 3px 4px 5px' ] ) ); + } + + public function test_extract_fields_via_ai() { + // The middleware is unreachable in unit tests; the method must + // surface a WP_Error rather than throwing or returning garbage. + $result = $this->call_protected( 'extract_fields_via_ai', [ '<form><input type="text"/></form>' ] ); + $this->assertInstanceOf( \WP_Error::class, $result ); + } + + public function test_scrub_html_for_ai() { + $html = '<form action="/internal/submit" method="post">' + . '<!-- INTERNAL_API_KEY=sk-live-abc123 do-not-leak -->' + . '<input type="hidden" name="csrf" value="secret-token-123"/>' + . '<input type="text" name="email" value="prefilled@example.com" required/>' + . '<textarea name="draft">half-written reply containing pii@example.com</textarea>' + . '<script>const API_TOKEN = "leak-me-please";</script>' + . '<button type="submit">Send</button>' + . '</form>'; + + $scrubbed = $this->call_protected( 'scrub_html_for_ai', [ $html ] ); + + // Hidden input gone. + $this->assertStringNotContainsString( 'type="hidden"', $scrubbed ); + $this->assertStringNotContainsString( 'secret-token-123', $scrubbed ); + + // Pre-filled value gone, but the structural element survives. + $this->assertStringNotContainsString( 'prefilled@example.com', $scrubbed ); + $this->assertStringContainsString( 'name="email"', $scrubbed ); + + // `required` boolean attribute is preserved (no `value=` to strip). + $this->assertStringContainsString( 'required', $scrubbed ); + + // `action` attribute is gone. + $this->assertStringNotContainsString( '/internal/submit', $scrubbed ); + + // HTML comments are stripped — they routinely host staging + // notes / build hashes / API keys that have no business going + // to the conversion middleware. + $this->assertStringNotContainsString( 'INTERNAL_API_KEY', $scrubbed ); + $this->assertStringNotContainsString( 'do-not-leak', $scrubbed ); + + // Textarea body is emptied so pre-filled drafts (often PII, + // CSRF tokens, or server-rendered defaults) do not leave the + // site. The opening/closing tags survive so the model still + // sees a `<textarea>` at this position. + $this->assertStringNotContainsString( 'half-written reply', $scrubbed ); + $this->assertStringNotContainsString( 'pii@example.com', $scrubbed ); + $this->assertMatchesRegularExpression( '#<textarea[^>]*>\s*</textarea>#', $scrubbed ); + + // `<script>` body is emptied for the same reason — inline + // tokens or endpoint config must not be forwarded. + $this->assertStringNotContainsString( 'API_TOKEN', $scrubbed ); + $this->assertStringNotContainsString( 'leak-me-please', $scrubbed ); + $this->assertMatchesRegularExpression( '#<script[^>]*>\s*</script>#', $scrubbed ); + + // Non-string input collapses to empty string defensively. + $this->assertSame( '', $this->call_protected( 'scrub_html_for_ai', [ null ] ) ); + } + + public function test_build_form_metadata() { + $meta = $this->call_protected( + 'build_form_metadata', + [ + 'Submit Now', + [ + 'textColor' => '#111111', + 'primaryColor' => '#c2410c', + 'textColorOnPrimary' => '#ffffff', + ], + ] + ); + + $this->assertSame( 'Submit Now', $meta['general']['submitText'] ); + $this->assertFalse( $meta['instantForm']['showTitle'] ); + $this->assertSame( '#111111', $meta['formStyling']['textColor'] ); + $this->assertSame( '#c2410c', $meta['formStyling']['primaryColor'] ); + $this->assertSame( 'medium', $meta['formStyling']['fieldSpacing'] ); + + // Empty submit text omits the general slice. + $meta = $this->call_protected( 'build_form_metadata', [ '', [] ] ); + $this->assertArrayNotHasKey( 'general', $meta ); + + // Falsy / invalid hex falls back to the safe default. + $meta = $this->call_protected( 'build_form_metadata', [ '', [ 'textColor' => 'not-a-hex' ] ] ); + $this->assertSame( '#1E1E1E', $meta['formStyling']['textColor'] ); + + // `formBackgroundColor` is intentionally NOT applied through + // `formMetaData` — the `Form_Metadata` trait only exposes the + // colors + field-spacing slice, so the background is routed + // through `apply_native_card_styling` to `_srfm_forms_styling` + // instead. Asserting it landed in `instantForm` would lock in + // a contract the method explicitly disclaims (see the comment + // at the bottom of `build_form_metadata`). That assertion is + // covered by `test_apply_native_card_styling` below. + $meta = $this->call_protected( 'build_form_metadata', [ '', [ 'formBackgroundColor' => '#abcdef' ] ] ); + $this->assertArrayNotHasKey( 'formBackgroundColor', $meta['instantForm'] ); + } + + public function test_pick_hex() { + $this->assertSame( '#abcdef', $this->call_protected( 'pick_hex', [ '#abcdef', '#000000' ] ) ); + $this->assertSame( '#000000', $this->call_protected( 'pick_hex', [ '', '#000000' ] ) ); + $this->assertSame( '#000000', $this->call_protected( 'pick_hex', [ 'not-a-hex', '#000000' ] ) ); + $this->assertSame( '#000000', $this->call_protected( 'pick_hex', [ null, '#000000' ] ) ); + } + + public function test_strip_internal_hints() { + $result = $this->call_protected( + 'strip_internal_hints', + [ + [ + [ + 'label' => 'Name', + 'fieldType' => 'input', + '_groupName' => 'group_a', + '_optionValue' => 'val', + '_groupLabel' => 'Group A', + 'confidence' => 'high', + ], + 'not-an-array-entry', + ], + ] + ); + + $this->assertCount( 1, $result ); + $this->assertSame( 'Name', $result[0]['label'] ); + $this->assertArrayNotHasKey( '_groupName', $result[0] ); + $this->assertArrayNotHasKey( '_optionValue', $result[0] ); + $this->assertArrayNotHasKey( '_groupLabel', $result[0] ); + $this->assertArrayNotHasKey( 'confidence', $result[0] ); + } + + public function test_strip_unsafe_html_in_fields() { + // Simulates a sloppy `srfm_html_form_detector_refine_fields` + // callback that re-introduces raw HTML in properties + // `Create_Form` does not know to sanitize. The defensive sweep + // must strip tags from every string leaf at any depth. + $result = $this->call_protected( + 'strip_unsafe_html_in_fields', + [ + [ + [ + 'label' => 'Name <script>alert(1)</script>', + 'fieldType' => 'input', + 'helpText' => 'Hint <img src=x onerror=alert(1)>', + 'fieldOptions' => [ + [ + 'label' => 'Yes <iframe src=//evil>', + 'value' => 'yes', + ], + [ + 'label' => 'No', + 'value' => 'no', + ], + ], + 'allowedFormats' => [ 'jpg<script>', 'png' ], + 'required' => true, + 'maxFiles' => 5, + ], + 'not-an-array-entry', + ], + ] + ); + + $this->assertCount( 1, $result ); + $this->assertSame( 'Name alert(1)', $result[0]['label'] ); + $this->assertSame( 'Hint ', $result[0]['helpText'] ); + $this->assertSame( 'Yes ', $result[0]['fieldOptions'][0]['label'] ); + $this->assertSame( 'yes', $result[0]['fieldOptions'][0]['value'] ); + $this->assertSame( 'No', $result[0]['fieldOptions'][1]['label'] ); + // Scalars survive. + $this->assertTrue( $result[0]['required'] ); + $this->assertSame( 5, $result[0]['maxFiles'] ); + // Nested array of strings — each leaf cleaned. + $this->assertSame( [ 'jpg', 'png' ], $result[0]['allowedFormats'] ); + } + + public function test_strip_form_for_preservation_kses_for_non_unfiltered() { + // Site admin without `unfiltered_html` (mirrors a multisite + // site admin) — `<script>` outside the form must be stripped. + $user_id = self::factory()->user->create( [ 'role' => 'editor' ] ); + wp_set_current_user( $user_id ); + + $html = '<div class="wrap"><h2>Free eBook</h2>' + . '<form><input type="email" name="email" required></form>' + . '<p>Thanks for signing up.</p>' + . '<script>alert("xss")</script>' + . '</div>'; + + $preserved = $this->call_protected( 'strip_form_for_preservation', [ $html ] ); + + $this->assertStringContainsString( '<h2>Free eBook</h2>', $preserved ); + $this->assertStringContainsString( 'Thanks for signing up', $preserved ); + $this->assertStringNotContainsString( '<form', $preserved ); + $this->assertStringNotContainsString( '<script', $preserved ); + $this->assertStringNotContainsString( 'alert("xss")', $preserved ); + + wp_delete_user( $user_id ); + } + + public function test_strip_form_for_preservation_preserves_form_only_block() { + // When the source block held only the `<form>` (no wrapper), + // the preserved markup must be empty so the caller can fall + // through to the historical one-block-for-one-block swap. + wp_set_current_user( $this->admin_id ); + + $html = '<form><input type="text" name="x"></form>'; + $preserved = $this->call_protected( 'strip_form_for_preservation', [ $html ] ); + + $this->assertSame( '', $preserved ); + } + + public function test_strip_form_for_preservation_empty_input() { + $this->assertSame( '', $this->call_protected( 'strip_form_for_preservation', [ '' ] ) ); + $this->assertSame( '', $this->call_protected( 'strip_form_for_preservation', [ null ] ) ); + } +} diff --git a/tests/unit/inc/global-settings/test-global-settings-defaults.php b/tests/unit/inc/global-settings/test-global-settings-defaults.php new file mode 100644 index 000000000..b7031ca9e --- /dev/null +++ b/tests/unit/inc/global-settings/test-global-settings-defaults.php @@ -0,0 +1,310 @@ +<?php +/** + * Class Test_Global_Settings_Defaults + * + * @package sureforms + */ + +use Yoast\PHPUnitPolyfills\TestCases\TestCase; +use SRFM\Inc\Global_Settings\Global_Settings_Defaults; + +class Test_Global_Settings_Defaults extends TestCase { + + /** + * @var Global_Settings_Defaults + */ + protected $defaults; + + protected function setUp(): void { + // The class registers its `default_post_metadata` filter in the + // constructor. We use the singleton to make sure the filter is + // already wired up when these tests fire `get_post_meta`. + $this->defaults = Global_Settings_Defaults::get_instance(); + } + + protected function tearDown(): void { + // Clean up any forms created during tests. + $forms = get_posts( + [ + 'post_type' => 'sureforms_form', + 'numberposts' => -1, + 'post_status' => 'any', + 'fields' => 'ids', + ] + ); + foreach ( $forms as $form_id ) { + wp_delete_post( $form_id, true ); + } + + delete_option( 'srfm_email_notification_settings_options' ); + delete_option( 'srfm_form_confirmation_settings_options' ); + delete_option( 'srfm_compliance_settings_options' ); + delete_option( 'srfm_form_restriction_settings_options' ); + } + + /** + * Test get_global_defaults_as_form_meta returns an empty array when no global settings are configured. + */ + public function test_get_global_defaults_as_form_meta_empty_when_no_settings() { + $meta = Global_Settings_Defaults::get_global_defaults_as_form_meta(); + + $this->assertIsArray( $meta ); + $this->assertEmpty( $meta ); + } + + /** + * Test get_global_defaults_as_form_meta returns mapped form meta for configured global settings. + */ + public function test_get_global_defaults_as_form_meta() { + update_option( + 'srfm_email_notification_settings_options', + [ + 'email_to' => 'test@example.com', + 'subject' => 'Test Subject', + 'email_body' => '{all_data}', + 'from_name' => 'Test Site', + 'from_email' => 'noreply@example.com', + 'email_cc' => '', + 'email_bcc' => '', + 'email_reply_to' => '', + ] + ); + + update_option( + 'srfm_compliance_settings_options', + [ + 'gdpr' => true, + 'do_not_store_entries' => false, + 'auto_delete_entries' => false, + 'auto_delete_days' => 30, + ] + ); + + update_option( + 'srfm_form_confirmation_settings_options', + [ + 'confirmation_type' => 'same page', + 'message' => 'Thanks!', + 'submission_action' => 'hide form', + ] + ); + + update_option( + 'srfm_form_restriction_settings_options', + [ + 'max_entries' => [ + 'status' => true, + 'maxEntries' => 10, + 'message' => 'Closed.', + ], + ] + ); + + $meta = Global_Settings_Defaults::get_global_defaults_as_form_meta(); + + // Email notification meta shape. + $this->assertArrayHasKey( '_srfm_email_notification', $meta ); + $this->assertIsArray( $meta['_srfm_email_notification'] ); + $this->assertSame( 'test@example.com', $meta['_srfm_email_notification'][0]['email_to'] ); + + // Compliance meta shape. + $this->assertArrayHasKey( '_srfm_compliance', $meta ); + $this->assertIsArray( $meta['_srfm_compliance'] ); + $this->assertTrue( $meta['_srfm_compliance'][0]['gdpr'] ); + + // Form confirmation meta shape. + $this->assertArrayHasKey( '_srfm_form_confirmation', $meta ); + $this->assertIsArray( $meta['_srfm_form_confirmation'] ); + $this->assertSame( 'same page', $meta['_srfm_form_confirmation'][0]['confirmation_type'] ); + + // Form restriction is stored as a JSON string. + $this->assertArrayHasKey( '_srfm_form_restriction', $meta ); + $this->assertIsString( $meta['_srfm_form_restriction'] ); + $decoded = json_decode( $meta['_srfm_form_restriction'], true ); + $this->assertIsArray( $decoded ); + $this->assertSame( 10, $decoded['maxEntries'] ); + } + + /** + * Test inject_global_defaults returns the configured global compliance value + * when no row exists for the form yet (live-link inheritance). + * + * Calls get_post_meta directly so the WP metadata filter chain runs end-to-end — + * this is the same path the editor REST and the frontend submit use. + */ + public function test_inject_global_defaults() { + update_option( + 'srfm_compliance_settings_options', + [ + 'gdpr' => true, + 'do_not_store_entries' => false, + 'auto_delete_entries' => true, + 'auto_delete_days' => 60, + ] + ); + + $form_id = wp_insert_post( + [ + 'post_type' => 'sureforms_form', + 'post_status' => 'draft', + 'post_title' => 'Inheriting Form', + ] + ); + + // $single = true → frontend submit path. Filter must return the + // JSON-friendly value directly (an array of meta-shape entries). + $compliance_single = get_post_meta( $form_id, '_srfm_compliance', true ); + $this->assertIsArray( $compliance_single, 'Expected compliance defaults injected for inheriting form.' ); + $this->assertSame( true, $compliance_single[0]['gdpr'] ); + $this->assertSame( true, $compliance_single[0]['auto_delete_entries'] ); + $this->assertSame( '60', $compliance_single[0]['auto_delete_days'] ); + + // $single = false → REST path. Filter must wrap the return in an + // outer array so $all_values[0] in WP's REST meta handler matches + // the schema (otherwise the editor renders an empty list). + $compliance_all = get_post_meta( $form_id, '_srfm_compliance', false ); + $this->assertIsArray( $compliance_all ); + $this->assertCount( 1, $compliance_all ); + $this->assertIsArray( $compliance_all[0] ); + $this->assertSame( true, $compliance_all[0][0]['gdpr'] ); + } + + /** + * Inheritance must stop firing the moment a real meta row exists. Detach-on-edit + * falls out of "row exists or not" — once the user saves, the form is detached + * and subsequent global changes do not bleed in. + */ + public function test_inject_global_defaults_detaches_when_row_exists() { + update_option( + 'srfm_compliance_settings_options', + [ + 'gdpr' => true, + 'do_not_store_entries' => false, + 'auto_delete_entries' => false, + 'auto_delete_days' => 30, + ] + ); + + $form_id = wp_insert_post( + [ + 'post_type' => 'sureforms_form', + 'post_status' => 'draft', + 'post_title' => 'Detached Form', + ] + ); + + // Simulate the user having saved a customised compliance row. + $customised = [ + [ + 'id' => 'gdpr', + 'gdpr' => false, + 'do_not_store_entries' => true, + 'auto_delete_entries' => false, + 'auto_delete_days' => '7', + ], + ]; + update_post_meta( $form_id, '_srfm_compliance', $customised ); + + // Now flip the global to something different — the form must NOT + // pick up the change because a row exists in postmeta. + update_option( + 'srfm_compliance_settings_options', + [ + 'gdpr' => true, + 'do_not_store_entries' => false, + 'auto_delete_entries' => true, + 'auto_delete_days' => 90, + ] + ); + + $compliance = get_post_meta( $form_id, '_srfm_compliance', true ); + $this->assertIsArray( $compliance ); + $this->assertSame( false, $compliance[0]['gdpr'] ); + $this->assertSame( true, $compliance[0]['do_not_store_entries'] ); + $this->assertSame( '7', $compliance[0]['auto_delete_days'] ); + } + + /** + * Form Restriction is stored as a JSON-encoded string (register_meta type + * 'string'), unlike the other three groups which are array-typed. Confirm + * the filter matches that shape so both the REST schema and the frontend + * decode path stay consistent. + */ + public function test_inject_global_defaults_form_restriction_returns_json_string() { + update_option( + 'srfm_form_restriction_settings_options', + [ + 'max_entries' => [ + 'status' => true, + 'maxEntries' => 25, + 'message' => 'No more entries please.', + ], + ] + ); + + $form_id = wp_insert_post( + [ + 'post_type' => 'sureforms_form', + 'post_status' => 'draft', + 'post_title' => 'Restriction Form', + ] + ); + + $restriction_single = get_post_meta( $form_id, '_srfm_form_restriction', true ); + $this->assertIsString( $restriction_single ); + + $decoded = json_decode( $restriction_single, true ); + $this->assertIsArray( $decoded ); + $this->assertTrue( $decoded['status'] ); + $this->assertSame( 25, $decoded['maxEntries'] ); + $this->assertSame( 'No more entries please.', $decoded['message'] ); + } + + /** + * When the admin has not configured a global for a group, the filter must + * return $value unchanged so the hardcoded register_post_meta default still + * applies — we never want to spoof a "configured" state on top of an empty + * option. + */ + public function test_inject_global_defaults_passthrough_when_global_unset() { + // No options configured. + $form_id = wp_insert_post( + [ + 'post_type' => 'sureforms_form', + 'post_status' => 'draft', + 'post_title' => 'No Global Form', + ] + ); + + $result = $this->defaults->inject_global_defaults( 'sentinel-value', $form_id, '_srfm_compliance', true ); + $this->assertSame( 'sentinel-value', $result ); + } + + /** + * The filter must only fire on sureforms_form posts. A regular post asking + * for the same meta key (an unlikely but possible collision) should fall + * through unchanged. + */ + public function test_inject_global_defaults_skips_non_sureforms_posts() { + update_option( + 'srfm_compliance_settings_options', + [ + 'gdpr' => true, + 'do_not_store_entries' => false, + 'auto_delete_entries' => false, + 'auto_delete_days' => 30, + ] + ); + + $post_id = wp_insert_post( + [ + 'post_type' => 'post', + 'post_status' => 'draft', + 'post_title' => 'Regular Post', + ] + ); + + $result = $this->defaults->inject_global_defaults( 'untouched', $post_id, '_srfm_compliance', true ); + $this->assertSame( 'untouched', $result ); + } +} diff --git a/tests/unit/inc/global-settings/test-global-settings.php b/tests/unit/inc/global-settings/test-global-settings.php index 7dce3e8b8..a7e467c15 100644 --- a/tests/unit/inc/global-settings/test-global-settings.php +++ b/tests/unit/inc/global-settings/test-global-settings.php @@ -77,32 +77,6 @@ public function test_srfm_save_mcp_settings() { $this->assertTrue( $grouped['srfm_mcp_server'] ); } - /** - * Test saving global settings via the public srfm_save_global_settings method. - */ - public function test_srfm_save_global_settings() { - $setting_options = [ - 'srfm_ip_log' => true, - 'srfm_form_analytics' => false, - 'srfm_bsf_analytics' => true, - 'srfm_admin_notification' => true, - ]; - - $reflection = new ReflectionClass( Global_Settings::class ); - $method = $reflection->getMethod( 'srfm_save_general_settings' ); - $method->setAccessible( true ); - - $result = $method->invoke( null, $setting_options ); - $this->assertTrue( $result ); - - // Verify the general settings option was saved. - $saved = get_option( 'srfm_general_settings_options' ); - $this->assertIsArray( $saved ); - $this->assertTrue( $saved['srfm_ip_log'] ); - $this->assertFalse( $saved['srfm_form_analytics'] ); - $this->assertTrue( $saved['srfm_admin_notification'] ); - } - /** * Test saving payments settings returns true for non-stripe gateway. */ @@ -185,4 +159,201 @@ public function test_srfm_save_email_summary_settings() { $this->assertStringNotContainsString( "\n", $saved['srfm_email_sent_to'] ); } + /** + * Test srfm_save_form_restriction_settings saves and sanitizes correctly. + */ + public function test_srfm_save_form_restriction_settings() { + $options = [ + 'max_entries' => [ + 'status' => true, + 'maxEntries' => '50', + 'message' => 'Form closed.', + ], + 'ip_restriction' => [ + 'status' => false, + 'mode' => 'allow', + 'ips' => '192.168.1.1', + ], + 'country_restriction' => [ + 'status' => false, + ], + 'keyword_restriction' => [ + 'status' => false, + ], + ]; + + $result = Global_Settings::srfm_save_form_restriction_settings( $options ); + $this->assertTrue( $result ); + + $saved = get_option( 'srfm_form_restriction_settings_options' ); + $this->assertTrue( $saved['max_entries']['status'] ); + $this->assertSame( 50, $saved['max_entries']['maxEntries'] ); + $this->assertSame( 'allow', $saved['ip_restriction']['mode'] ); + } + + /** + * Test srfm_save_compliance_settings saves correctly. + */ + public function test_srfm_save_compliance_settings() { + $options = [ + 'gdpr' => true, + 'do_not_store_entries' => false, + 'auto_delete_entries' => true, + 'auto_delete_days' => '60', + ]; + + $result = Global_Settings::srfm_save_compliance_settings( $options ); + $this->assertTrue( $result ); + + $saved = get_option( 'srfm_compliance_settings_options' ); + $this->assertTrue( $saved['gdpr'] ); + $this->assertFalse( $saved['do_not_store_entries'] ); + $this->assertSame( 60, $saved['auto_delete_days'] ); + } + + /** + * Test get_default_compliance_settings returns expected structure. + */ + public function test_get_default_compliance_settings() { + $defaults = Global_Settings::get_default_compliance_settings(); + $this->assertIsArray( $defaults ); + $this->assertArrayHasKey( 'gdpr', $defaults ); + $this->assertArrayHasKey( 'do_not_store_entries', $defaults ); + $this->assertArrayHasKey( 'auto_delete_entries', $defaults ); + $this->assertArrayHasKey( 'auto_delete_days', $defaults ); + $this->assertFalse( $defaults['gdpr'] ); + $this->assertSame( 30, $defaults['auto_delete_days'] ); + } + + /** + * Test srfm_save_form_confirmation_settings saves and validates types. + */ + public function test_srfm_save_form_confirmation_settings() { + $options = [ + 'confirmation_type' => 'same page', + 'message' => '<p>Thank you!</p>', + 'submission_action' => 'hide form', + 'page_url' => 'https://example.com/thanks', + 'custom_url' => '', + ]; + + $result = Global_Settings::srfm_save_form_confirmation_settings( $options ); + $this->assertTrue( $result ); + + $saved = get_option( 'srfm_form_confirmation_settings_options' ); + $this->assertSame( 'same page', $saved['confirmation_type'] ); + $this->assertStringContainsString( 'Thank you!', $saved['message'] ); + + // Invalid confirmation type falls back to default. + Global_Settings::srfm_save_form_confirmation_settings( [ 'confirmation_type' => 'invalid' ] ); + $saved = get_option( 'srfm_form_confirmation_settings_options' ); + $this->assertSame( 'same page', $saved['confirmation_type'] ); + } + + /** + * Test get_default_confirmation_message returns non-empty HTML. + */ + public function test_get_default_confirmation_message() { + $message = Global_Settings::get_default_confirmation_message(); + $this->assertIsString( $message ); + $this->assertNotEmpty( $message ); + $this->assertStringContainsString( 'Thank you', $message ); + } + + /** + * Test get_default_form_confirmation_settings returns expected structure. + */ + public function test_get_default_form_confirmation_settings() { + $defaults = Global_Settings::get_default_form_confirmation_settings(); + $this->assertIsArray( $defaults ); + $this->assertArrayHasKey( 'confirmation_type', $defaults ); + $this->assertArrayHasKey( 'message', $defaults ); + $this->assertArrayHasKey( 'submission_action', $defaults ); + $this->assertSame( 'same page', $defaults['confirmation_type'] ); + $this->assertSame( 'hide form', $defaults['submission_action'] ); + } + + /** + * Test srfm_save_email_notification_settings saves and sanitizes. + */ + public function test_srfm_save_email_notification_settings() { + $options = [ + 'email_to' => 'admin@example.com', + 'subject' => 'New Submission', + 'email_body' => '<p>Hello</p>', + 'from_name' => '{site_title}', + 'from_email' => '{admin_email}', + 'email_cc' => '', + 'email_bcc' => '', + 'email_reply_to' => '', + ]; + + $result = Global_Settings::srfm_save_email_notification_settings( $options ); + $this->assertTrue( $result ); + + $saved = get_option( 'srfm_email_notification_settings_options' ); + $this->assertSame( 'admin@example.com', $saved['email_to'] ); + $this->assertSame( 'New Submission', $saved['subject'] ); + } + + /** + * Test get_default_email_notification_settings returns expected structure. + */ + public function test_get_default_email_notification_settings() { + $defaults = Global_Settings::get_default_email_notification_settings(); + $this->assertIsArray( $defaults ); + $this->assertArrayHasKey( 'email_to', $defaults ); + $this->assertArrayHasKey( 'subject', $defaults ); + $this->assertArrayHasKey( 'email_body', $defaults ); + $this->assertSame( '{admin_email}', $defaults['email_to'] ); + $this->assertSame( '{all_data}', $defaults['email_body'] ); + } + + /** + * Test get_default_form_restriction_settings returns expected structure. + */ + public function test_get_default_form_restriction_settings() { + $defaults = Global_Settings::get_default_form_restriction_settings(); + $this->assertIsArray( $defaults ); + $this->assertArrayHasKey( 'max_entries', $defaults ); + $this->assertArrayHasKey( 'ip_restriction', $defaults ); + $this->assertArrayHasKey( 'country_restriction', $defaults ); + $this->assertArrayHasKey( 'keyword_restriction', $defaults ); + $this->assertFalse( $defaults['max_entries']['status'] ); + } + + /** + * Test srfm_save_global_settings dispatches to correct handler. + */ + public function test_srfm_save_global_settings() { + $request = new WP_REST_Request( 'POST' ); + $request->set_header( 'X-WP-Nonce', wp_create_nonce( 'wp_rest' ) ); + $request->set_param( 'srfm_tab', 'compliance-settings' ); + $request->set_param( 'gdpr', true ); + + $response = Global_Settings::srfm_save_global_settings( $request ); + $this->assertInstanceOf( WP_REST_Response::class, $response ); + + $saved = get_option( 'srfm_compliance_settings_options' ); + $this->assertTrue( $saved['gdpr'] ); + } + + /** + * Test srfm_save_security_settings saves captcha keys. + */ + public function test_srfm_save_security_settings() { + $options = [ + 'srfm_v2_checkbox_site_key' => 'test-site-key', + 'srfm_v2_checkbox_secret_key' => 'test-secret-key', + 'srfm_honeypot' => true, + ]; + + $result = Global_Settings::srfm_save_security_settings( $options ); + $this->assertTrue( $result ); + + $saved = get_option( 'srfm_security_settings_options' ); + $this->assertSame( 'test-site-key', $saved['srfm_v2_checkbox_site_key'] ); + $this->assertTrue( $saved['srfm_honeypot'] ); + } + } diff --git a/tests/unit/inc/single-form-settings/test-form-settings-api.php b/tests/unit/inc/single-form-settings/test-form-settings-api.php new file mode 100644 index 000000000..bfab2f5f7 --- /dev/null +++ b/tests/unit/inc/single-form-settings/test-form-settings-api.php @@ -0,0 +1,256 @@ +<?php +/** + * Class Test_Form_Settings_Api + * + * @package sureforms + */ + +use Yoast\PHPUnitPolyfills\TestCases\TestCase; +use SRFM\Inc\Single_Form_Settings\Form_Settings_Api; + +/** + * Tests for `Form_Settings_Api`. Covers endpoint registration, the + * permission gate (nonce + capability), and the save round-trip + * (allowlist enforcement, non-form CPT rejection, and the sanitize + * round-trip via `get_post_meta`). + */ +class Test_Form_Settings_Api extends TestCase { + + /** + * @var Form_Settings_Api + */ + protected $api; + + /** + * @var int + */ + protected $form_id; + + /** + * @var int + */ + protected $admin_id; + + protected function setUp(): void { + parent::setUp(); + + if ( ! class_exists( Form_Settings_Api::class ) ) { + $this->markTestSkipped( 'Form_Settings_Api class not available.' ); + } + + $this->api = Form_Settings_Api::get_instance(); + + $this->admin_id = $this->factory()->user->create( + [ 'role' => 'administrator' ] + ); + wp_set_current_user( $this->admin_id ); + + $this->form_id = $this->factory()->post->create( + [ 'post_type' => defined( 'SRFM_FORMS_POST_TYPE' ) ? SRFM_FORMS_POST_TYPE : 'sureforms_form' ] + ); + } + + protected function tearDown(): void { + wp_delete_post( $this->form_id, true ); + wp_delete_user( $this->admin_id ); + parent::tearDown(); + } + + /** + * Build a request with an admin-valid nonce header. + * + * @param array $params Request params. + * @return WP_REST_Request + */ + private function build_request( array $params ): WP_REST_Request { + $request = new WP_REST_Request( 'POST', '/sureforms/v1/form-settings' ); + $request->set_header( 'X-WP-Nonce', wp_create_nonce( 'wp_rest' ) ); + foreach ( $params as $key => $value ) { + $request->set_param( $key, $value ); + } + return $request; + } + + /** + * `register_endpoint` should inject a `form-settings` entry with + * the expected route shape — POST method, our callbacks, and the + * two required arg validators. + */ + public function test_register_endpoint() { + $result = $this->api->register_endpoint( [] ); + + $this->assertArrayHasKey( 'form-settings', $result ); + + $endpoint = $result['form-settings']; + $this->assertSame( 'POST', $endpoint['methods'] ); + $this->assertSame( + [ $this->api, 'save_form_settings' ], + $endpoint['callback'] + ); + $this->assertSame( + [ $this->api, 'permission_check' ], + $endpoint['permission_callback'] + ); + + // Args. + $this->assertArrayHasKey( 'post_id', $endpoint['args'] ); + $this->assertTrue( $endpoint['args']['post_id']['required'] ); + $this->assertSame( 'integer', $endpoint['args']['post_id']['type'] ); + + $this->assertArrayHasKey( 'meta_data', $endpoint['args'] ); + $this->assertTrue( $endpoint['args']['meta_data']['required'] ); + $this->assertSame( 'object', $endpoint['args']['meta_data']['type'] ); + + // `post_id` validate_callback rejects 0 / non-numeric, accepts > 0. + $post_id_validator = $endpoint['args']['post_id']['validate_callback']; + $this->assertTrue( $post_id_validator( 1 ) ); + $this->assertFalse( (bool) $post_id_validator( 0 ) ); + $this->assertFalse( (bool) $post_id_validator( 'abc' ) ); + + // `meta_data` validate_callback rejects non-array / empty. + $meta_validator = $endpoint['args']['meta_data']['validate_callback']; + $this->assertTrue( $meta_validator( [ 'k' => 'v' ] ) ); + $this->assertFalse( (bool) $meta_validator( [] ) ); + $this->assertFalse( (bool) $meta_validator( 'not-an-array' ) ); + + // Preserves existing entries. + $result = $this->api->register_endpoint( [ 'other' => [ 'methods' => 'GET' ] ] ); + $this->assertArrayHasKey( 'other', $result ); + $this->assertArrayHasKey( 'form-settings', $result ); + } + + /** + * `permission_check` covers three branches: + * - invalid / missing nonce → WP_Error 403 + * - missing capability → WP_Error 403 + * - valid nonce + admin → true + */ + public function test_permission_check() { + // 1. Invalid nonce — explicit bad value. + $request = new WP_REST_Request( 'POST', '/sureforms/v1/form-settings' ); + $request->set_header( 'X-WP-Nonce', 'bogus-nonce' ); + $request->set_param( 'post_id', $this->form_id ); + $result = $this->api->permission_check( $request ); + $this->assertInstanceOf( WP_Error::class, $result ); + $this->assertSame( 'srfm_invalid_nonce', $result->get_error_code() ); + $this->assertSame( 403, $result->get_error_data()['status'] ); + + // 2. No capability — subscriber can't `edit_post` on a form CPT. + $subscriber_id = $this->factory()->user->create( [ 'role' => 'subscriber' ] ); + wp_set_current_user( $subscriber_id ); + $request = $this->build_request( [ 'post_id' => $this->form_id ] ); + $result = $this->api->permission_check( $request ); + $this->assertInstanceOf( WP_Error::class, $result ); + $this->assertSame( 'srfm_cannot_edit_post', $result->get_error_code() ); + $this->assertSame( 403, $result->get_error_data()['status'] ); + wp_delete_user( $subscriber_id ); + + // 3. Admin + valid nonce → true. + wp_set_current_user( $this->admin_id ); + $request = $this->build_request( [ 'post_id' => $this->form_id ] ); + $this->assertTrue( $this->api->permission_check( $request ) ); + + // 4. `post_id` = 0 (e.g. brand-new unsaved post) → cannot edit → 403. + $request = $this->build_request( [ 'post_id' => 0 ] ); + $result = $this->api->permission_check( $request ); + $this->assertInstanceOf( WP_Error::class, $result ); + $this->assertSame( 'srfm_cannot_edit_post', $result->get_error_code() ); + } + + /** + * `save_form_settings` covers: + * - non-existent / wrong CPT → WP_Error 404 + * - allowlisted keys persist via `update_post_meta` + * - non-allowlisted keys are skipped silently + * - response.meta echoes the persisted value (post-sanitize) + * - pro extension via `srfm_form_settings_allowed_meta_keys` filter + */ + public function test_save_form_settings() { + // 1. Wrong CPT → 404. + $plain_post_id = $this->factory()->post->create( [ 'post_type' => 'post' ] ); + $request = $this->build_request( + [ + 'post_id' => $plain_post_id, + 'meta_data' => [ '_srfm_form_confirmation' => 'value' ], + ] + ); + $result = $this->api->save_form_settings( $request ); + $this->assertInstanceOf( WP_Error::class, $result ); + $this->assertSame( 'srfm_invalid_form_id', $result->get_error_code() ); + $this->assertSame( 404, $result->get_error_data()['status'] ); + wp_delete_post( $plain_post_id, true ); + + // 2. Non-existent post id → 404. + $request = $this->build_request( + [ + 'post_id' => 999999, + 'meta_data' => [ '_srfm_form_confirmation' => 'value' ], + ] + ); + $result = $this->api->save_form_settings( $request ); + $this->assertInstanceOf( WP_Error::class, $result ); + $this->assertSame( 'srfm_invalid_form_id', $result->get_error_code() ); + + // 3. Allowlisted keys persist; rejected keys are silently skipped. + $payload = [ + '_srfm_form_confirmation' => 'allowed-value', + '_srfm_evil_key' => 'should-be-rejected', + ]; + $request = $this->build_request( + [ + 'post_id' => $this->form_id, + 'meta_data' => $payload, + ] + ); + $result = $this->api->save_form_settings( $request ); + $this->assertInstanceOf( WP_REST_Response::class, $result ); + $data = $result->get_data(); + $this->assertTrue( $data['success'] ); + $this->assertArrayHasKey( '_srfm_form_confirmation', $data['meta'] ); + $this->assertArrayNotHasKey( '_srfm_evil_key', $data['meta'] ); + $this->assertSame( + 'allowed-value', + get_post_meta( $this->form_id, '_srfm_form_confirmation', true ) + ); + $this->assertSame( + '', + get_post_meta( $this->form_id, '_srfm_evil_key', true ) + ); + + // 4. Pro-style allowlist extension via filter — a key added by + // the filter callback should be accepted on subsequent calls. + $filter = static function ( $keys ) { + $keys[] = '_srfm_test_pro_extension_key'; + return $keys; + }; + add_filter( 'srfm_form_settings_allowed_meta_keys', $filter ); + + $request = $this->build_request( + [ + 'post_id' => $this->form_id, + 'meta_data' => [ '_srfm_test_pro_extension_key' => 'pro-value' ], + ] + ); + $result = $this->api->save_form_settings( $request ); + $data = $result->get_data(); + $this->assertArrayHasKey( '_srfm_test_pro_extension_key', $data['meta'] ); + $this->assertSame( + 'pro-value', + get_post_meta( $this->form_id, '_srfm_test_pro_extension_key', true ) + ); + + remove_filter( 'srfm_form_settings_allowed_meta_keys', $filter ); + + // 5. Empty meta_data after sanitize_key drops empty keys → still + // returns a 200 response with an empty meta array. + $request = $this->build_request( + [ + 'post_id' => $this->form_id, + 'meta_data' => [ '' => 'orphan-empty-key' ], + ] + ); + $result = $this->api->save_form_settings( $request ); + $this->assertInstanceOf( WP_REST_Response::class, $result ); + $this->assertSame( [], $result->get_data()['meta'] ); + } +} diff --git a/tests/unit/inc/test-helper.php b/tests/unit/inc/test-helper.php index c57f699e3..40b572b74 100644 --- a/tests/unit/inc/test-helper.php +++ b/tests/unit/inc/test-helper.php @@ -2638,6 +2638,85 @@ public function test_get_visitor_ip_reads_x_real_ip() { $this->assertEquals( '198.51.100.25', Helper::get_visitor_ip() ); } + // --------------------------------------------------------------- + // SRFM-2709: get_sureforms_website_url() UTM behavior + // --------------------------------------------------------------- + + /** + * When the caller passes no UTM args, the helper must return a clean + * site URL with no UTM params added by us. Privacy-policy and other + * non-tracking callers depend on this. + */ + public function test_get_sureforms_website_url_no_utm_args_returns_clean_url() { + $url = Helper::get_sureforms_website_url( 'privacy-policy/' ); + + $this->assertStringContainsString( 'privacy-policy/', $url ); + $this->assertStringNotContainsString( 'utm_', $url ); + } + + /** + * When the caller passes a placement via utm_medium, the helper must + * fill in the deterministic source/campaign defaults so the final URL + * carries stable attribution even if BSF_UTM_Analytics has no referer + * recorded. + */ + public function test_get_sureforms_website_url_applies_deterministic_defaults_when_utm_medium_passed() { + $url = Helper::get_sureforms_website_url( 'pricing', [ 'utm_medium' => 'plugin-list' ] ); + $decoded = html_entity_decode( $url ); + $query = (string) wp_parse_url( $decoded, PHP_URL_QUERY ); + $args = []; + parse_str( $query, $args ); + + $this->assertSame( 'sureforms_plugin', $args['utm_source'] ?? null ); + $this->assertSame( 'plugin-list', $args['utm_medium'] ?? null ); + $this->assertSame( 'core_plugin', $args['utm_campaign'] ?? null ); + } + + /** + * Caller-provided UTM keys must override the deterministic defaults. + * Without this guarantee any caller wanting custom attribution would + * have its source silently flipped back to the default. + */ + public function test_get_sureforms_website_url_caller_keys_win_over_defaults() { + $url = Helper::get_sureforms_website_url( + 'pricing', + [ + 'utm_source' => 'custom_source', + 'utm_medium' => 'dashboard-widget', + ] + ); + $decoded = html_entity_decode( $url ); + $query = (string) wp_parse_url( $decoded, PHP_URL_QUERY ); + $args = []; + parse_str( $query, $args ); + + $this->assertSame( 'custom_source', $args['utm_source'] ?? null, 'Caller-provided utm_source must win over default.' ); + $this->assertSame( 'dashboard-widget', $args['utm_medium'] ?? null ); + $this->assertSame( 'core_plugin', $args['utm_campaign'] ?? null ); + } + + /** + * The returned URL must be sanitized via esc_url so it is safe to + * echo into href attributes without further escaping at every call site. + * esc_url replaces raw `&` separators with the encoded `&` / `&`. + */ + public function test_get_sureforms_website_url_returns_escaped_url() { + $url = Helper::get_sureforms_website_url( 'pricing', [ 'utm_medium' => 'plugin-list' ] ); + + $this->assertMatchesRegularExpression( '/(&|&)/', $url ); + } + + /** + * Non-array $utm_args (legacy callers) must be coerced to an empty + * array rather than triggering a fatal. + */ + public function test_get_sureforms_website_url_handles_non_array_utm_args() { + $url = Helper::get_sureforms_website_url( 'pricing', 'not-an-array' ); + + $this->assertStringContainsString( 'pricing', $url ); + $this->assertStringNotContainsString( 'utm_', $url ); + } + /** * Clear all IP-related $_SERVER variables for a clean test state. */ diff --git a/tests/unit/inc/test-post-types.php b/tests/unit/inc/test-post-types.php index eae7886cc..2e0f31fc8 100644 --- a/tests/unit/inc/test-post-types.php +++ b/tests/unit/inc/test-post-types.php @@ -28,6 +28,78 @@ public function test_sanitize_form_restriction_data() { $this->assertIsString( $result ); } + /** + * Test sureforms_normalize_meta_for_rest normalizes confirmation meta. + */ + public function test_sureforms_normalize_meta_for_rest() { + $post_types = new Post_Types(); + + $form_id = wp_insert_post( + [ + 'post_type' => 'sureforms_form', + 'post_status' => 'publish', + 'post_title' => 'Normalize Meta Test', + ] + ); + + // Store confirmation meta with missing boolean fields. + $confirmation = [ + [ + 'id' => 1, + 'confirmation_type' => 'same page', + 'message' => '<p>Thank you</p>', + ], + ]; + update_post_meta( $form_id, '_srfm_form_confirmation', $confirmation ); + + $post = get_post( $form_id ); + $response = new WP_REST_Response( [ 'meta' => [] ] ); + + $result = $post_types->sureforms_normalize_meta_for_rest( $response, $post ); + + $data = $result->get_data(); + $this->assertIsArray( $data['meta']['_srfm_form_confirmation'] ); + // Missing booleans should be normalized to false. + $this->assertFalse( $data['meta']['_srfm_form_confirmation'][0]['hide_copy'] ); + $this->assertFalse( $data['meta']['_srfm_form_confirmation'][0]['hide_download_all'] ); + + wp_delete_post( $form_id, true ); + } + + /** + * Test sureforms_normalize_meta_for_rest fixes broken SVG data URIs. + */ + public function test_sureforms_normalize_meta_for_rest_fixes_svg_data_uri() { + $post_types = new Post_Types(); + + $form_id = wp_insert_post( + [ + 'post_type' => 'sureforms_form', + 'post_status' => 'publish', + 'post_title' => 'SVG URI Test', + ] + ); + + // Simulate DOMDocument stripping 'data:' prefix. + $confirmation = [ + [ + 'id' => 1, + 'message' => '<img src="image/svg+xml;base64,abc123" />', + ], + ]; + update_post_meta( $form_id, '_srfm_form_confirmation', $confirmation ); + + $post = get_post( $form_id ); + $response = new WP_REST_Response( [ 'meta' => [] ] ); + + $result = $post_types->sureforms_normalize_meta_for_rest( $response, $post ); + + $data = $result->get_data(); + $this->assertStringContainsString( 'data:image/svg+xml;base64', $data['meta']['_srfm_form_confirmation'][0]['message'] ); + + wp_delete_post( $form_id, true ); + } + public function test_register_post_types() { if ( ! defined( 'SRFM_FORMS_POST_TYPE' ) ) { $this->markTestSkipped( 'SRFM_FORMS_POST_TYPE not defined' ); diff --git a/webpack.config.js b/webpack.config.js index ca5c6f063..d9e181ada 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -90,11 +90,16 @@ module.exports = { suremail: path.resolve( __dirname, 'src/admin/SureMail.js' ), quizEmptyState: path.resolve( __dirname, 'src/admin/QuizEmptyState.js' ), surveyEmptyState: path.resolve( __dirname, 'src/admin/SurveyEmptyState.js' ), + partialEntriesEmptyState: path.resolve( __dirname, 'src/admin/PartialEntriesEmptyState.js' ), blocks: path.resolve( __dirname, 'src/blocks/blocks.js' ), editorNudge: path.resolve( __dirname, 'src/admin/editor-nudge/index.js' ), + htmlFormDetector: path.resolve( + __dirname, + 'src/admin/html-form-detector/index.js' + ), entries: path.resolve( __dirname, 'src/admin/entries/index.js' ), payments: path.resolve( __dirname, 'src/admin/payment/index.js' ), forms: path.resolve( __dirname, 'src/admin/forms/index.js' ), @@ -112,6 +117,7 @@ module.exports = { '@Attributes': path.resolve( __dirname, 'src/blocks-attributes/' ), '@Image': path.resolve( __dirname, 'images/' ), '@IncBlocks': path.resolve( __dirname, 'inc/blocks/' ), + '@Store': path.resolve( __dirname, 'src/store/' ), }, }, module: {