diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ceb6af2c..73932100d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format follows [Keep a Changelog] (https://keepachangelog.com/en/1.1.0/). - **"View details" shows a banner and the readme's tabs** (#1714). Description, Installation, FAQ, Screenshots and Other notes come from the offered release's `readme.txt`, and the changelog renders its Markdown instead of printing it raw. - **"View details" speaks Portuguese and opens screenshots in place** (#1716). The tabs and banner follow the viewer's language when the plugin ships a translation (`languages/readme-pt_BR.txt`), and a screenshot opens in an overlay with arrows, swipe and zoom instead of a new tab. - **Choice fields take one option per row, and every field can carry limits** (#1729). Options may contain commas; a choice field can shuffle its options per participant; a checkbox can cap how many are ticked; text and textarea take a minimum and maximum length (server ceilings 255 and 2,000) with a live counter; number and date take a range. The participant sees each limit, and the editor says what each type is for. +- **Quiz questions are scored per field** (#1730). Each field can be scored or left out; choices by correct option(s), a checkbox only on the exact set, or by points per option; text when answered; number and date by a correct range. "Show which answers were correct" now works. New tokens `{{correct_count}}` and `{{question_count}}`; existing forms score as before. ### Changed diff --git a/assets/css/ffc-admin-utilities.css b/assets/css/ffc-admin-utilities.css index 6eb8e360b..d143a2b91 100644 --- a/assets/css/ffc-admin-utilities.css +++ b/assets/css/ffc-admin-utilities.css @@ -54,13 +54,6 @@ SPACING UTILITIES ========================================================================== */ -/** - * Margin top utilities - */ -.ffc-mt-2xs { - margin-top: var(--ffc-spacing-2xs); -} - /** * Margin bottom utilities */ diff --git a/assets/css/ffc-admin-utilities.min.css b/assets/css/ffc-admin-utilities.min.css index bdc800464..3bde5b0bc 100644 --- a/assets/css/ffc-admin-utilities.min.css +++ b/assets/css/ffc-admin-utilities.min.css @@ -1,2 +1,2 @@ -.ffc-w100{width:100%}.ffc-mt-2xs{margin-top:var(--ffc-spacing-2xs)}.ffc-mb-2xs{margin-bottom:var(--ffc-spacing-2xs)}.ffc-mt-md{margin-top:var(--ffc-spacing-md)}.ffc-mt-xl{margin-top:var(--ffc-spacing-xl)}.ffc-mt-2xl{margin-top:var(--ffc-spacing-2xl)}.ffc-mb-xl{margin-bottom:var(--ffc-spacing-xl)}.ffc-mt-sm{margin-top:var(--ffc-spacing-sm)}.ffc-ml-xl{margin-left:var(--ffc-spacing-xl)}.ffc-inline{display:inline}.ffc-list-disc{list-style:disc;margin-left:var(--ffc-spacing-2xl)}.ffc-block-label{display:block;font-weight:600;margin-bottom:var(--ffc-spacing-2xs)}.ffc-input-small{width:80px}.ffc-input-readonly{color:var(--ffc-text);background-color:var(--ffc-bg-alt);cursor:not-allowed}.ffc-input-group{margin-bottom:var(--ffc-spacing-xl)}.ffc-admin-flex-row{display:flex;gap:var(--ffc-spacing-md);align-items:center}.ffc-flex-wrap{flex-wrap:wrap}.ffc-action-group{display:flex;gap:var(--ffc-spacing-xs)}.ffc-text-success{color:var(--ffc-success);font-weight:600}.ffc-text-error{color:var(--ffc-danger);font-weight:600}.ffc-text-info{color:var(--ffc-primary);font-weight:600}.ffc-text-warning{color:var(--ffc-warning-text);font-weight:600}.ffc-monospace{font-family:'SF Mono',Monaco,Consolas,monospace} +.ffc-w100{width:100%}.ffc-mb-2xs{margin-bottom:var(--ffc-spacing-2xs)}.ffc-mt-md{margin-top:var(--ffc-spacing-md)}.ffc-mt-xl{margin-top:var(--ffc-spacing-xl)}.ffc-mt-2xl{margin-top:var(--ffc-spacing-2xl)}.ffc-mb-xl{margin-bottom:var(--ffc-spacing-xl)}.ffc-mt-sm{margin-top:var(--ffc-spacing-sm)}.ffc-ml-xl{margin-left:var(--ffc-spacing-xl)}.ffc-inline{display:inline}.ffc-list-disc{list-style:disc;margin-left:var(--ffc-spacing-2xl)}.ffc-block-label{display:block;font-weight:600;margin-bottom:var(--ffc-spacing-2xs)}.ffc-input-small{width:80px}.ffc-input-readonly{color:var(--ffc-text);background-color:var(--ffc-bg-alt);cursor:not-allowed}.ffc-input-group{margin-bottom:var(--ffc-spacing-xl)}.ffc-admin-flex-row{display:flex;gap:var(--ffc-spacing-md);align-items:center}.ffc-flex-wrap{flex-wrap:wrap}.ffc-action-group{display:flex;gap:var(--ffc-spacing-xs)}.ffc-text-success{color:var(--ffc-success);font-weight:600}.ffc-text-error{color:var(--ffc-danger);font-weight:600}.ffc-text-info{color:var(--ffc-primary);font-weight:600}.ffc-text-warning{color:var(--ffc-warning-text);font-weight:600}.ffc-monospace{font-family:'SF Mono',Monaco,Consolas,monospace} /*# sourceMappingURL=ffc-admin-utilities.min.css.map */ \ No newline at end of file diff --git a/assets/css/ffc-admin.css b/assets/css/ffc-admin.css index 4afa3751f..b5911a486 100644 --- a/assets/css/ffc-admin.css +++ b/assets/css/ffc-admin.css @@ -133,25 +133,56 @@ gap: var(--ffc-spacing-xs); } +/* A flex row rather than a grid: the quiz controls (#1730) come and go + between the text and the remove button. */ .ffc-choice-row { - display: grid; - grid-template-columns: 20px minmax(0, 1fr) 32px; + display: flex; gap: var(--ffc-spacing-sm); align-items: center; margin: 0; } .ffc-choice-handle { + flex: 0 0 20px; cursor: move; color: var(--ffc-text-muted); } .ffc-choice-input { - width: 100%; + flex: 1 1 auto; + min-width: 0; box-sizing: border-box; } +.ffc-choice-quiz { + display: inline-flex; + flex: 0 0 auto; + align-items: center; + gap: var(--ffc-spacing-2xs); + white-space: nowrap; +} + +/* The field's quiz settings (#1730): set apart from the field's own. */ +.ffc-field-quiz { + margin-top: var(--ffc-spacing-lg); + padding-top: var(--ffc-spacing-md); + border-top: 1px dashed var(--ffc-border); +} + +.ffc-field-quiz-head { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--ffc-spacing-sm) var(--ffc-spacing-lg); +} + +.ffc-field-quiz-body .ffc-quiz-help { + flex-basis: 100%; + margin: 0; +} + .ffc-choice-remove { + flex: 0 0 32px; display: inline-flex; align-items: center; justify-content: center; diff --git a/assets/css/ffc-admin.min.css b/assets/css/ffc-admin.min.css index 01c897a00..a3008db52 100644 --- a/assets/css/ffc-admin.min.css +++ b/assets/css/ffc-admin.min.css @@ -1,2 +1,2 @@ -#ffc-fields-container{margin-bottom:var(--ffc-spacing-xl);max-width:100%}.ffc-field-row{background:var(--ffc-bg-card);border:1px solid var(--ffc-border);padding:var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-lg);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-sm)}.ffc-field-row:hover{box-shadow:var(--ffc-shadow-md)}.ffc-field-row-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--ffc-spacing-xl);padding-bottom:var(--ffc-spacing-md);border-bottom:1px solid var(--ffc-border-light)}.ffc-field-title{margin-left:var(--ffc-spacing-sm)}.ffc-field-row-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--ffc-spacing-xl);align-items:end}.ffc-field-row-grid .ffc-grid-item{display:flex;flex-direction:column;gap:var(--ffc-spacing-xs)}.ffc-field-row-grid input[type=text],.ffc-field-row-grid select{width:100%;box-sizing:border-box;height:30px}.ffc-req-label{display:flex;align-items:center;gap:var(--ffc-spacing-xs);padding-bottom:var(--ffc-spacing-sm)}.ffc-flex-center{display:flex;align-items:center;justify-content:center}.ffc-options-field{margin-top:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);padding:var(--ffc-spacing-lg);border-radius:var(--ffc-radius-sm);border:1px dashed var(--ffc-border)}.ffc-options-desc{margin:0 0 var(--ffc-spacing-2xs);font-weight:700;color:var(--ffc-primary)}.ffc-field-row.ffc-field-row-required-tag{border-left-color:var(--ffc-warning)}.ffc-required-tag-badge{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);margin-left:var(--ffc-spacing-md);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);border-radius:var(--ffc-radius-sm);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);font-size:var(--ffc-font-size-xs);font-weight:600}.ffc-field-row-required-tag input[readonly]{background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}@media (forced-colors:active){.ffc-field-row-required-tag input[readonly],.ffc-required-tag-badge{border:1px solid CanvasText}}.ffc-type-desc{margin:var(--ffc-spacing-sm) 0 0}.ffc-choice-list{list-style:none;margin:0 0 var(--ffc-spacing-sm);padding:0;display:flex;flex-direction:column;gap:var(--ffc-spacing-xs)}.ffc-choice-row{display:grid;grid-template-columns:20px minmax(0,1fr) 32px;gap:var(--ffc-spacing-sm);align-items:center;margin:0}.ffc-choice-handle{cursor:move;color:var(--ffc-text-muted)}.ffc-choice-input{width:100%;box-sizing:border-box}.ffc-choice-remove{display:inline-flex;align-items:center;justify-content:center;min-height:32px;color:var(--ffc-danger)}.ffc-field-settings{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm) var(--ffc-spacing-xl);margin-top:var(--ffc-spacing-lg)}.ffc-field-setting{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm)}.ffc-field-type-menu{background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-md);min-width:200px;z-index:var(--ffc-z-overlay)}.ffc-field-type-menu .ffc-menu-header{padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);font-weight:600;border-bottom:1px solid var(--ffc-border-light)}.ffc-field-type-menu ul{list-style:none;margin:0;padding:var(--ffc-spacing-xs) 0}.ffc-field-type-menu li{margin:0}.ffc-field-type-option{display:block;width:100%;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:0;background:0 0;color:var(--ffc-text);font:inherit;text-align:left;cursor:pointer}.ffc-field-type-option:focus-visible,.ffc-field-type-option:hover{background:var(--ffc-bg-alt)}.ffc-builder-actions{margin-top:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-md);border-top:1px solid var(--ffc-border-light)}#ffc_pdf_layout{width:100%;height:450px;font-family:Consolas,Monaco,monospace;font-size:var(--ffc-font-size-sm);background:#2c3338;color:#f0f0f1;padding:var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm);line-height:1.5;border:1px solid #1e1e1e}#ffc_generated_list{background:var(--ffc-bg-card);font-family:'Courier New',Courier,monospace;width:100%;min-height:150px;border:1px solid var(--ffc-gray-400);font-size:var(--ffc-font-size-xs)}.ffc-gen-status{margin-left:var(--ffc-spacing-md);color:var(--ffc-primary);font-weight:600}.ffc-textarea-mono{font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-xs)}.ffc-h80{min-height:80px}.ffc-h120{min-height:120px}.post-type-ffc_form .wrap{max-width:none!important}.ffc-table-responsive{overflow-x:auto;margin-top:var(--ffc-spacing-2xl);width:100%}.ffc-table-responsive table.wp-list-table{width:100%!important;max-width:100%!important;table-layout:fixed;border-collapse:collapse}.ffc-table-responsive table.wp-list-table td.column-data,.ffc-table-responsive table.wp-list-table td.column-email{overflow-wrap:break-word}.ffc-table-responsive td.column-actions{white-space:normal}@media screen and (max-width:782px){.ffc-table-responsive table.wp-list-table{table-layout:auto}.ffc-table-responsive table.wp-list-table td.column-actions,.ffc-table-responsive table.wp-list-table th.column-actions{white-space:normal}.ffc-table-responsive .button{display:inline-block;margin:var(--ffc-spacing-3xs);font-size:var(--ffc-font-size-2xs);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);line-height:1.5}}.ffc-danger-zone{margin-top:40px;padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-card);border:2px solid var(--ffc-danger);border-radius:var(--ffc-radius-sm)}.ffc-danger-zone h2{color:var(--ffc-danger);margin-top:0}.ffc-shortcode-box{background:var(--ffc-bg-alt);padding:var(--ffc-spacing-md);border-radius:var(--ffc-radius-sm);border:1px solid var(--ffc-border)}.ffc-shortcode-copy{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-xs);margin:var(--ffc-spacing-md) 0}.ffc-shortcode-display{display:block;flex:1 1 100%;min-width:0;padding:var(--ffc-spacing-sm);background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border-light);margin:0;user-select:all;font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-sm);word-break:break-all}#ffc_form_summary .ffc-facts__value{text-align:right}.ffc-tips-list{list-style:disc;padding-left:var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-tips-list li{margin-bottom:var(--ffc-spacing-2xs)}.ffc-sort-handle{cursor:move;color:var(--ffc-gray-300);padding:var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xl);display:flex;align-items:center}.ffc-sort-handle:hover{color:var(--ffc-primary)}.ffc-sort-handle .ffc-field-title{color:var(--ffc-text)}.ffc-remove-field{color:var(--ffc-danger);cursor:pointer;text-decoration:none;font-size:var(--ffc-font-size-sm)}.ffc-remove-field:hover{color:var(--ffc-danger-text)}.ffc-highlight-row{background:var(--ffc-primary-light)}.ffc-label-accent{color:var(--ffc-primary);font-weight:700}@media (max-width:782px){.ffc-field-row-grid{grid-template-columns:1fr}.ffc-admin-flex-row{flex-direction:column;align-items:flex-start}}.ffc-copy-magic-link:hover{background:var(--ffc-primary-hover);color:var(--ffc-text-on-primary);border-color:var(--ffc-primary-hover)}.ffc-admin-page .form-table td a[href*="token="]{display:inline-block;max-width:100%;word-break:break-all;color:var(--ffc-link);text-decoration:underline}.ffc-admin-page .form-table td a[href*="token="]:hover{color:var(--ffc-link-hover)}.ffc-admin-page .form-table .description strong{color:var(--ffc-text)}.ffc-migrations-settings-wrap{max-width:1500px}.ffc-migration-warning{background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);padding:var(--ffc-spacing-lg);margin:var(--ffc-spacing-xl) 0}.ffc-migration-warning p{margin:0}.ffc-action-group{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-xs);align-items:center}.ffc-template-loader{display:flex;gap:var(--ffc-spacing-xs);align-items:center}.ffc-action-group .button,.ffc-template-loader .button{display:inline-flex;align-items:center}.ffc-autosave-status{display:inline-block;margin-left:var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);font-style:italic;vertical-align:middle}.ffc-autosave-status.ffc-saved{color:var(--ffc-success)}.ffc-autosave-status.ffc-error{color:var(--ffc-danger)}.column-ffc_certificates{width:150px}.ffc-view-as-user{color:var(--ffc-link);text-decoration:none;font-size:var(--ffc-font-size-xs)}.ffc-view-as-user:hover{color:var(--ffc-link-hover);text-decoration:underline}.ffc-empty-value{color:var(--ffc-text-light)}.ffc-placeholder{background:var(--ffc-primary-light);border:1px dashed var(--ffc-primary);border-radius:var(--ffc-radius-xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);color:var(--ffc-primary);font-family:"Courier New",monospace;font-size:var(--ffc-font-size-sm);white-space:nowrap;display:inline-block;cursor:default;user-select:none}.ffc-placeholder:hover{background:var(--ffc-info-bg);border-color:var(--ffc-primary-hover)}.ffc-code-editor-wrapper .CodeMirror{border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-xs);height:auto;min-height:260px;font-size:var(--ffc-font-size-sm);font-family:Consolas,Monaco,"Courier New",monospace}.ffc-code-editor-wrapper .CodeMirror-scroll{min-height:260px}.ffc-code-editor-wrapper .cm-ffc-placeholder-token{background:var(--ffc-primary-light);color:var(--ffc-primary);border-radius:2px;padding:0 var(--ffc-spacing-3xs);font-weight:600}.ffc-code-editor-notice{margin-top:var(--ffc-spacing-xs);color:var(--ffc-text-light);font-style:italic}.ffc-badge-info{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-badge-warning{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-badge-error{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-badge-debug{background:var(--ffc-gray-200);color:var(--ffc-gray-700)}.ffc-ml-20{margin-left:var(--ffc-spacing-2xl)}.ffc-m-2xs-0{margin:var(--ffc-spacing-2xs) 0 0 0}.ffc-restriction-label{display:block;margin:var(--ffc-spacing-md) 0}.ffc-global-default{padding:0 var(--ffc-spacing-2xs);border-radius:var(--ffc-radius-xs);background:var(--ffc-primary-light);color:var(--ffc-primary);font-weight:600}.ffc-status-pill{display:inline-block;padding:3px var(--ffc-spacing-md);border-radius:11px;font-size:var(--ffc-font-size-xs);font-weight:500;line-height:1.5}.ffc-status-pill--success{background:var(--ffc-success-light);color:var(--ffc-success)}.ffc-status-pill--warning{background:var(--ffc-warning-light);color:var(--ffc-warning-text)}.ffc-status-pill--info{background:var(--ffc-info-light);color:var(--ffc-info)}.ffc-collapsed{display:none!important}.ffc-csv-public-share{display:flex;gap:var(--ffc-spacing-sm);align-items:center}.ffc-csv-public-share input.large-text{flex:1;min-width:0}.ffc-csv-audit-summary{display:flex;gap:var(--ffc-spacing-lg);flex-wrap:wrap;margin:0 0 var(--ffc-spacing-lg)}.ffc-csv-audit-card{flex:1 1 140px;min-width:140px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-alt);border-left:4px solid var(--ffc-gray-400)}.ffc-csv-audit-card.is-success{border-left-color:var(--ffc-success);background:var(--ffc-success-light)}.ffc-csv-audit-card.is-fail{border-left-color:var(--ffc-danger);background:var(--ffc-danger-light)}.ffc-csv-audit-card-label{display:block;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.04em;margin:0 0 var(--ffc-spacing-2xs)}.ffc-csv-audit-card-value{display:block;font-size:var(--ffc-font-size-2xl);font-weight:700;line-height:1.1;color:var(--ffc-text)}.ffc-csv-audit-card-hint{display:block;font-size:var(--ffc-font-size-2xs);color:var(--ffc-text-muted);margin-top:var(--ffc-spacing-xs);line-height:1.3}.ffc-warning-text{color:var(--ffc-danger-text)}.ffc-dashboard-header{display:flex;align-items:center;justify-content:space-between}.ffc-log-summary{cursor:pointer;color:var(--ffc-link)}.ffc-log-pre{font-size:var(--ffc-font-size-2xs);max-height:150px;overflow:auto;margin-top:var(--ffc-spacing-sm);padding:var(--ffc-spacing-sm);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light)}.ffc-activity-card{margin-top:var(--ffc-spacing-2xl);max-width:100%}.ffc-uppercase{text-transform:uppercase}.ffc-time-description{margin-left:var(--ffc-spacing-2xl);margin-top:var(--ffc-spacing-2xs)}.ffc-list-disc{list-style:disc}.ffc-checkbox-label{display:block;margin-bottom:var(--ffc-spacing-sm)}fieldset .ffc-checkbox-label,td .ffc-restriction-label{display:block}.ffc-info-card{background:var(--ffc-info-bg);border-left:4px solid var(--ffc-info-border)}#ffc-preview-modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:999999;opacity:0;transition:opacity .2s ease}#ffc-preview-modal.ffc-preview-visible{opacity:1}.ffc-preview-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--ffc-bg-overlay)}.ffc-preview-container{position:relative;z-index:var(--ffc-z-raised);display:flex;flex-direction:column;width:90%;max-width:900px;height:85vh;margin:5vh auto;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-lg);overflow:hidden}.ffc-preview-header{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);background:var(--ffc-inverse-surface);color:var(--ffc-inverse-on-surface);flex-shrink:0}.ffc-preview-header h2{margin:0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-inverse-on-surface)}.ffc-preview-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:28px;line-height:1;cursor:pointer;padding:0 var(--ffc-spacing-2xs);transition:color .15s}.ffc-preview-close:hover{color:var(--ffc-inverse-on-surface)}.ffc-preview-note{padding:var(--ffc-spacing-sm) var(--ffc-spacing-2xl);background:var(--ffc-info-bg);border-bottom:1px solid var(--ffc-border);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary);flex-shrink:0}.ffc-preview-body{flex:1;overflow:auto;background:var(--ffc-bg-alt);padding:var(--ffc-spacing-2xl);display:flex;align-items:center;justify-content:center}.ffc-preview-stage{position:relative;flex:0 0 auto;overflow:hidden;box-shadow:var(--ffc-shadow-md)}#ffc-preview-iframe{display:block;border:1px solid var(--ffc-border-light);background:var(--ffc-bg)}@media (max-width:782px){.ffc-preview-container{width:98%;height:90vh;margin:3vh auto}.ffc-preview-body{padding:var(--ffc-spacing-md)}}@media (prefers-reduced-motion:reduce){#ffc-preview-modal{transition:none}.ffc-preview-close{transition:none}}.column-ffc_form_id{width:60px;text-align:center}.column-ffc_shortcode{width:240px}.column-ffc_submissions{width:100px}.ffc-shortcode-cell{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs)}.ffc-shortcode-code{font-size:var(--ffc-font-size-xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);user-select:all}.ffc-copy-shortcode{background:0 0;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-xs);cursor:pointer;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-2xs);line-height:1;color:var(--ffc-text-muted)}.ffc-copy-shortcode:hover{color:var(--ffc-primary);border-color:var(--ffc-primary)}.ffc-copy-shortcode .ffc-icon-copy::before{margin-right:0}.ffc-copy-shortcode.is-copied{color:var(--ffc-success-text);border-color:var(--ffc-success)}.ffc-input-invalid{border-color:var(--ffc-danger)!important;box-shadow:0 0 0 1px var(--ffc-danger)!important}.ffc-input-invalid:focus{border-color:var(--ffc-danger)!important;box-shadow:0 0 0 1px var(--ffc-danger),0 0 2px 1px var(--ffc-danger-hover)!important}p.ffc-datetime-order-error{color:var(--ffc-danger-text);font-weight:500;margin-top:var(--ffc-spacing-2xs)}.ffc-location-picker{display:flex;flex-direction:column;gap:var(--ffc-spacing-2xs);max-height:16em;margin:var(--ffc-spacing-sm) 0;padding:var(--ffc-spacing-sm);overflow-y:auto;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-card);color:var(--ffc-text)}.ffc-location-picker__item{display:flex;align-items:baseline;gap:var(--ffc-spacing-xs)}.ffc-location-picker__meta{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted)}.ffc-form-tabs{display:flex;align-items:flex-start;margin:0 -12px -12px}.ffc-form-tabs__nav{flex:0 0 200px;margin:0;padding:0;list-style:none;background:var(--ffc-bg-alt);border-right:1px solid var(--ffc-border-light)}.ffc-form-tabs__nav-item{margin:0}.ffc-form-tabs__tab{display:flex;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-lg) var(--ffc-spacing-lg);color:var(--ffc-text-secondary);text-decoration:none;font-weight:500;line-height:1.3;border-left:3px solid transparent;border-bottom:1px solid var(--ffc-border-light)}.ffc-form-tabs__tab:hover{background:var(--ffc-bg-card);color:var(--ffc-link-hover)}.ffc-form-tabs__tab:focus{color:var(--ffc-link-hover);box-shadow:none}.ffc-form-tabs__tab:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:-2px}.ffc-form-tabs__tab .ffc-form-tabs__icon{flex:0 0 auto;font-size:var(--ffc-font-size-lg);color:var(--ffc-text-muted)}.ffc-form-tabs__icon::before{margin-right:0}.ffc-form-tabs__tab.is-active{background:var(--ffc-bg-card);color:var(--ffc-primary);border-left-color:var(--ffc-primary)}.ffc-form-tabs__tab.is-active .ffc-form-tabs__icon{color:var(--ffc-primary)}.ffc-form-tabs__tab.has-error{color:var(--ffc-danger)}.ffc-form-tabs__tab.has-error .ffc-form-tabs__icon{color:var(--ffc-danger)}.ffc-form-tabs__error-dot{width:8px;height:8px;margin-left:auto;border-radius:var(--ffc-radius-full);background:var(--ffc-danger)}.ffc-form-tabs__state{flex:0 0 auto;width:8px;height:8px;margin-left:auto;border:1px solid var(--ffc-text-muted);border-radius:var(--ffc-radius-full);box-sizing:border-box}.ffc-form-tabs__tab.is-on .ffc-form-tabs__state{border-color:var(--ffc-success);background:var(--ffc-success)}.ffc-form-tabs__tab.has-error .ffc-form-tabs__state{display:none}.ffc-form-tabs__panels{flex:1 1 auto;min-width:0;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl) var(--ffc-spacing-xl)}.ffc-form-tabs__panel-title{display:flex;align-items:center;gap:var(--ffc-spacing-sm);margin:var(--ffc-spacing-2xs) 0 var(--ffc-spacing-xl);padding-bottom:var(--ffc-spacing-md);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);border-bottom:2px solid var(--ffc-primary)}.ffc-form-tabs__panel-title .ffc-form-tabs__icon{flex:0 0 auto;color:var(--ffc-primary)}.ffc-form-tabs__required-warning{margin:0 0 var(--ffc-spacing-xl)}.ffc-form-tabs__required-warning code{background:var(--ffc-bg-alt)}.misc-pub-section.ffc-duplicate-action .ffc-icon-copy{color:var(--ffc-text-muted)}.ffc-form-tabs.is-ready .ffc-form-tabs__panel{display:none}.ffc-form-tabs.is-ready .ffc-form-tabs__panel.is-active{display:block}.ffc-form-tabs:not(.is-ready) .ffc-form-tabs__panel+.ffc-form-tabs__panel{margin-top:var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}@media screen and (max-width:782px){.ffc-form-tabs{flex-direction:column}.ffc-form-tabs__nav{display:flex;flex:1 1 auto;flex-wrap:wrap;border-right:none;border-bottom:1px solid var(--ffc-border-light)}.ffc-form-tabs__tab{border-left:none;border-bottom:3px solid transparent}.ffc-form-tabs__tab.is-active{border-left:none;border-bottom-color:var(--ffc-primary)}}.ffc-reason-color-swatch{display:inline-block;width:1em;height:1em;border:1px solid var(--ffc-border);vertical-align:middle;background-color:var(--ffc-color)}.ffc-radio-option{display:block;margin-bottom:var(--ffc-spacing-2xs)}@media (forced-colors:active){.ffc-badge-debug,.ffc-badge-error,.ffc-badge-info,.ffc-badge-warning,.ffc-status-pill--info,.ffc-status-pill--success,.ffc-status-pill--warning{border:1px solid CanvasText}}.ffc-preflight-stats-badges{margin:0 0 var(--ffc-spacing-md) 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:var(--ffc-spacing-xs)}.ffc-preflight-badge{background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm);border-left:3px solid var(--ffc-primary);padding:0}.ffc-preflight-badge a{display:flex;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);text-decoration:none;color:var(--ffc-text);font-size:var(--ffc-font-size-sm)}.ffc-preflight-badge a:focus,.ffc-preflight-badge a:hover{background:var(--ffc-primary-light)}.ffc-preflight-badge-icon{display:inline-flex;flex-shrink:0;color:var(--ffc-primary)}.ffc-preflight-badge strong{font-size:var(--ffc-font-size-lg);color:var(--ffc-primary);min-width:2ch;text-align:right}.ffc-page-identities .ffc-identity-counts,.ffc-page-identities .ffc-identity-scan{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-xs) var(--ffc-spacing-md);margin:var(--ffc-spacing-md) 0;padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-scan-whole{border-left:4px solid var(--ffc-success-border)}.ffc-page-identities .ffc-identity-scan-partial{border-left:4px solid var(--ffc-warning-border)}.ffc-page-identities .ffc-identity-scan-none{border-left:4px solid var(--ffc-danger-border)}.ffc-page-identities .ffc-identity-scan-verdict{margin:0;font-weight:600}.ffc-page-identities .ffc-identity-scan-detail,.ffc-page-identities .ffc-identity-scan-when{margin:0;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-sm)}.ffc-page-identities .ffc-identity-scan-when{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-2xs);margin-left:auto}.ffc-page-identities .ffc-identity-scan-when form{margin:0}.ffc-page-identities .ffc-identity-counts-total{font-weight:600;white-space:nowrap}.ffc-page-identities .ffc-identity-count{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);border:1px solid transparent;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);white-space:nowrap}.ffc-page-identities .ffc-identity-counts-done{color:var(--ffc-success-text);font-weight:600;white-space:nowrap}.ffc-page-identities .ffc-identity-counts-note{margin:0}.ffc-page-identities .ffc-identity-counts-export{margin-left:auto}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-counts-export,.ffc-page-identities .ffc-identity-scan-when{margin-left:0}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-count{border:1px solid CanvasText}.ffc-page-identities .ffc-identity-scan-none,.ffc-page-identities .ffc-identity-scan-partial,.ffc-page-identities .ffc-identity-scan-whole{border-left:4px solid CanvasText}}.ffc-page-identities .ffc-identity-panel{margin:var(--ffc-spacing-lg) 0;background:var(--ffc-bg-card);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-panel-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);background:var(--ffc-bg-alt);border-bottom:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-panel-title{margin:0;font-size:var(--ffc-font-size-lg)}.ffc-page-identities .ffc-identity-panel-note{flex:1 1 18em;margin:0}.ffc-page-identities .ffc-identity-panel-body{padding:var(--ffc-spacing-md)}.ffc-page-identities .ffc-identity-panel-chip{flex-shrink:0;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-2xs);border:1px solid transparent;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-2xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;white-space:nowrap}.ffc-page-identities .ffc-identity-chip-mechanical{background:var(--ffc-success-bg);border-color:var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-chip-isolated{background:var(--ffc-danger-bg);border-color:var(--ffc-danger-border);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-chip-decision{background:var(--ffc-warning-bg);border-color:var(--ffc-warning-border);color:var(--ffc-warning-text)}.ffc-page-identities .ffc-identity-chip-shared{background:var(--ffc-info-bg);border-color:var(--ffc-info-border);color:var(--ffc-info-text)}.ffc-page-identities .ffc-identity-chip-mailbox{background:var(--ffc-bg-alt);border-color:var(--ffc-border);color:var(--ffc-text)}.ffc-page-identities .ffc-identity-chip-accepted{background:var(--ffc-bg-alt);border-color:var(--ffc-border);border-style:dashed;color:var(--ffc-text)}.ffc-page-identities .ffc-identity-accept{margin-top:var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xs)}.ffc-page-identities .ffc-identity-accept>summary{cursor:pointer;color:var(--ffc-gray-600)}.ffc-page-identities .ffc-identity-panel-nav{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-2xs);margin-left:auto}.ffc-page-identities .ffc-identity-panel-count{font-variant-numeric:tabular-nums;white-space:nowrap}.ffc-page-identities .ffc-identity-panel-step{display:inline-flex;align-items:center;min-height:44px;padding:0 var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-panel-step-next,.ffc-page-identities .ffc-identity-panel-step-previous{justify-content:center;min-width:40px;min-height:40px;padding:0}.ffc-page-identities .ffc-identity-panel-step [class*=ffc-icon-chevron]{font-size:var(--ffc-font-size-lg);line-height:1}.ffc-page-identities .ffc-identity-panel-step [class*=ffc-icon-chevron]::before{margin-right:0}.ffc-page-identities .ffc-identity-panel-step[aria-disabled=true]{opacity:.5;pointer-events:none}.ffc-page-identities .ffc-identity-panel-toggle{white-space:nowrap}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-panel-nav{margin-left:0;width:100%}.ffc-page-identities .ffc-identity-panel-step{flex-grow:1;justify-content:center}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-chip-decision,.ffc-page-identities .ffc-identity-chip-isolated,.ffc-page-identities .ffc-identity-chip-mailbox,.ffc-page-identities .ffc-identity-chip-mechanical,.ffc-page-identities .ffc-identity-chip-shared{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-cards{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-page-identities .ffc-identity-card{display:flex;align-items:stretch;background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-card-main{flex:1 1 0;min-width:18em;display:flex;flex-direction:column;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg)}.ffc-page-identities .ffc-identity-card-who{margin:0;font-size:var(--ffc-font-size-lg);font-weight:600}.ffc-page-identities .ffc-identity-card-says{margin:0}.ffc-page-identities .ffc-identity-card-hashes{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-xs)}.ffc-page-identities .ffc-identity-card-hash{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);border:1px solid transparent;border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-card-hash code{background:0 0;color:inherit;font-size:var(--ffc-font-size-xs);padding:0}.ffc-page-identities .ffc-identity-card-said{font-size:var(--ffc-font-size-xs);font-weight:600}.ffc-page-identities .ffc-identity-card-hash-bad{background:var(--ffc-danger-bg);border-color:var(--ffc-danger-border);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-card-hash-ok{background:var(--ffc-success-bg);border-color:var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-card-hash-plain,.ffc-page-identities .ffc-identity-card-hash-unknown{background:var(--ffc-bg-alt);border-color:var(--ffc-border);color:var(--ffc-text-secondary)}.ffc-page-identities .ffc-identity-panel-body a{color:var(--ffc-link)}.ffc-page-identities .ffc-identity-panel-body a:focus,.ffc-page-identities .ffc-identity-panel-body a:hover{color:var(--ffc-link-hover)}.ffc-page-identities .ffc-identity-card-arrow{color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-page-identities .ffc-identity-card-rows{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-2xs) var(--ffc-spacing-md);margin:0;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-sm)}.ffc-page-identities .ffc-identity-card-rowset{display:inline-flex;align-items:baseline;gap:var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-card-rowset code{background:0 0;color:inherit;font-size:var(--ffc-font-size-xs);padding:0}.ffc-page-identities .ffc-identity-card-main .ffc-identity-orphan-has{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-2xs) var(--ffc-spacing-md);padding-left:0;list-style:none}.ffc-page-identities .ffc-identity-card-where{margin:0;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-sm)}.ffc-page-identities .ffc-identity-card-act{flex:0 0 17em;display:flex;flex-direction:column;justify-content:center;gap:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-md);background:var(--ffc-bg-alt);color:var(--ffc-text);border-left:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-verb+.ffc-identity-card-verb{margin-top:var(--ffc-spacing-sm);padding-top:var(--ffc-spacing-sm);border-top:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ){flex:0 1 54em;flex-direction:row;flex-wrap:wrap;align-items:flex-start;justify-content:flex-start}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ) .ffc-identity-card-verb{flex:1 1 16em}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ) .ffc-identity-card-verb+.ffc-identity-card-verb{margin-top:0;margin-left:var(--ffc-spacing-sm);padding-top:0;padding-left:var(--ffc-spacing-sm);border-top:0;border-left:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-verb-head{display:flex;align-items:baseline;gap:var(--ffc-spacing-3xs);margin:0 0 var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-card-verb-head code{background:0 0;color:inherit;font-size:var(--ffc-font-size-xs);padding:0}.ffc-page-identities .ffc-identity-card-route{margin:var(--ffc-spacing-2xs) 0 var(--ffc-spacing-3xs);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-text-muted)}.ffc-page-identities .ffc-identity-card-act form{margin:0}.ffc-page-identities .ffc-identity-card-act .button{min-height:44px;padding-top:var(--ffc-spacing-2xs);padding-bottom:var(--ffc-spacing-2xs)}.ffc-page-identities .ffc-identity-ack{display:flex;align-items:flex-start;gap:var(--ffc-spacing-2xs);max-width:22em;line-height:1.5}.ffc-page-identities .ffc-identity-ack[hidden]{display:none}.ffc-page-identities .ffc-identity-ack input[type=checkbox]{flex-shrink:0;margin-top:.2em}.ffc-page-identities .ffc-identity-card-act .button,.ffc-page-identities .ffc-identity-card-act input[type=email],.ffc-page-identities .ffc-identity-card-act input[type=number],.ffc-page-identities .ffc-identity-card-act input[type=text]{vertical-align:middle}.ffc-page-identities .ffc-identity-card-act input[type=email],.ffc-page-identities .ffc-identity-card-act input[type=number],.ffc-page-identities .ffc-identity-card-act input[type=text]{min-height:44px;width:14em}.ffc-page-identities .ffc-identity-card-act .button-primary{font-weight:600}.ffc-page-identities .ffc-identity-find{display:inline-flex;align-items:center;gap:var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-find .ffc-icon-search::before{margin-right:0}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-card{flex-direction:column}.ffc-page-identities .ffc-identity-card-act{flex:0 0 auto;border-left:0;border-top:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ) .ffc-identity-card-verb+.ffc-identity-card-verb{margin-top:var(--ffc-spacing-sm);margin-left:0;padding-top:var(--ffc-spacing-sm);padding-left:0;border-top:1px solid var(--ffc-border);border-left:0}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-card-hash{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-dialog{position:fixed;inset:0;z-index:var(--ffc-z-modal);display:flex;align-items:flex-start;justify-content:center;padding:var(--ffc-spacing-2xl);overflow-y:auto}.ffc-page-identities .ffc-identity-dialog[hidden]{display:none}.ffc-page-identities .ffc-identity-dialog-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-page-identities .ffc-identity-dialog-panel{position:relative;z-index:var(--ffc-z-raised);width:100%;max-width:850px;background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-lg)}.ffc-page-identities .ffc-identity-dialog-head{display:flex;align-items:flex-start;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl) var(--ffc-spacing-md);border-bottom:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-dialog-heading{flex-grow:1}.ffc-page-identities .ffc-identity-dialog-head h2{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xl)}.ffc-page-identities .ffc-identity-dialog-sub{margin:0;font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted)}.ffc-page-identities .ffc-identity-dialog-close{min-width:44px;min-height:44px;padding:0;font-size:var(--ffc-font-size-2xl);line-height:1;color:var(--ffc-text-muted);background:0 0;border:none;cursor:pointer}.ffc-page-identities .ffc-identity-dialog-close:focus,.ffc-page-identities .ffc-identity-dialog-close:hover{color:var(--ffc-text)}.ffc-page-identities .ffc-identity-dialog-body{display:flex;flex-direction:column;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl)}.ffc-page-identities .ffc-identity-dialog-suggestion-has{padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success);border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-dialog-suggestion-head{display:block;margin-bottom:var(--ffc-spacing-xs);font-size:var(--ffc-font-size-2xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase}.ffc-page-identities .ffc-identity-dialog-search label{display:block;margin-bottom:var(--ffc-spacing-2xs);font-weight:600}.ffc-page-identities .ffc-identity-dialog-search input{width:100%;min-height:44px}.ffc-page-identities .ffc-identity-dialog-count{padding:var(--ffc-spacing-xs) var(--ffc-spacing-md);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-text-muted);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);border-bottom:none}.ffc-page-identities .ffc-identity-dialog-result{display:flex;align-items:center;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-md);border:1px solid var(--ffc-border);border-top:none;cursor:pointer}.ffc-page-identities .ffc-identity-dialog-suggestion .ffc-identity-dialog-result{padding:0;background:0 0;border:none}.ffc-page-identities .ffc-identity-dialog-result-refused{background:var(--ffc-bg-alt);cursor:not-allowed}.ffc-page-identities .ffc-identity-dialog-who{display:flex;flex-direction:column;flex-grow:1;gap:var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-dialog-meta{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-page-identities .ffc-identity-dialog-verdict{padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);font-weight:600;white-space:nowrap;border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-dialog-verdict-ok{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-dialog-verdict-refused{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-dialog-column,.ffc-page-identities .ffc-identity-dialog-rule{margin:0;padding-left:var(--ffc-spacing-md);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);border-left:3px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-dialog-foot{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border-top:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-dialog-foot .button{min-height:44px}.ffc-page-identities .ffc-identity-chosen{display:inline-block;margin-left:var(--ffc-spacing-xs);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-success-text)}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-dialog{padding:var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-dialog-result{flex-wrap:wrap}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-dialog-verdict-ok,.ffc-page-identities .ffc-identity-dialog-verdict-refused{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-verdict{margin-top:var(--ffc-spacing-xs)}.ffc-page-identities .ffc-identity-verdict-line{margin:0 0 var(--ffc-spacing-2xs);padding:var(--ffc-spacing-xs) var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-verdict-ok{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-verdict-warn{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-page-identities .ffc-identity-verdict-bad{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-correct-instead{margin-top:var(--ffc-spacing-xl);padding:var(--ffc-spacing-lg);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-correct-instead h4{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-base)}.ffc-page-identities .ffc-identity-correct-one{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm);margin-top:var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-correct-one label{min-width:14em;font-weight:600}@media (forced-colors:active){.ffc-page-identities .ffc-identity-verdict-bad,.ffc-page-identities .ffc-identity-verdict-ok,.ffc-page-identities .ffc-identity-verdict-warn{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-pair{margin-bottom:var(--ffc-spacing-xl);padding:var(--ffc-spacing-lg);background:var(--ffc-bg-card);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-pair-subject{margin:0 0 var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-pair-choice{margin:0 0 var(--ffc-spacing-md);padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-pair-choice legend{padding:0 var(--ffc-spacing-2xs);font-weight:600}.ffc-page-identities .ffc-identity-pair-choice label{display:block;padding:var(--ffc-spacing-2xs) 0}.ffc-page-identities .ffc-identity-pair-basis{margin:0 0 var(--ffc-spacing-2xs)}.ffc-page-identities .ffc-identity-pair-evidence{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);margin:0 0 var(--ffc-spacing-2xs) var(--ffc-spacing-md)}.ffc-page-identities .ffc-identity-preview-region:not(:empty){margin-bottom:var(--ffc-spacing-md);padding:var(--ffc-spacing-md);background:var(--ffc-bg-alt);border-left:3px solid var(--ffc-warning)}.ffc-page-identities .ffc-identity-preview-line{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xs)}.ffc-page-identities .ffc-identity-preview-head{font-size:var(--ffc-font-size-base);font-weight:600}.ffc-page-identities .ffc-identity-preview-total{font-weight:600}.ffc-page-identities .ffc-identity-preview-bad{color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-preview-stores{margin:0 0 var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-xs);list-style:disc}.ffc-page-identities .ffc-identity-merge-one .button{min-height:44px}.ffc-page-identities .ffc-identity-chip-orphans{background:var(--ffc-accent-bg);border-color:var(--ffc-accent-border);color:var(--ffc-accent-text)}.ffc-page-identities .ffc-identity-orphan-has{margin:0;font-size:var(--ffc-font-size-xs)}.ffc-page-identities .ffc-identity-orphan-present{color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-orphan-missing{color:var(--ffc-danger-text);font-weight:600}@media (forced-colors:active){.ffc-page-identities .ffc-identity-chip-orphans{border:1px solid CanvasText}} +#ffc-fields-container{margin-bottom:var(--ffc-spacing-xl);max-width:100%}.ffc-field-row{background:var(--ffc-bg-card);border:1px solid var(--ffc-border);padding:var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-lg);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-sm)}.ffc-field-row:hover{box-shadow:var(--ffc-shadow-md)}.ffc-field-row-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--ffc-spacing-xl);padding-bottom:var(--ffc-spacing-md);border-bottom:1px solid var(--ffc-border-light)}.ffc-field-title{margin-left:var(--ffc-spacing-sm)}.ffc-field-row-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--ffc-spacing-xl);align-items:end}.ffc-field-row-grid .ffc-grid-item{display:flex;flex-direction:column;gap:var(--ffc-spacing-xs)}.ffc-field-row-grid input[type=text],.ffc-field-row-grid select{width:100%;box-sizing:border-box;height:30px}.ffc-req-label{display:flex;align-items:center;gap:var(--ffc-spacing-xs);padding-bottom:var(--ffc-spacing-sm)}.ffc-flex-center{display:flex;align-items:center;justify-content:center}.ffc-options-field{margin-top:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);padding:var(--ffc-spacing-lg);border-radius:var(--ffc-radius-sm);border:1px dashed var(--ffc-border)}.ffc-options-desc{margin:0 0 var(--ffc-spacing-2xs);font-weight:700;color:var(--ffc-primary)}.ffc-field-row.ffc-field-row-required-tag{border-left-color:var(--ffc-warning)}.ffc-required-tag-badge{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);margin-left:var(--ffc-spacing-md);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);border-radius:var(--ffc-radius-sm);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);font-size:var(--ffc-font-size-xs);font-weight:600}.ffc-field-row-required-tag input[readonly]{background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}@media (forced-colors:active){.ffc-field-row-required-tag input[readonly],.ffc-required-tag-badge{border:1px solid CanvasText}}.ffc-type-desc{margin:var(--ffc-spacing-sm) 0 0}.ffc-choice-list{list-style:none;margin:0 0 var(--ffc-spacing-sm);padding:0;display:flex;flex-direction:column;gap:var(--ffc-spacing-xs)}.ffc-choice-row{display:flex;gap:var(--ffc-spacing-sm);align-items:center;margin:0}.ffc-choice-handle{flex:0 0 20px;cursor:move;color:var(--ffc-text-muted)}.ffc-choice-input{flex:1 1 auto;min-width:0;box-sizing:border-box}.ffc-choice-quiz{display:inline-flex;flex:0 0 auto;align-items:center;gap:var(--ffc-spacing-2xs);white-space:nowrap}.ffc-field-quiz{margin-top:var(--ffc-spacing-lg);padding-top:var(--ffc-spacing-md);border-top:1px dashed var(--ffc-border)}.ffc-field-quiz-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm) var(--ffc-spacing-lg)}.ffc-field-quiz-body .ffc-quiz-help{flex-basis:100%;margin:0}.ffc-choice-remove{flex:0 0 32px;display:inline-flex;align-items:center;justify-content:center;min-height:32px;color:var(--ffc-danger)}.ffc-field-settings{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm) var(--ffc-spacing-xl);margin-top:var(--ffc-spacing-lg)}.ffc-field-setting{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm)}.ffc-field-type-menu{background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-md);min-width:200px;z-index:var(--ffc-z-overlay)}.ffc-field-type-menu .ffc-menu-header{padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);font-weight:600;border-bottom:1px solid var(--ffc-border-light)}.ffc-field-type-menu ul{list-style:none;margin:0;padding:var(--ffc-spacing-xs) 0}.ffc-field-type-menu li{margin:0}.ffc-field-type-option{display:block;width:100%;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:0;background:0 0;color:var(--ffc-text);font:inherit;text-align:left;cursor:pointer}.ffc-field-type-option:focus-visible,.ffc-field-type-option:hover{background:var(--ffc-bg-alt)}.ffc-builder-actions{margin-top:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-md);border-top:1px solid var(--ffc-border-light)}#ffc_pdf_layout{width:100%;height:450px;font-family:Consolas,Monaco,monospace;font-size:var(--ffc-font-size-sm);background:#2c3338;color:#f0f0f1;padding:var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm);line-height:1.5;border:1px solid #1e1e1e}#ffc_generated_list{background:var(--ffc-bg-card);font-family:'Courier New',Courier,monospace;width:100%;min-height:150px;border:1px solid var(--ffc-gray-400);font-size:var(--ffc-font-size-xs)}.ffc-gen-status{margin-left:var(--ffc-spacing-md);color:var(--ffc-primary);font-weight:600}.ffc-textarea-mono{font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-xs)}.ffc-h80{min-height:80px}.ffc-h120{min-height:120px}.post-type-ffc_form .wrap{max-width:none!important}.ffc-table-responsive{overflow-x:auto;margin-top:var(--ffc-spacing-2xl);width:100%}.ffc-table-responsive table.wp-list-table{width:100%!important;max-width:100%!important;table-layout:fixed;border-collapse:collapse}.ffc-table-responsive table.wp-list-table td.column-data,.ffc-table-responsive table.wp-list-table td.column-email{overflow-wrap:break-word}.ffc-table-responsive td.column-actions{white-space:normal}@media screen and (max-width:782px){.ffc-table-responsive table.wp-list-table{table-layout:auto}.ffc-table-responsive table.wp-list-table td.column-actions,.ffc-table-responsive table.wp-list-table th.column-actions{white-space:normal}.ffc-table-responsive .button{display:inline-block;margin:var(--ffc-spacing-3xs);font-size:var(--ffc-font-size-2xs);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);line-height:1.5}}.ffc-danger-zone{margin-top:40px;padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-card);border:2px solid var(--ffc-danger);border-radius:var(--ffc-radius-sm)}.ffc-danger-zone h2{color:var(--ffc-danger);margin-top:0}.ffc-shortcode-box{background:var(--ffc-bg-alt);padding:var(--ffc-spacing-md);border-radius:var(--ffc-radius-sm);border:1px solid var(--ffc-border)}.ffc-shortcode-copy{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-xs);margin:var(--ffc-spacing-md) 0}.ffc-shortcode-display{display:block;flex:1 1 100%;min-width:0;padding:var(--ffc-spacing-sm);background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border-light);margin:0;user-select:all;font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-sm);word-break:break-all}#ffc_form_summary .ffc-facts__value{text-align:right}.ffc-tips-list{list-style:disc;padding-left:var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-tips-list li{margin-bottom:var(--ffc-spacing-2xs)}.ffc-sort-handle{cursor:move;color:var(--ffc-gray-300);padding:var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xl);display:flex;align-items:center}.ffc-sort-handle:hover{color:var(--ffc-primary)}.ffc-sort-handle .ffc-field-title{color:var(--ffc-text)}.ffc-remove-field{color:var(--ffc-danger);cursor:pointer;text-decoration:none;font-size:var(--ffc-font-size-sm)}.ffc-remove-field:hover{color:var(--ffc-danger-text)}.ffc-highlight-row{background:var(--ffc-primary-light)}.ffc-label-accent{color:var(--ffc-primary);font-weight:700}@media (max-width:782px){.ffc-field-row-grid{grid-template-columns:1fr}.ffc-admin-flex-row{flex-direction:column;align-items:flex-start}}.ffc-copy-magic-link:hover{background:var(--ffc-primary-hover);color:var(--ffc-text-on-primary);border-color:var(--ffc-primary-hover)}.ffc-admin-page .form-table td a[href*="token="]{display:inline-block;max-width:100%;word-break:break-all;color:var(--ffc-link);text-decoration:underline}.ffc-admin-page .form-table td a[href*="token="]:hover{color:var(--ffc-link-hover)}.ffc-admin-page .form-table .description strong{color:var(--ffc-text)}.ffc-migrations-settings-wrap{max-width:1500px}.ffc-migration-warning{background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);padding:var(--ffc-spacing-lg);margin:var(--ffc-spacing-xl) 0}.ffc-migration-warning p{margin:0}.ffc-action-group{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-xs);align-items:center}.ffc-template-loader{display:flex;gap:var(--ffc-spacing-xs);align-items:center}.ffc-action-group .button,.ffc-template-loader .button{display:inline-flex;align-items:center}.ffc-autosave-status{display:inline-block;margin-left:var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);font-style:italic;vertical-align:middle}.ffc-autosave-status.ffc-saved{color:var(--ffc-success)}.ffc-autosave-status.ffc-error{color:var(--ffc-danger)}.column-ffc_certificates{width:150px}.ffc-view-as-user{color:var(--ffc-link);text-decoration:none;font-size:var(--ffc-font-size-xs)}.ffc-view-as-user:hover{color:var(--ffc-link-hover);text-decoration:underline}.ffc-empty-value{color:var(--ffc-text-light)}.ffc-placeholder{background:var(--ffc-primary-light);border:1px dashed var(--ffc-primary);border-radius:var(--ffc-radius-xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);color:var(--ffc-primary);font-family:"Courier New",monospace;font-size:var(--ffc-font-size-sm);white-space:nowrap;display:inline-block;cursor:default;user-select:none}.ffc-placeholder:hover{background:var(--ffc-info-bg);border-color:var(--ffc-primary-hover)}.ffc-code-editor-wrapper .CodeMirror{border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-xs);height:auto;min-height:260px;font-size:var(--ffc-font-size-sm);font-family:Consolas,Monaco,"Courier New",monospace}.ffc-code-editor-wrapper .CodeMirror-scroll{min-height:260px}.ffc-code-editor-wrapper .cm-ffc-placeholder-token{background:var(--ffc-primary-light);color:var(--ffc-primary);border-radius:2px;padding:0 var(--ffc-spacing-3xs);font-weight:600}.ffc-code-editor-notice{margin-top:var(--ffc-spacing-xs);color:var(--ffc-text-light);font-style:italic}.ffc-badge-info{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-badge-warning{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-badge-error{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-badge-debug{background:var(--ffc-gray-200);color:var(--ffc-gray-700)}.ffc-ml-20{margin-left:var(--ffc-spacing-2xl)}.ffc-m-2xs-0{margin:var(--ffc-spacing-2xs) 0 0 0}.ffc-restriction-label{display:block;margin:var(--ffc-spacing-md) 0}.ffc-global-default{padding:0 var(--ffc-spacing-2xs);border-radius:var(--ffc-radius-xs);background:var(--ffc-primary-light);color:var(--ffc-primary);font-weight:600}.ffc-status-pill{display:inline-block;padding:3px var(--ffc-spacing-md);border-radius:11px;font-size:var(--ffc-font-size-xs);font-weight:500;line-height:1.5}.ffc-status-pill--success{background:var(--ffc-success-light);color:var(--ffc-success)}.ffc-status-pill--warning{background:var(--ffc-warning-light);color:var(--ffc-warning-text)}.ffc-status-pill--info{background:var(--ffc-info-light);color:var(--ffc-info)}.ffc-collapsed{display:none!important}.ffc-csv-public-share{display:flex;gap:var(--ffc-spacing-sm);align-items:center}.ffc-csv-public-share input.large-text{flex:1;min-width:0}.ffc-csv-audit-summary{display:flex;gap:var(--ffc-spacing-lg);flex-wrap:wrap;margin:0 0 var(--ffc-spacing-lg)}.ffc-csv-audit-card{flex:1 1 140px;min-width:140px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-alt);border-left:4px solid var(--ffc-gray-400)}.ffc-csv-audit-card.is-success{border-left-color:var(--ffc-success);background:var(--ffc-success-light)}.ffc-csv-audit-card.is-fail{border-left-color:var(--ffc-danger);background:var(--ffc-danger-light)}.ffc-csv-audit-card-label{display:block;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.04em;margin:0 0 var(--ffc-spacing-2xs)}.ffc-csv-audit-card-value{display:block;font-size:var(--ffc-font-size-2xl);font-weight:700;line-height:1.1;color:var(--ffc-text)}.ffc-csv-audit-card-hint{display:block;font-size:var(--ffc-font-size-2xs);color:var(--ffc-text-muted);margin-top:var(--ffc-spacing-xs);line-height:1.3}.ffc-warning-text{color:var(--ffc-danger-text)}.ffc-dashboard-header{display:flex;align-items:center;justify-content:space-between}.ffc-log-summary{cursor:pointer;color:var(--ffc-link)}.ffc-log-pre{font-size:var(--ffc-font-size-2xs);max-height:150px;overflow:auto;margin-top:var(--ffc-spacing-sm);padding:var(--ffc-spacing-sm);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light)}.ffc-activity-card{margin-top:var(--ffc-spacing-2xl);max-width:100%}.ffc-uppercase{text-transform:uppercase}.ffc-time-description{margin-left:var(--ffc-spacing-2xl);margin-top:var(--ffc-spacing-2xs)}.ffc-list-disc{list-style:disc}.ffc-checkbox-label{display:block;margin-bottom:var(--ffc-spacing-sm)}fieldset .ffc-checkbox-label,td .ffc-restriction-label{display:block}.ffc-info-card{background:var(--ffc-info-bg);border-left:4px solid var(--ffc-info-border)}#ffc-preview-modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:999999;opacity:0;transition:opacity .2s ease}#ffc-preview-modal.ffc-preview-visible{opacity:1}.ffc-preview-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--ffc-bg-overlay)}.ffc-preview-container{position:relative;z-index:var(--ffc-z-raised);display:flex;flex-direction:column;width:90%;max-width:900px;height:85vh;margin:5vh auto;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-lg);overflow:hidden}.ffc-preview-header{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);background:var(--ffc-inverse-surface);color:var(--ffc-inverse-on-surface);flex-shrink:0}.ffc-preview-header h2{margin:0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-inverse-on-surface)}.ffc-preview-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:28px;line-height:1;cursor:pointer;padding:0 var(--ffc-spacing-2xs);transition:color .15s}.ffc-preview-close:hover{color:var(--ffc-inverse-on-surface)}.ffc-preview-note{padding:var(--ffc-spacing-sm) var(--ffc-spacing-2xl);background:var(--ffc-info-bg);border-bottom:1px solid var(--ffc-border);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary);flex-shrink:0}.ffc-preview-body{flex:1;overflow:auto;background:var(--ffc-bg-alt);padding:var(--ffc-spacing-2xl);display:flex;align-items:center;justify-content:center}.ffc-preview-stage{position:relative;flex:0 0 auto;overflow:hidden;box-shadow:var(--ffc-shadow-md)}#ffc-preview-iframe{display:block;border:1px solid var(--ffc-border-light);background:var(--ffc-bg)}@media (max-width:782px){.ffc-preview-container{width:98%;height:90vh;margin:3vh auto}.ffc-preview-body{padding:var(--ffc-spacing-md)}}@media (prefers-reduced-motion:reduce){#ffc-preview-modal{transition:none}.ffc-preview-close{transition:none}}.column-ffc_form_id{width:60px;text-align:center}.column-ffc_shortcode{width:240px}.column-ffc_submissions{width:100px}.ffc-shortcode-cell{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs)}.ffc-shortcode-code{font-size:var(--ffc-font-size-xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);user-select:all}.ffc-copy-shortcode{background:0 0;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-xs);cursor:pointer;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-2xs);line-height:1;color:var(--ffc-text-muted)}.ffc-copy-shortcode:hover{color:var(--ffc-primary);border-color:var(--ffc-primary)}.ffc-copy-shortcode .ffc-icon-copy::before{margin-right:0}.ffc-copy-shortcode.is-copied{color:var(--ffc-success-text);border-color:var(--ffc-success)}.ffc-input-invalid{border-color:var(--ffc-danger)!important;box-shadow:0 0 0 1px var(--ffc-danger)!important}.ffc-input-invalid:focus{border-color:var(--ffc-danger)!important;box-shadow:0 0 0 1px var(--ffc-danger),0 0 2px 1px var(--ffc-danger-hover)!important}p.ffc-datetime-order-error{color:var(--ffc-danger-text);font-weight:500;margin-top:var(--ffc-spacing-2xs)}.ffc-location-picker{display:flex;flex-direction:column;gap:var(--ffc-spacing-2xs);max-height:16em;margin:var(--ffc-spacing-sm) 0;padding:var(--ffc-spacing-sm);overflow-y:auto;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-card);color:var(--ffc-text)}.ffc-location-picker__item{display:flex;align-items:baseline;gap:var(--ffc-spacing-xs)}.ffc-location-picker__meta{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted)}.ffc-form-tabs{display:flex;align-items:flex-start;margin:0 -12px -12px}.ffc-form-tabs__nav{flex:0 0 200px;margin:0;padding:0;list-style:none;background:var(--ffc-bg-alt);border-right:1px solid var(--ffc-border-light)}.ffc-form-tabs__nav-item{margin:0}.ffc-form-tabs__tab{display:flex;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-lg) var(--ffc-spacing-lg);color:var(--ffc-text-secondary);text-decoration:none;font-weight:500;line-height:1.3;border-left:3px solid transparent;border-bottom:1px solid var(--ffc-border-light)}.ffc-form-tabs__tab:hover{background:var(--ffc-bg-card);color:var(--ffc-link-hover)}.ffc-form-tabs__tab:focus{color:var(--ffc-link-hover);box-shadow:none}.ffc-form-tabs__tab:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:-2px}.ffc-form-tabs__tab .ffc-form-tabs__icon{flex:0 0 auto;font-size:var(--ffc-font-size-lg);color:var(--ffc-text-muted)}.ffc-form-tabs__icon::before{margin-right:0}.ffc-form-tabs__tab.is-active{background:var(--ffc-bg-card);color:var(--ffc-primary);border-left-color:var(--ffc-primary)}.ffc-form-tabs__tab.is-active .ffc-form-tabs__icon{color:var(--ffc-primary)}.ffc-form-tabs__tab.has-error{color:var(--ffc-danger)}.ffc-form-tabs__tab.has-error .ffc-form-tabs__icon{color:var(--ffc-danger)}.ffc-form-tabs__error-dot{width:8px;height:8px;margin-left:auto;border-radius:var(--ffc-radius-full);background:var(--ffc-danger)}.ffc-form-tabs__state{flex:0 0 auto;width:8px;height:8px;margin-left:auto;border:1px solid var(--ffc-text-muted);border-radius:var(--ffc-radius-full);box-sizing:border-box}.ffc-form-tabs__tab.is-on .ffc-form-tabs__state{border-color:var(--ffc-success);background:var(--ffc-success)}.ffc-form-tabs__tab.has-error .ffc-form-tabs__state{display:none}.ffc-form-tabs__panels{flex:1 1 auto;min-width:0;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl) var(--ffc-spacing-xl)}.ffc-form-tabs__panel-title{display:flex;align-items:center;gap:var(--ffc-spacing-sm);margin:var(--ffc-spacing-2xs) 0 var(--ffc-spacing-xl);padding-bottom:var(--ffc-spacing-md);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);border-bottom:2px solid var(--ffc-primary)}.ffc-form-tabs__panel-title .ffc-form-tabs__icon{flex:0 0 auto;color:var(--ffc-primary)}.ffc-form-tabs__required-warning{margin:0 0 var(--ffc-spacing-xl)}.ffc-form-tabs__required-warning code{background:var(--ffc-bg-alt)}.misc-pub-section.ffc-duplicate-action .ffc-icon-copy{color:var(--ffc-text-muted)}.ffc-form-tabs.is-ready .ffc-form-tabs__panel{display:none}.ffc-form-tabs.is-ready .ffc-form-tabs__panel.is-active{display:block}.ffc-form-tabs:not(.is-ready) .ffc-form-tabs__panel+.ffc-form-tabs__panel{margin-top:var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}@media screen and (max-width:782px){.ffc-form-tabs{flex-direction:column}.ffc-form-tabs__nav{display:flex;flex:1 1 auto;flex-wrap:wrap;border-right:none;border-bottom:1px solid var(--ffc-border-light)}.ffc-form-tabs__tab{border-left:none;border-bottom:3px solid transparent}.ffc-form-tabs__tab.is-active{border-left:none;border-bottom-color:var(--ffc-primary)}}.ffc-reason-color-swatch{display:inline-block;width:1em;height:1em;border:1px solid var(--ffc-border);vertical-align:middle;background-color:var(--ffc-color)}.ffc-radio-option{display:block;margin-bottom:var(--ffc-spacing-2xs)}@media (forced-colors:active){.ffc-badge-debug,.ffc-badge-error,.ffc-badge-info,.ffc-badge-warning,.ffc-status-pill--info,.ffc-status-pill--success,.ffc-status-pill--warning{border:1px solid CanvasText}}.ffc-preflight-stats-badges{margin:0 0 var(--ffc-spacing-md) 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:var(--ffc-spacing-xs)}.ffc-preflight-badge{background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm);border-left:3px solid var(--ffc-primary);padding:0}.ffc-preflight-badge a{display:flex;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);text-decoration:none;color:var(--ffc-text);font-size:var(--ffc-font-size-sm)}.ffc-preflight-badge a:focus,.ffc-preflight-badge a:hover{background:var(--ffc-primary-light)}.ffc-preflight-badge-icon{display:inline-flex;flex-shrink:0;color:var(--ffc-primary)}.ffc-preflight-badge strong{font-size:var(--ffc-font-size-lg);color:var(--ffc-primary);min-width:2ch;text-align:right}.ffc-page-identities .ffc-identity-counts,.ffc-page-identities .ffc-identity-scan{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-xs) var(--ffc-spacing-md);margin:var(--ffc-spacing-md) 0;padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-scan-whole{border-left:4px solid var(--ffc-success-border)}.ffc-page-identities .ffc-identity-scan-partial{border-left:4px solid var(--ffc-warning-border)}.ffc-page-identities .ffc-identity-scan-none{border-left:4px solid var(--ffc-danger-border)}.ffc-page-identities .ffc-identity-scan-verdict{margin:0;font-weight:600}.ffc-page-identities .ffc-identity-scan-detail,.ffc-page-identities .ffc-identity-scan-when{margin:0;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-sm)}.ffc-page-identities .ffc-identity-scan-when{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-2xs);margin-left:auto}.ffc-page-identities .ffc-identity-scan-when form{margin:0}.ffc-page-identities .ffc-identity-counts-total{font-weight:600;white-space:nowrap}.ffc-page-identities .ffc-identity-count{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);border:1px solid transparent;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);white-space:nowrap}.ffc-page-identities .ffc-identity-counts-done{color:var(--ffc-success-text);font-weight:600;white-space:nowrap}.ffc-page-identities .ffc-identity-counts-note{margin:0}.ffc-page-identities .ffc-identity-counts-export{margin-left:auto}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-counts-export,.ffc-page-identities .ffc-identity-scan-when{margin-left:0}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-count{border:1px solid CanvasText}.ffc-page-identities .ffc-identity-scan-none,.ffc-page-identities .ffc-identity-scan-partial,.ffc-page-identities .ffc-identity-scan-whole{border-left:4px solid CanvasText}}.ffc-page-identities .ffc-identity-panel{margin:var(--ffc-spacing-lg) 0;background:var(--ffc-bg-card);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-panel-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);background:var(--ffc-bg-alt);border-bottom:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-panel-title{margin:0;font-size:var(--ffc-font-size-lg)}.ffc-page-identities .ffc-identity-panel-note{flex:1 1 18em;margin:0}.ffc-page-identities .ffc-identity-panel-body{padding:var(--ffc-spacing-md)}.ffc-page-identities .ffc-identity-panel-chip{flex-shrink:0;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-2xs);border:1px solid transparent;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-2xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;white-space:nowrap}.ffc-page-identities .ffc-identity-chip-mechanical{background:var(--ffc-success-bg);border-color:var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-chip-isolated{background:var(--ffc-danger-bg);border-color:var(--ffc-danger-border);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-chip-decision{background:var(--ffc-warning-bg);border-color:var(--ffc-warning-border);color:var(--ffc-warning-text)}.ffc-page-identities .ffc-identity-chip-shared{background:var(--ffc-info-bg);border-color:var(--ffc-info-border);color:var(--ffc-info-text)}.ffc-page-identities .ffc-identity-chip-mailbox{background:var(--ffc-bg-alt);border-color:var(--ffc-border);color:var(--ffc-text)}.ffc-page-identities .ffc-identity-chip-accepted{background:var(--ffc-bg-alt);border-color:var(--ffc-border);border-style:dashed;color:var(--ffc-text)}.ffc-page-identities .ffc-identity-accept{margin-top:var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xs)}.ffc-page-identities .ffc-identity-accept>summary{cursor:pointer;color:var(--ffc-gray-600)}.ffc-page-identities .ffc-identity-panel-nav{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-2xs);margin-left:auto}.ffc-page-identities .ffc-identity-panel-count{font-variant-numeric:tabular-nums;white-space:nowrap}.ffc-page-identities .ffc-identity-panel-step{display:inline-flex;align-items:center;min-height:44px;padding:0 var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-panel-step-next,.ffc-page-identities .ffc-identity-panel-step-previous{justify-content:center;min-width:40px;min-height:40px;padding:0}.ffc-page-identities .ffc-identity-panel-step [class*=ffc-icon-chevron]{font-size:var(--ffc-font-size-lg);line-height:1}.ffc-page-identities .ffc-identity-panel-step [class*=ffc-icon-chevron]::before{margin-right:0}.ffc-page-identities .ffc-identity-panel-step[aria-disabled=true]{opacity:.5;pointer-events:none}.ffc-page-identities .ffc-identity-panel-toggle{white-space:nowrap}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-panel-nav{margin-left:0;width:100%}.ffc-page-identities .ffc-identity-panel-step{flex-grow:1;justify-content:center}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-chip-decision,.ffc-page-identities .ffc-identity-chip-isolated,.ffc-page-identities .ffc-identity-chip-mailbox,.ffc-page-identities .ffc-identity-chip-mechanical,.ffc-page-identities .ffc-identity-chip-shared{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-cards{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-page-identities .ffc-identity-card{display:flex;align-items:stretch;background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-card-main{flex:1 1 0;min-width:18em;display:flex;flex-direction:column;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg)}.ffc-page-identities .ffc-identity-card-who{margin:0;font-size:var(--ffc-font-size-lg);font-weight:600}.ffc-page-identities .ffc-identity-card-says{margin:0}.ffc-page-identities .ffc-identity-card-hashes{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-xs)}.ffc-page-identities .ffc-identity-card-hash{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);border:1px solid transparent;border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-card-hash code{background:0 0;color:inherit;font-size:var(--ffc-font-size-xs);padding:0}.ffc-page-identities .ffc-identity-card-said{font-size:var(--ffc-font-size-xs);font-weight:600}.ffc-page-identities .ffc-identity-card-hash-bad{background:var(--ffc-danger-bg);border-color:var(--ffc-danger-border);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-card-hash-ok{background:var(--ffc-success-bg);border-color:var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-card-hash-plain,.ffc-page-identities .ffc-identity-card-hash-unknown{background:var(--ffc-bg-alt);border-color:var(--ffc-border);color:var(--ffc-text-secondary)}.ffc-page-identities .ffc-identity-panel-body a{color:var(--ffc-link)}.ffc-page-identities .ffc-identity-panel-body a:focus,.ffc-page-identities .ffc-identity-panel-body a:hover{color:var(--ffc-link-hover)}.ffc-page-identities .ffc-identity-card-arrow{color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-page-identities .ffc-identity-card-rows{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-2xs) var(--ffc-spacing-md);margin:0;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-sm)}.ffc-page-identities .ffc-identity-card-rowset{display:inline-flex;align-items:baseline;gap:var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-card-rowset code{background:0 0;color:inherit;font-size:var(--ffc-font-size-xs);padding:0}.ffc-page-identities .ffc-identity-card-main .ffc-identity-orphan-has{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-2xs) var(--ffc-spacing-md);padding-left:0;list-style:none}.ffc-page-identities .ffc-identity-card-where{margin:0;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-sm)}.ffc-page-identities .ffc-identity-card-act{flex:0 0 17em;display:flex;flex-direction:column;justify-content:center;gap:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-md);background:var(--ffc-bg-alt);color:var(--ffc-text);border-left:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-verb+.ffc-identity-card-verb{margin-top:var(--ffc-spacing-sm);padding-top:var(--ffc-spacing-sm);border-top:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ){flex:0 1 54em;flex-direction:row;flex-wrap:wrap;align-items:flex-start;justify-content:flex-start}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ) .ffc-identity-card-verb{flex:1 1 16em}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ) .ffc-identity-card-verb+.ffc-identity-card-verb{margin-top:0;margin-left:var(--ffc-spacing-sm);padding-top:0;padding-left:var(--ffc-spacing-sm);border-top:0;border-left:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-verb-head{display:flex;align-items:baseline;gap:var(--ffc-spacing-3xs);margin:0 0 var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-card-verb-head code{background:0 0;color:inherit;font-size:var(--ffc-font-size-xs);padding:0}.ffc-page-identities .ffc-identity-card-route{margin:var(--ffc-spacing-2xs) 0 var(--ffc-spacing-3xs);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-text-muted)}.ffc-page-identities .ffc-identity-card-act form{margin:0}.ffc-page-identities .ffc-identity-card-act .button{min-height:44px;padding-top:var(--ffc-spacing-2xs);padding-bottom:var(--ffc-spacing-2xs)}.ffc-page-identities .ffc-identity-ack{display:flex;align-items:flex-start;gap:var(--ffc-spacing-2xs);max-width:22em;line-height:1.5}.ffc-page-identities .ffc-identity-ack[hidden]{display:none}.ffc-page-identities .ffc-identity-ack input[type=checkbox]{flex-shrink:0;margin-top:.2em}.ffc-page-identities .ffc-identity-card-act .button,.ffc-page-identities .ffc-identity-card-act input[type=email],.ffc-page-identities .ffc-identity-card-act input[type=number],.ffc-page-identities .ffc-identity-card-act input[type=text]{vertical-align:middle}.ffc-page-identities .ffc-identity-card-act input[type=email],.ffc-page-identities .ffc-identity-card-act input[type=number],.ffc-page-identities .ffc-identity-card-act input[type=text]{min-height:44px;width:14em}.ffc-page-identities .ffc-identity-card-act .button-primary{font-weight:600}.ffc-page-identities .ffc-identity-find{display:inline-flex;align-items:center;gap:var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-find .ffc-icon-search::before{margin-right:0}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-card{flex-direction:column}.ffc-page-identities .ffc-identity-card-act{flex:0 0 auto;border-left:0;border-top:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-card-act:has( .ffc-identity-card-verb + .ffc-identity-card-verb ) .ffc-identity-card-verb+.ffc-identity-card-verb{margin-top:var(--ffc-spacing-sm);margin-left:0;padding-top:var(--ffc-spacing-sm);padding-left:0;border-top:1px solid var(--ffc-border);border-left:0}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-card-hash{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-dialog{position:fixed;inset:0;z-index:var(--ffc-z-modal);display:flex;align-items:flex-start;justify-content:center;padding:var(--ffc-spacing-2xl);overflow-y:auto}.ffc-page-identities .ffc-identity-dialog[hidden]{display:none}.ffc-page-identities .ffc-identity-dialog-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-page-identities .ffc-identity-dialog-panel{position:relative;z-index:var(--ffc-z-raised);width:100%;max-width:850px;background:var(--ffc-bg-card);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-lg)}.ffc-page-identities .ffc-identity-dialog-head{display:flex;align-items:flex-start;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl) var(--ffc-spacing-md);border-bottom:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-dialog-heading{flex-grow:1}.ffc-page-identities .ffc-identity-dialog-head h2{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xl)}.ffc-page-identities .ffc-identity-dialog-sub{margin:0;font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted)}.ffc-page-identities .ffc-identity-dialog-close{min-width:44px;min-height:44px;padding:0;font-size:var(--ffc-font-size-2xl);line-height:1;color:var(--ffc-text-muted);background:0 0;border:none;cursor:pointer}.ffc-page-identities .ffc-identity-dialog-close:focus,.ffc-page-identities .ffc-identity-dialog-close:hover{color:var(--ffc-text)}.ffc-page-identities .ffc-identity-dialog-body{display:flex;flex-direction:column;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl)}.ffc-page-identities .ffc-identity-dialog-suggestion-has{padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success);border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-dialog-suggestion-head{display:block;margin-bottom:var(--ffc-spacing-xs);font-size:var(--ffc-font-size-2xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase}.ffc-page-identities .ffc-identity-dialog-search label{display:block;margin-bottom:var(--ffc-spacing-2xs);font-weight:600}.ffc-page-identities .ffc-identity-dialog-search input{width:100%;min-height:44px}.ffc-page-identities .ffc-identity-dialog-count{padding:var(--ffc-spacing-xs) var(--ffc-spacing-md);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-text-muted);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);border-bottom:none}.ffc-page-identities .ffc-identity-dialog-result{display:flex;align-items:center;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-md);border:1px solid var(--ffc-border);border-top:none;cursor:pointer}.ffc-page-identities .ffc-identity-dialog-suggestion .ffc-identity-dialog-result{padding:0;background:0 0;border:none}.ffc-page-identities .ffc-identity-dialog-result-refused{background:var(--ffc-bg-alt);cursor:not-allowed}.ffc-page-identities .ffc-identity-dialog-who{display:flex;flex-direction:column;flex-grow:1;gap:var(--ffc-spacing-3xs)}.ffc-page-identities .ffc-identity-dialog-meta{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-page-identities .ffc-identity-dialog-verdict{padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);font-weight:600;white-space:nowrap;border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-dialog-verdict-ok{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-dialog-verdict-refused{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-dialog-column,.ffc-page-identities .ffc-identity-dialog-rule{margin:0;padding-left:var(--ffc-spacing-md);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);border-left:3px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-dialog-foot{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border-top:1px solid var(--ffc-border)}.ffc-page-identities .ffc-identity-dialog-foot .button{min-height:44px}.ffc-page-identities .ffc-identity-chosen{display:inline-block;margin-left:var(--ffc-spacing-xs);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-success-text)}@media screen and (max-width:782px){.ffc-page-identities .ffc-identity-dialog{padding:var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-dialog-result{flex-wrap:wrap}}@media (forced-colors:active){.ffc-page-identities .ffc-identity-dialog-verdict-ok,.ffc-page-identities .ffc-identity-dialog-verdict-refused{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-verdict{margin-top:var(--ffc-spacing-xs)}.ffc-page-identities .ffc-identity-verdict-line{margin:0 0 var(--ffc-spacing-2xs);padding:var(--ffc-spacing-xs) var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-verdict-ok{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-verdict-warn{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-page-identities .ffc-identity-verdict-bad{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-correct-instead{margin-top:var(--ffc-spacing-xl);padding:var(--ffc-spacing-lg);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-correct-instead h4{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-base)}.ffc-page-identities .ffc-identity-correct-one{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-sm);margin-top:var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-correct-one label{min-width:14em;font-weight:600}@media (forced-colors:active){.ffc-page-identities .ffc-identity-verdict-bad,.ffc-page-identities .ffc-identity-verdict-ok,.ffc-page-identities .ffc-identity-verdict-warn{border:1px solid CanvasText}}.ffc-page-identities .ffc-identity-pair{margin-bottom:var(--ffc-spacing-xl);padding:var(--ffc-spacing-lg);background:var(--ffc-bg-card);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-page-identities .ffc-identity-pair-subject{margin:0 0 var(--ffc-spacing-sm)}.ffc-page-identities .ffc-identity-pair-choice{margin:0 0 var(--ffc-spacing-md);padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-xs)}.ffc-page-identities .ffc-identity-pair-choice legend{padding:0 var(--ffc-spacing-2xs);font-weight:600}.ffc-page-identities .ffc-identity-pair-choice label{display:block;padding:var(--ffc-spacing-2xs) 0}.ffc-page-identities .ffc-identity-pair-basis{margin:0 0 var(--ffc-spacing-2xs)}.ffc-page-identities .ffc-identity-pair-evidence{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);margin:0 0 var(--ffc-spacing-2xs) var(--ffc-spacing-md)}.ffc-page-identities .ffc-identity-preview-region:not(:empty){margin-bottom:var(--ffc-spacing-md);padding:var(--ffc-spacing-md);background:var(--ffc-bg-alt);border-left:3px solid var(--ffc-warning)}.ffc-page-identities .ffc-identity-preview-line{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xs)}.ffc-page-identities .ffc-identity-preview-head{font-size:var(--ffc-font-size-base);font-weight:600}.ffc-page-identities .ffc-identity-preview-total{font-weight:600}.ffc-page-identities .ffc-identity-preview-bad{color:var(--ffc-danger-text)}.ffc-page-identities .ffc-identity-preview-stores{margin:0 0 var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-xs);list-style:disc}.ffc-page-identities .ffc-identity-merge-one .button{min-height:44px}.ffc-page-identities .ffc-identity-chip-orphans{background:var(--ffc-accent-bg);border-color:var(--ffc-accent-border);color:var(--ffc-accent-text)}.ffc-page-identities .ffc-identity-orphan-has{margin:0;font-size:var(--ffc-font-size-xs)}.ffc-page-identities .ffc-identity-orphan-present{color:var(--ffc-success-text)}.ffc-page-identities .ffc-identity-orphan-missing{color:var(--ffc-danger-text);font-weight:600}@media (forced-colors:active){.ffc-page-identities .ffc-identity-chip-orphans{border:1px solid CanvasText}} /*# sourceMappingURL=ffc-admin.min.css.map */ \ No newline at end of file diff --git a/assets/css/ffc-frontend.css b/assets/css/ffc-frontend.css index f9921b8cf..160b96f02 100644 --- a/assets/css/ffc-frontend.css +++ b/assets/css/ffc-frontend.css @@ -180,6 +180,25 @@ color: var(--ffc-warning-text); } +/* Per-question verdict after a quiz attempt (#1730): the word carries the + meaning, the colour and the icon only repeat it. */ +.ffc-shortcode .ffc-quiz-verdict { + display: flex; + align-items: center; + gap: var(--ffc-spacing-2xs); + margin: var(--ffc-spacing-xs) 0 0; + font-size: var(--ffc-font-size-sm); + font-weight: 600; +} + +.ffc-shortcode .ffc-quiz-right .ffc-quiz-verdict { + color: var(--ffc-success-text); +} + +.ffc-shortcode .ffc-quiz-wrong .ffc-quiz-verdict { + color: var(--ffc-danger-text); +} + /* ============================================ INFO BLOCK - v4.9.0 ============================================ */ diff --git a/assets/css/ffc-frontend.min.css b/assets/css/ffc-frontend.min.css index f867debc0..1acdbbfd7 100644 --- a/assets/css/ffc-frontend.min.css +++ b/assets/css/ffc-frontend.min.css @@ -1,2 +1,2 @@ -.ffc-shortcode :is(input,select,textarea,button){font-family:inherit}.ffc-shortcode .ffc-input{width:100%!important;max-width:none!important;height:45px!important;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg)!important;border:1px solid var(--ffc-border)!important;border-radius:var(--ffc-radius-sm)!important;font-size:var(--ffc-font-size-xl)!important;line-height:1.5!important;box-sizing:border-box!important;background-color:var(--ffc-bg-input)!important;color:var(--ffc-text);display:block!important;margin-bottom:var(--ffc-spacing-xl);transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base);-webkit-appearance:none}.ffc-shortcode .ffc-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-form-field textarea.ffc-textarea,.ffc-shortcode textarea.ffc-input,.ffc-shortcode.ffc-form-wrapper textarea.ffc-input{height:auto!important;min-height:45px!important;max-height:300px!important;overflow-y:auto!important;resize:vertical!important}.ffc-shortcode.ffc-form-wrapper{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-form-title{margin:0 0 25px 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);text-align:center;font-weight:600;width:100%}.ffc-shortcode .ffc-submission-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-submission-form:has(.ffc-success-response){max-width:100%}.ffc-shortcode .ffc-form-field{margin-bottom:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-form-field label{display:block;margin-bottom:var(--ffc-spacing-sm);font-weight:500;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-xl);text-transform:none}.ffc-shortcode .ffc-field-legend .ffc-required,.ffc-shortcode .ffc-form-field label .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-radio-group{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-radio-group label{display:flex;align-items:center;gap:var(--ffc-spacing-sm);font-weight:400;cursor:pointer}.ffc-shortcode fieldset.ffc-choice-field{border:0;margin:0 0 var(--ffc-spacing-2xl);padding:0;min-width:0}.ffc-shortcode .ffc-field-legend{display:block;padding:0;margin-bottom:var(--ffc-spacing-sm);font-weight:500;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-radio-group label.is-disabled{color:var(--ffc-text-muted);cursor:not-allowed}.ffc-shortcode .ffc-field-counter,.ffc-shortcode .ffc-field-hint{margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary)}.ffc-shortcode .ffc-field-legend+.ffc-field-hint{margin:0 0 var(--ffc-spacing-sm)}.ffc-shortcode .ffc-input+.ffc-field-hint,.ffc-shortcode .ffc-input+.ffc-length-counter{margin-top:calc(var(--ffc-spacing-xl) * -1 + var(--ffc-spacing-xs))}.ffc-shortcode .ffc-length-counter{text-align:right}.ffc-shortcode .ffc-length-counter.is-below-min{color:var(--ffc-warning-text)}.ffc-shortcode .ffc-form-info-block{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-schedule-exception-banner{max-width:calc(var(--ffc-form-width) - 150px);margin-left:auto;margin-right:auto;border:2px solid var(--ffc-primary);border-left-width:2px}.ffc-shortcode .ffc-schedule-exception-banner p{margin:0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-info-title{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-shortcode .ffc-info-content{font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text-secondary)}.ffc-shortcode .ffc-info-content p{margin:0 0 var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-info-content p:last-child{margin-bottom:0}.ffc-shortcode .ffc-info-content a{color:var(--ffc-link);text-decoration:underline}.ffc-shortcode .ffc-info-content a:hover{color:var(--ffc-link-hover)}.ffc-shortcode .ffc-info-content ol,.ffc-shortcode .ffc-info-content ul{margin:var(--ffc-spacing-sm) 0;padding-left:var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-form-embed-block{margin-bottom:var(--ffc-spacing-2xl);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-embed-caption{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted);font-style:italic}.ffc-shortcode .ffc-embed-media{max-width:var(--ffc-form-width);width:100%}.ffc-shortcode .ffc-embed-media iframe{max-width:100%;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-embed-image{max-width:100%;height:auto;border-radius:var(--ffc-radius-sm);display:block}.ffc-shortcode .ffc-embed-media a{color:var(--ffc-link);word-break:break-all}.ffc-shortcode .ffc-lgpd-consent{margin:25px 0 var(--ffc-spacing-2xl) 0;padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring)}.ffc-shortcode .ffc-consent-label{display:flex;align-items:flex-start;gap:var(--ffc-spacing-lg);cursor:pointer;margin-bottom:0;font-weight:400}.ffc-shortcode .ffc-consent-label input[type=checkbox]{width:20px;height:20px;min-width:20px;margin:var(--ffc-spacing-3xs) 0 0 0;cursor:pointer;flex-shrink:0;accent-color:var(--ffc-primary)}.ffc-shortcode .ffc-consent-text{flex:1;font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline;font-weight:500;transition:color var(--ffc-transition-base)}.ffc-shortcode .ffc-consent-text a:hover{color:var(--ffc-link-hover);text-decoration:none}.ffc-shortcode .ffc-consent-text .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-consent-description{margin:var(--ffc-spacing-lg) 0 0 0;padding:var(--ffc-spacing-lg);background:var(--ffc-bg);border-left:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);line-height:1.5;color:var(--ffc-text-muted);box-sizing:border-box}.ffc-shortcode .ffc-consent-description a{color:var(--ffc-link);text-decoration:none;font-weight:500}.ffc-shortcode .ffc-consent-description a:hover{text-decoration:underline}details.ffc-consent-description>summary{cursor:pointer;list-style:none;outline:0}details.ffc-consent-description>summary::-webkit-details-marker{display:none}details.ffc-consent-description>summary::marker{content:''}details.ffc-consent-description>summary:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-device-disclosure-more{margin-left:var(--ffc-spacing-2xs);color:var(--ffc-link);text-decoration:underline;font-weight:500}details.ffc-consent-description[open]>summary>.ffc-device-disclosure-more{text-decoration:none}details.ffc-consent-description>p{margin:var(--ffc-spacing-sm) 0 0 0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:invalid{outline:2px solid var(--ffc-danger);outline-offset:2px}.ffc-shortcode .ffc-consent-label input[type=checkbox]:valid{outline:0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}@media (max-width:768px){.ffc-shortcode .ffc-lgpd-consent{padding:var(--ffc-spacing-xl);margin:var(--ffc-spacing-2xl) 0 var(--ffc-spacing-xl) 0}.ffc-shortcode .ffc-consent-label{gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-consent-text{font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-consent-description{margin-left:0;font-size:var(--ffc-font-size-xs)}}@media (prefers-contrast:more){.ffc-shortcode .ffc-lgpd-consent{border-width:3px;border-color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text{color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline}}@media print{.ffc-shortcode .ffc-lgpd-consent{display:none}}.ffc-shortcode .ffc-security-container{margin-top:25px;padding-top:25px;border-top:1px solid var(--ffc-border-light);width:100%}.ffc-shortcode .ffc-altcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-altcha-row altcha-widget{--altcha-max-width:100%;display:block;width:100%;font-family:var(--ffc-font-family);font-size:var(--ffc-font-size-xl);--altcha-border-color:var(--ffc-border);--altcha-border-radius:var(--ffc-radius-sm);--altcha-checkbox-border-color:var(--ffc-border);--altcha-color-base:var(--ffc-bg-input);--altcha-color-base-content:var(--ffc-text);--altcha-color-error:var(--ffc-danger);--altcha-color-primary:var(--ffc-primary);--altcha-color-success:var(--ffc-success);--altcha-spinner-color:var(--ffc-primary)}.ffc-shortcode .ffc-altcha-error,.ffc-shortcode .ffc-altcha-noscript{margin:var(--ffc-spacing-md) 0 0;color:var(--ffc-danger);font-weight:600}.ffc-shortcode .ffc-captcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-captcha-row label{display:block;margin-bottom:var(--ffc-spacing-md);font-weight:600;color:var(--ffc-primary);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-captcha-row .ffc-input{color:var(--ffc-text);border:2px solid var(--ffc-primary)!important;background:var(--ffc-bg-input)!important;margin-bottom:0!important}.ffc-shortcode .ffc-captcha-row .ffc-input:focus{border-color:var(--ffc-primary-hover);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-submit-btn{width:100%;padding:var(--ffc-spacing-xl);background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:none;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-weight:600;cursor:pointer;transition:background var(--ffc-transition-slow),transform .1s;box-sizing:border-box}.ffc-shortcode .ffc-submit-btn:hover{background:var(--ffc-primary-hover)}.ffc-shortcode .ffc-submit-btn:active{transform:scale(.98)}.ffc-shortcode .ffc-submit-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-submit-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none}.ffc-shortcode .ffc-message{margin-top:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-message.ffc-success{background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-message.ffc-error{background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border)}.ffc-shortcode.ffc-verification-container{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-header{margin-bottom:30px;text-align:center;width:100%}.ffc-shortcode .ffc-verification-header h2{margin:0 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);font-weight:600}.ffc-shortcode .ffc-verification-header p{margin:0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-verification-manual,.ffc-shortcode.ffc-verification-manual{width:100%;display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-verify-input{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border:2px solid var(--ffc-border-light);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-family:monospace;text-transform:uppercase;letter-spacing:2px;text-align:center;background:var(--ffc-bg-input);color:var(--ffc-text);transition:border-color var(--ffc-transition-slow)}.ffc-shortcode .ffc-verify-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-no-js-security{margin-top:var(--ffc-spacing-2xs);width:100%}.ffc-shortcode .ffc-verify-result{margin-top:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-verify-error{padding:var(--ffc-spacing-xl);background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success{padding:var(--ffc-spacing-2xl);background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-verify-success h3{margin:0 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success p{margin:var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success hr{margin:var(--ffc-spacing-xl) 0;border:none;border-top:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-verify-success h4{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode.ffc-magic-link-container{position:relative;min-height:200px}.ffc-shortcode .ffc-certificate-preview{width:100%;max-width:700px;margin:0 auto;background:var(--ffc-bg-card);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);overflow:hidden;box-shadow:0 4px 12px var(--ffc-focus-ring);animation:fadeInUp .5s ease}@keyframes fadeInUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.ffc-shortcode .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);padding:var(--ffc-spacing-2xl);text-align:center}.ffc-shortcode .ffc-status-badge{display:inline-block;font-size:var(--ffc-font-size-2xl);font-weight:600;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl);background:rgba(255,255,255,.2);border-radius:20px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-success{background:rgba(212,237,218,.3)}.ffc-shortcode .ffc-certificate-preview.ffc-error{border-color:var(--ffc-danger);box-shadow:0 4px 12px var(--ffc-danger-bg)}.ffc-shortcode .ffc-certificate-preview.ffc-error .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-danger) 0,var(--ffc-danger-hover) 100%)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-error{background:rgba(252,240,241,.25)}.ffc-shortcode .ffc-error-message{margin:0 0 var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-lg);line-height:1.5;color:var(--ffc-text)}.ffc-shortcode .ffc-manual-verification-form{padding-top:var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-manual-verification-form h4{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text-secondary);border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-auth-code{width:100%;max-width:320px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);font-family:'Courier New',monospace;margin:0 0 var(--ffc-spacing-lg);box-sizing:border-box}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-verify-btn{display:inline-block;padding:var(--ffc-spacing-md) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-preview-body{padding:30px}.ffc-shortcode .ffc-preview-body h3{margin:0 0 var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-xl);color:var(--ffc-text);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-preview-body h4{margin:25px 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-lg);color:var(--ffc-text-secondary);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-detail-row{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-lg) 0;border-bottom:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-detail-row:last-child{border-bottom:none}.ffc-shortcode .ffc-detail-row .ffc-detail-label{font-weight:600;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{color:var(--ffc-text);font-size:var(--ffc-font-size-base);text-align:right;max-width:60%;overflow-wrap:break-word}.ffc-shortcode .ffc-detail-row .ffc-detail-value.ffc-detail-value-code{font-family:'Courier New',monospace;font-size:var(--ffc-font-size-lg);color:var(--ffc-primary);font-weight:600;letter-spacing:1px}.ffc-shortcode .ffc-preview-body hr{margin:var(--ffc-spacing-2xl) 0;border:none;border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-verification-status{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);font-weight:600;text-transform:uppercase}.ffc-shortcode .ffc-verification-status-pending{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-shortcode .ffc-verification-status-confirmed{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-cancelled{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-completed{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-no_show{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-verification-status-in_progress{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-submitted{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-approved{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-rejected{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-expired{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block{margin:25px 0 var(--ffc-spacing-2xs);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-preview-body .ffc-schedule-exception-block h4{display:flex;align-items:center;gap:var(--ffc-spacing-sm);margin:0 0 var(--ffc-spacing-sm);padding-bottom:var(--ffc-spacing-sm);border-bottom:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-schedule-exception-icon{width:18px;height:18px;flex-shrink:0}.ffc-shortcode .ffc-schedule-exception-block .description{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row{border-bottom-color:var(--ffc-warning-border);padding:var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row:last-child{border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-preview-actions{padding:25px 30px;text-align:center;background:var(--ffc-bg-alt);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-download-btn{display:inline-block;background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);border:none;padding:var(--ffc-spacing-xl) 40px;font-size:var(--ffc-font-size-xl);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all var(--ffc-transition-slow);box-shadow:0 4px 12px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:hover{transform:translateY(-2px);box-shadow:0 6px 16px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:active{transform:translateY(0);box-shadow:var(--ffc-shadow-sm)}.ffc-shortcode .ffc-download-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-download-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none;box-shadow:none}.ffc-shortcode.ffc-has-geofence .ffc-submission-form{display:none!important}.ffc-shortcode.ffc-has-geofence.ffc-validated .ffc-submission-form{display:block!important}.ffc-shortcode .ffc-geofence-loading-msg{text-align:center;padding:30px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-geofence-loading-msg p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-geofence-blocked{background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-blocked p{margin:0;color:var(--ffc-warning-text);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-geofence-reload-btn{margin-top:var(--ffc-spacing-lg)}.ffc-shortcode .ffc-geofence-admin-bypass{background:var(--ffc-info-bg);border-left:4px solid var(--ffc-info-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-admin-bypass p{margin:0;color:var(--ffc-info-text);font-size:var(--ffc-font-size-base);font-weight:500}.ffc-shortcode .ffc-geofence-bypass-badge{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);margin:0 0 var(--ffc-spacing-sm) 0;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);background:var(--ffc-info-bg);color:var(--ffc-info-text);font-size:var(--ffc-font-size-xs);font-weight:600;line-height:1.4;cursor:help}.ffc-shortcode .ffc-verify-loading{text-align:center;padding:60px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-verify-loading p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-spinner{width:50px;height:50px;margin:0 auto;border:4px solid var(--ffc-border-light);border-top:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media (max-width:768px){.ffc-shortcode .ffc-certificate-preview,.ffc-shortcode.ffc-form-wrapper,.ffc-shortcode.ffc-verification-container{padding:var(--ffc-spacing-2xl);margin:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-form-title,.ffc-shortcode .ffc-verification-header h2{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-detail-row{flex-direction:column;align-items:flex-start;gap:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{text-align:left;max-width:100%}.ffc-shortcode .ffc-download-btn{width:100%;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-preview-body h3{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-status-badge{font-size:var(--ffc-font-size-xl)}}@media print{.ffc-shortcode .ffc-preview-actions,.ffc-shortcode .ffc-preview-header,.ffc-shortcode .ffc-submit-btn{display:none}.ffc-shortcode .ffc-certificate-preview{border:none;box-shadow:none}}.ffc-shortcode .ffc-success-auth-code .ffc-detail-value.ffc-detail-value-code{display:inline-flex;align-items:center;gap:var(--ffc-spacing-sm);flex-wrap:wrap;justify-content:flex-end}.ffc-shortcode .ffc-success-code{white-space:nowrap}.ffc-shortcode .ffc-success-row-hint{margin:var(--ffc-spacing-xs) 0 var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);line-height:1.5}.ffc-shortcode .ffc-detail-row.ffc-success-magic-link-row{justify-content:flex-start;gap:var(--ffc-spacing-md);flex-wrap:wrap}.ffc-shortcode .ffc-magic-link-url{color:var(--ffc-primary);text-decoration:underline;font-family:'Courier New',monospace;font-size:var(--ffc-font-size-sm);word-break:break-all;flex:1 1 200px;min-width:0}.ffc-shortcode .ffc-copy-btn{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border:1px solid var(--ffc-primary);background:0 0;color:var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-family:inherit;font-size:var(--ffc-font-size-xs);font-weight:600;letter-spacing:normal;line-height:1.4;cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.ffc-shortcode .ffc-copy-btn:focus,.ffc-shortcode .ffc-copy-btn:hover{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-shortcode .ffc-success-where-is-file{max-width:calc(var(--ffc-form-width) - 150px);margin:var(--ffc-spacing-xl) auto 0;padding:0;text-align:left;box-sizing:border-box}.ffc-shortcode .ffc-success-where-title{cursor:pointer;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);list-style:revert;padding:0}.ffc-shortcode .ffc-success-where-is-file[open] .ffc-success-where-title{margin-bottom:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-success-where-is-file ul{margin:0;padding-left:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-success-where-is-file li{font-size:var(--ffc-font-size-base);line-height:1.5;margin:var(--ffc-spacing-2xs) 0}.ffc-preflight-banner{border:1px solid var(--ffc-warning-border);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);padding:var(--ffc-spacing-xl) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);margin:var(--ffc-spacing-lg) 0;text-align:left}.ffc-preflight-banner-title{display:block;font-size:var(--ffc-font-size-lg);margin-bottom:var(--ffc-spacing-xs);color:var(--ffc-warning-text)}.ffc-preflight-banner-body,.ffc-preflight-banner-how{margin:var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-preflight-banner-how{color:var(--ffc-warning-text);font-style:italic}.ffc-preflight-try-anyway{display:inline-block;margin-top:var(--ffc-spacing-md);padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:0 0;color:var(--ffc-warning-text);border:1px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm);font-weight:600;cursor:pointer;transition:background .15s ease}.ffc-preflight-try-anyway:focus,.ffc-preflight-try-anyway:hover{background:var(--ffc-warning);color:var(--ffc-text-on-warning)}.ffc-submit-btn.ffc-btn-loading{opacity:.7;cursor:not-allowed}.ffc-public-csv-download .ffc-info-screen{width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header{display:flex;align-items:center;gap:var(--ffc-spacing-lg);margin-bottom:var(--ffc-spacing-3xl);padding-bottom:var(--ffc-spacing-xl);border-bottom:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header h2{margin:0;font-size:var(--ffc-font-size-2xl);font-weight:600;color:var(--ffc-text);flex:1}.ffc-public-csv-download .ffc-info-back{background:0 0;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);white-space:nowrap}.ffc-public-csv-download .ffc-info-back:hover{border-color:var(--ffc-primary);color:var(--ffc-primary)}.ffc-public-csv-download .ffc-info-back-arrow{font-size:var(--ffc-font-size-lg);line-height:1}.ffc-public-csv-download .ffc-info-section{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm,6px);border:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-section h3{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);font-weight:600;color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.5px}.ffc-public-csv-download .ffc-info-section.ffc-info-summary{background:var(--ffc-bg-card);border-color:var(--ffc-primary);border-left:3px solid var(--ffc-primary)}.ffc-public-csv-download .ffc-info-row{display:flex;justify-content:space-between;align-items:center;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-xs) 0;width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-row+.ffc-info-row{border-top:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-label{font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-value{font-size:var(--ffc-font-size-base);font-weight:500;color:var(--ffc-text);text-align:right}.ffc-public-csv-download .ffc-info-subsection{margin-bottom:var(--ffc-spacing-sm)}.ffc-public-csv-download .ffc-info-subsection:last-child{margin-bottom:0}.ffc-public-csv-download .ffc-info-sublabel{font-size:var(--ffc-font-size-sm);font-weight:500;color:var(--ffc-text-muted);display:block;margin-bottom:var(--ffc-spacing-2xs)}.ffc-public-csv-download .ffc-info-list{margin:0;padding:0 0 0 var(--ffc-spacing-2xl);list-style:disc}.ffc-public-csv-download .ffc-info-list li{font-size:var(--ffc-font-size-base);color:var(--ffc-text);padding:var(--ffc-spacing-3xs) 0}.ffc-public-csv-download .ffc-info-list-restrictions li{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-list-locations li a{color:var(--ffc-primary);text-decoration:none}.ffc-public-csv-download .ffc-info-list-locations li a:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-alert{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);line-height:1.5;margin-top:var(--ffc-spacing-lg)}.ffc-public-csv-download .ffc-info-alert-warning{background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text)}.ffc-public-csv-download .ffc-info-alert-info{background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);color:var(--ffc-info-text)}.ffc-public-csv-download .ffc-info-alert-success{background:var(--ffc-success-bg);border:1px solid var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-public-csv-download .ffc-info-actions{display:flex;gap:var(--ffc-spacing-lg);margin-top:var(--ffc-spacing-3xl);flex-wrap:wrap;width:100%;box-sizing:border-box}.ffc-extend-end-modal .ffc-info-btn,.ffc-open-early-modal .ffc-info-btn,.ffc-public-csv-download .ffc-info-btn{flex:1;min-width:160px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);border:none;border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);font-weight:600;cursor:pointer;transition:all .2s ease;text-align:center}.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-extend-end-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-primary:hover:not([disabled]){background:var(--ffc-primary-hover)}.ffc-extend-end-modal .ffc-info-btn-primary[disabled],.ffc-open-early-modal .ffc-info-btn-primary[disabled],.ffc-public-csv-download .ffc-info-btn-primary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-secondary,.ffc-open-early-modal .ffc-info-btn-secondary,.ffc-public-csv-download .ffc-info-btn-secondary{background:var(--ffc-bg-alt);color:var(--ffc-text);border:1px solid var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-secondary:hover:not([disabled]){background:var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary[disabled],.ffc-open-early-modal .ffc-info-btn-secondary[disabled],.ffc-public-csv-download .ffc-info-btn-secondary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-warning,.ffc-open-early-modal .ffc-info-btn-warning,.ffc-public-csv-download .ffc-info-btn-warning{background:var(--ffc-warning);color:var(--ffc-text-on-warning);border:1px solid var(--ffc-warning)}.ffc-extend-end-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-warning:hover:not([disabled]){background:var(--ffc-warning-text);border-color:var(--ffc-warning-text)}.ffc-extend-end-modal .ffc-info-btn-warning[disabled],.ffc-open-early-modal .ffc-info-btn-warning[disabled],.ffc-public-csv-download .ffc-info-btn-warning[disabled]{opacity:.5;cursor:not-allowed}.ffc-open-early-modal{position:fixed;inset:0;z-index:100001;display:flex;align-items:center;justify-content:center}.ffc-schedule-exception-opening{display:flex;align-items:center;gap:var(--ffc-spacing-md);margin:0}.ffc-schedule-exception-spinner{display:inline-block;flex:0 0 auto;width:22px;height:22px;border:3px solid var(--ffc-border-light);border-top:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}.ffc-public-csv-download .ffc-info-form-link{color:var(--ffc-primary);font-weight:600;text-decoration:none;white-space:nowrap}.ffc-public-csv-download .ffc-info-form-link:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-table{width:100%;border-collapse:collapse;font-size:var(--ffc-font-size-base)}.ffc-public-csv-download .ffc-info-table thead th{font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--ffc-text-muted);border-bottom:1px solid var(--ffc-border);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xs)}.ffc-public-csv-download .ffc-info-table thead th.ffc-info-table-col{text-align:right}.ffc-public-csv-download .ffc-info-table td{padding:var(--ffc-spacing-xs);border-bottom:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-table tbody tr:last-child td{border-bottom:0}.ffc-public-csv-download .ffc-info-table .ffc-info-table-label{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-table .ffc-info-table-value{text-align:right;font-weight:500;color:var(--ffc-text);font-variant-numeric:tabular-nums}.ffc-public-csv-download .ffc-info-table .ffc-info-table-dash{text-align:right;color:var(--ffc-border)}.ffc-public-csv-download .ffc-info-schedule-ref-note{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);margin:var(--ffc-spacing-sm) 0 0}.ffc-open-early-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-open-early-container{position:relative;z-index:var(--ffc-z-raised);width:92%;max-width:540px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);box-shadow:var(--ffc-shadow-lg);display:flex;flex-direction:column;overflow:hidden}.ffc-open-early-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary)}.ffc-open-early-header h2{margin:0;font-size:var(--ffc-font-size-xl);font-weight:600;color:var(--ffc-text-on-primary);display:flex;align-items:center;gap:var(--ffc-spacing-sm)}.ffc-open-early-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:26px;cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1;transition:color var(--ffc-transition-base)}.ffc-open-early-close:focus-visible,.ffc-open-early-close:hover{color:var(--ffc-inverse-on-surface);outline:0}.ffc-open-early-body{padding:var(--ffc-spacing-2xl) var(--ffc-spacing-3xl);color:var(--ffc-text);font-size:var(--ffc-font-size-base);line-height:1.55}.ffc-open-early-body p{margin:0 0 var(--ffc-spacing-lg)}.ffc-open-early-times{list-style:none;padding:0;margin:var(--ffc-spacing-sm) 0 var(--ffc-spacing-lg)}.ffc-open-early-times li{margin:var(--ffc-spacing-2xs) 0}.ffc-open-early-warn{color:var(--ffc-danger-text);background:var(--ffc-danger-bg);border-left:3px solid var(--ffc-danger);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 var(--ffc-spacing-2xs);border-radius:var(--ffc-radius-sm,4px);font-weight:500}.ffc-open-early-warn-cache{background:var(--ffc-warning-light);border-left:3px solid var(--ffc-warning);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-warning-text);border-radius:var(--ffc-radius-sm,4px)}.ffc-extend-end-modal .ffc-extend-end-input{width:100%;height:45px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);font-size:var(--ffc-font-size-lg);line-height:1.5;background:var(--ffc-bg-input);color:var(--ffc-text);box-sizing:border-box;transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base)}.ffc-extend-end-modal .ffc-extend-end-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-extend-end-modal .ffc-extend-end-input-invalid{border-color:var(--ffc-danger)}.ffc-extend-end-error{margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-danger)}.ffc-open-early-actions{display:flex;justify-content:flex-end;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl) var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border);background:var(--ffc-bg-alt)}.ffc-open-early-actions .ffc-extend-end-cancel,.ffc-open-early-actions .ffc-open-early-cancel{flex:0 1 auto;min-width:120px;font-weight:600;padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-extend-end-confirm,.ffc-open-early-actions .ffc-open-early-confirm{flex:0 1 auto;min-width:120px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-open-early-confirm{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm)}#ffc-preview-modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--ffc-z-modal);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s ease;pointer-events:none}#ffc-preview-modal.ffc-preview-visible{opacity:1;pointer-events:auto}.ffc-preview-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-preview-container{position:relative;width:90%;max-width:900px;height:85vh;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--ffc-shadow-lg)}#ffc-preview-modal .ffc-preview-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);background:var(--ffc-inverse-surface);color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-header h2{margin:0;font-size:var(--ffc-font-size-lg);font-weight:500;color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:var(--ffc-font-size-2xl);cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1}#ffc-preview-modal .ffc-preview-close:hover{color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-note{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:var(--ffc-primary-light);border-bottom:1px solid var(--ffc-border);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary)}#ffc-preview-modal .ffc-preview-body{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;padding:var(--ffc-spacing-lg)}.ffc-preview-stage{position:relative;flex:0 0 auto;overflow:hidden}#ffc-preview-iframe{display:block;border:none;background:#fff}@media (prefers-reduced-motion:reduce){.ffc-shortcode .ffc-certificate-preview{animation:none}.ffc-shortcode .ffc-spinner{animation:none}.ffc-shortcode .ffc-consent-text a,.ffc-shortcode .ffc-csv-progress-bar-fill,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-input,.ffc-shortcode .ffc-submit-btn,.ffc-shortcode .ffc-verify-input{transition:none}}.ffc-webview-warning{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-left:4px solid var(--ffc-warning);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-webview-warning-icon{font-size:26px;line-height:1;color:var(--ffc-warning-text);flex-shrink:0}.ffc-webview-warning-icon::before{margin-right:0}.ffc-webview-warning-content{flex:1;min-width:0}.ffc-webview-warning-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-warning-text);line-height:1.3}.ffc-webview-warning-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-text)}.ffc-webview-warning-actions{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-md)}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{padding:var(--ffc-spacing-md) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-base);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-webview-warning-open{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-webview-warning-open:focus-visible,.ffc-webview-warning-open:hover{background:var(--ffc-primary-hover,var(--ffc-link-hover));outline:0}.ffc-webview-warning-dismiss{background:0 0;color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-webview-warning-dismiss:focus-visible,.ffc-webview-warning-dismiss:hover{background:var(--ffc-bg-alt);border-color:var(--ffc-border-focus);outline:0}@media (max-width:600px){.ffc-webview-warning{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-xl)}.ffc-webview-warning-actions{flex-direction:column;align-items:stretch}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{width:100%;text-align:center}}.ffc-already-submitted-notice{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-already-submitted-icon{font-size:var(--ffc-font-size-2xl);line-height:1;color:var(--ffc-primary);flex-shrink:0;font-weight:700}.ffc-already-submitted-icon::before{margin-right:0}.ffc-already-submitted-content{flex:1;min-width:0}.ffc-already-submitted-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-info-text);line-height:1.3}.ffc-already-submitted-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-info-text)}.ffc-already-submitted-dismiss{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);font-weight:600;background:0 0;color:var(--ffc-primary);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-already-submitted-dismiss:focus-visible,.ffc-already-submitted-dismiss:hover{background:var(--ffc-primary-light);border-color:var(--ffc-primary);outline:0}@media (max-width:600px){.ffc-already-submitted-notice{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl)}.ffc-already-submitted-dismiss{width:100%;text-align:center}}@media (forced-colors:active){.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-submit-btn{border:1px solid ButtonText}.ffc-shortcode .ffc-status-badge,.ffc-shortcode .ffc-status-badge.ffc-status-badge-error,.ffc-shortcode .ffc-status-badge.ffc-status-badge-success,.ffc-shortcode .ffc-verification-status-approved,.ffc-shortcode .ffc-verification-status-cancelled,.ffc-shortcode .ffc-verification-status-completed,.ffc-shortcode .ffc-verification-status-confirmed,.ffc-shortcode .ffc-verification-status-expired,.ffc-shortcode .ffc-verification-status-in_progress,.ffc-shortcode .ffc-verification-status-no_show,.ffc-shortcode .ffc-verification-status-pending,.ffc-shortcode .ffc-verification-status-rejected,.ffc-shortcode .ffc-verification-status-submitted{border:1px solid CanvasText}} +.ffc-shortcode :is(input,select,textarea,button){font-family:inherit}.ffc-shortcode .ffc-input{width:100%!important;max-width:none!important;height:45px!important;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg)!important;border:1px solid var(--ffc-border)!important;border-radius:var(--ffc-radius-sm)!important;font-size:var(--ffc-font-size-xl)!important;line-height:1.5!important;box-sizing:border-box!important;background-color:var(--ffc-bg-input)!important;color:var(--ffc-text);display:block!important;margin-bottom:var(--ffc-spacing-xl);transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base);-webkit-appearance:none}.ffc-shortcode .ffc-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-form-field textarea.ffc-textarea,.ffc-shortcode textarea.ffc-input,.ffc-shortcode.ffc-form-wrapper textarea.ffc-input{height:auto!important;min-height:45px!important;max-height:300px!important;overflow-y:auto!important;resize:vertical!important}.ffc-shortcode.ffc-form-wrapper{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-form-title{margin:0 0 25px 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);text-align:center;font-weight:600;width:100%}.ffc-shortcode .ffc-submission-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-submission-form:has(.ffc-success-response){max-width:100%}.ffc-shortcode .ffc-form-field{margin-bottom:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-form-field label{display:block;margin-bottom:var(--ffc-spacing-sm);font-weight:500;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-xl);text-transform:none}.ffc-shortcode .ffc-field-legend .ffc-required,.ffc-shortcode .ffc-form-field label .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-radio-group{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-radio-group label{display:flex;align-items:center;gap:var(--ffc-spacing-sm);font-weight:400;cursor:pointer}.ffc-shortcode fieldset.ffc-choice-field{border:0;margin:0 0 var(--ffc-spacing-2xl);padding:0;min-width:0}.ffc-shortcode .ffc-field-legend{display:block;padding:0;margin-bottom:var(--ffc-spacing-sm);font-weight:500;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-radio-group label.is-disabled{color:var(--ffc-text-muted);cursor:not-allowed}.ffc-shortcode .ffc-field-counter,.ffc-shortcode .ffc-field-hint{margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary)}.ffc-shortcode .ffc-field-legend+.ffc-field-hint{margin:0 0 var(--ffc-spacing-sm)}.ffc-shortcode .ffc-input+.ffc-field-hint,.ffc-shortcode .ffc-input+.ffc-length-counter{margin-top:calc(var(--ffc-spacing-xl) * -1 + var(--ffc-spacing-xs))}.ffc-shortcode .ffc-length-counter{text-align:right}.ffc-shortcode .ffc-length-counter.is-below-min{color:var(--ffc-warning-text)}.ffc-shortcode .ffc-quiz-verdict{display:flex;align-items:center;gap:var(--ffc-spacing-2xs);margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);font-weight:600}.ffc-shortcode .ffc-quiz-right .ffc-quiz-verdict{color:var(--ffc-success-text)}.ffc-shortcode .ffc-quiz-wrong .ffc-quiz-verdict{color:var(--ffc-danger-text)}.ffc-shortcode .ffc-form-info-block{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-schedule-exception-banner{max-width:calc(var(--ffc-form-width) - 150px);margin-left:auto;margin-right:auto;border:2px solid var(--ffc-primary);border-left-width:2px}.ffc-shortcode .ffc-schedule-exception-banner p{margin:0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-info-title{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-shortcode .ffc-info-content{font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text-secondary)}.ffc-shortcode .ffc-info-content p{margin:0 0 var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-info-content p:last-child{margin-bottom:0}.ffc-shortcode .ffc-info-content a{color:var(--ffc-link);text-decoration:underline}.ffc-shortcode .ffc-info-content a:hover{color:var(--ffc-link-hover)}.ffc-shortcode .ffc-info-content ol,.ffc-shortcode .ffc-info-content ul{margin:var(--ffc-spacing-sm) 0;padding-left:var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-form-embed-block{margin-bottom:var(--ffc-spacing-2xl);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-embed-caption{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted);font-style:italic}.ffc-shortcode .ffc-embed-media{max-width:var(--ffc-form-width);width:100%}.ffc-shortcode .ffc-embed-media iframe{max-width:100%;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-embed-image{max-width:100%;height:auto;border-radius:var(--ffc-radius-sm);display:block}.ffc-shortcode .ffc-embed-media a{color:var(--ffc-link);word-break:break-all}.ffc-shortcode .ffc-lgpd-consent{margin:25px 0 var(--ffc-spacing-2xl) 0;padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring)}.ffc-shortcode .ffc-consent-label{display:flex;align-items:flex-start;gap:var(--ffc-spacing-lg);cursor:pointer;margin-bottom:0;font-weight:400}.ffc-shortcode .ffc-consent-label input[type=checkbox]{width:20px;height:20px;min-width:20px;margin:var(--ffc-spacing-3xs) 0 0 0;cursor:pointer;flex-shrink:0;accent-color:var(--ffc-primary)}.ffc-shortcode .ffc-consent-text{flex:1;font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline;font-weight:500;transition:color var(--ffc-transition-base)}.ffc-shortcode .ffc-consent-text a:hover{color:var(--ffc-link-hover);text-decoration:none}.ffc-shortcode .ffc-consent-text .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-consent-description{margin:var(--ffc-spacing-lg) 0 0 0;padding:var(--ffc-spacing-lg);background:var(--ffc-bg);border-left:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);line-height:1.5;color:var(--ffc-text-muted);box-sizing:border-box}.ffc-shortcode .ffc-consent-description a{color:var(--ffc-link);text-decoration:none;font-weight:500}.ffc-shortcode .ffc-consent-description a:hover{text-decoration:underline}details.ffc-consent-description>summary{cursor:pointer;list-style:none;outline:0}details.ffc-consent-description>summary::-webkit-details-marker{display:none}details.ffc-consent-description>summary::marker{content:''}details.ffc-consent-description>summary:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-device-disclosure-more{margin-left:var(--ffc-spacing-2xs);color:var(--ffc-link);text-decoration:underline;font-weight:500}details.ffc-consent-description[open]>summary>.ffc-device-disclosure-more{text-decoration:none}details.ffc-consent-description>p{margin:var(--ffc-spacing-sm) 0 0 0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:invalid{outline:2px solid var(--ffc-danger);outline-offset:2px}.ffc-shortcode .ffc-consent-label input[type=checkbox]:valid{outline:0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}@media (max-width:768px){.ffc-shortcode .ffc-lgpd-consent{padding:var(--ffc-spacing-xl);margin:var(--ffc-spacing-2xl) 0 var(--ffc-spacing-xl) 0}.ffc-shortcode .ffc-consent-label{gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-consent-text{font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-consent-description{margin-left:0;font-size:var(--ffc-font-size-xs)}}@media (prefers-contrast:more){.ffc-shortcode .ffc-lgpd-consent{border-width:3px;border-color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text{color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline}}@media print{.ffc-shortcode .ffc-lgpd-consent{display:none}}.ffc-shortcode .ffc-security-container{margin-top:25px;padding-top:25px;border-top:1px solid var(--ffc-border-light);width:100%}.ffc-shortcode .ffc-altcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-altcha-row altcha-widget{--altcha-max-width:100%;display:block;width:100%;font-family:var(--ffc-font-family);font-size:var(--ffc-font-size-xl);--altcha-border-color:var(--ffc-border);--altcha-border-radius:var(--ffc-radius-sm);--altcha-checkbox-border-color:var(--ffc-border);--altcha-color-base:var(--ffc-bg-input);--altcha-color-base-content:var(--ffc-text);--altcha-color-error:var(--ffc-danger);--altcha-color-primary:var(--ffc-primary);--altcha-color-success:var(--ffc-success);--altcha-spinner-color:var(--ffc-primary)}.ffc-shortcode .ffc-altcha-error,.ffc-shortcode .ffc-altcha-noscript{margin:var(--ffc-spacing-md) 0 0;color:var(--ffc-danger);font-weight:600}.ffc-shortcode .ffc-captcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-captcha-row label{display:block;margin-bottom:var(--ffc-spacing-md);font-weight:600;color:var(--ffc-primary);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-captcha-row .ffc-input{color:var(--ffc-text);border:2px solid var(--ffc-primary)!important;background:var(--ffc-bg-input)!important;margin-bottom:0!important}.ffc-shortcode .ffc-captcha-row .ffc-input:focus{border-color:var(--ffc-primary-hover);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-submit-btn{width:100%;padding:var(--ffc-spacing-xl);background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:none;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-weight:600;cursor:pointer;transition:background var(--ffc-transition-slow),transform .1s;box-sizing:border-box}.ffc-shortcode .ffc-submit-btn:hover{background:var(--ffc-primary-hover)}.ffc-shortcode .ffc-submit-btn:active{transform:scale(.98)}.ffc-shortcode .ffc-submit-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-submit-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none}.ffc-shortcode .ffc-message{margin-top:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-message.ffc-success{background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-message.ffc-error{background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border)}.ffc-shortcode.ffc-verification-container{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-header{margin-bottom:30px;text-align:center;width:100%}.ffc-shortcode .ffc-verification-header h2{margin:0 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);font-weight:600}.ffc-shortcode .ffc-verification-header p{margin:0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-verification-manual,.ffc-shortcode.ffc-verification-manual{width:100%;display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-verify-input{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border:2px solid var(--ffc-border-light);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-family:monospace;text-transform:uppercase;letter-spacing:2px;text-align:center;background:var(--ffc-bg-input);color:var(--ffc-text);transition:border-color var(--ffc-transition-slow)}.ffc-shortcode .ffc-verify-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-no-js-security{margin-top:var(--ffc-spacing-2xs);width:100%}.ffc-shortcode .ffc-verify-result{margin-top:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-verify-error{padding:var(--ffc-spacing-xl);background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success{padding:var(--ffc-spacing-2xl);background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-verify-success h3{margin:0 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success p{margin:var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success hr{margin:var(--ffc-spacing-xl) 0;border:none;border-top:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-verify-success h4{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode.ffc-magic-link-container{position:relative;min-height:200px}.ffc-shortcode .ffc-certificate-preview{width:100%;max-width:700px;margin:0 auto;background:var(--ffc-bg-card);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);overflow:hidden;box-shadow:0 4px 12px var(--ffc-focus-ring);animation:fadeInUp .5s ease}@keyframes fadeInUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.ffc-shortcode .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);padding:var(--ffc-spacing-2xl);text-align:center}.ffc-shortcode .ffc-status-badge{display:inline-block;font-size:var(--ffc-font-size-2xl);font-weight:600;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl);background:rgba(255,255,255,.2);border-radius:20px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-success{background:rgba(212,237,218,.3)}.ffc-shortcode .ffc-certificate-preview.ffc-error{border-color:var(--ffc-danger);box-shadow:0 4px 12px var(--ffc-danger-bg)}.ffc-shortcode .ffc-certificate-preview.ffc-error .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-danger) 0,var(--ffc-danger-hover) 100%)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-error{background:rgba(252,240,241,.25)}.ffc-shortcode .ffc-error-message{margin:0 0 var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-lg);line-height:1.5;color:var(--ffc-text)}.ffc-shortcode .ffc-manual-verification-form{padding-top:var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-manual-verification-form h4{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text-secondary);border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-auth-code{width:100%;max-width:320px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);font-family:'Courier New',monospace;margin:0 0 var(--ffc-spacing-lg);box-sizing:border-box}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-verify-btn{display:inline-block;padding:var(--ffc-spacing-md) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-preview-body{padding:30px}.ffc-shortcode .ffc-preview-body h3{margin:0 0 var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-xl);color:var(--ffc-text);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-preview-body h4{margin:25px 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-lg);color:var(--ffc-text-secondary);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-detail-row{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-lg) 0;border-bottom:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-detail-row:last-child{border-bottom:none}.ffc-shortcode .ffc-detail-row .ffc-detail-label{font-weight:600;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{color:var(--ffc-text);font-size:var(--ffc-font-size-base);text-align:right;max-width:60%;overflow-wrap:break-word}.ffc-shortcode .ffc-detail-row .ffc-detail-value.ffc-detail-value-code{font-family:'Courier New',monospace;font-size:var(--ffc-font-size-lg);color:var(--ffc-primary);font-weight:600;letter-spacing:1px}.ffc-shortcode .ffc-preview-body hr{margin:var(--ffc-spacing-2xl) 0;border:none;border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-verification-status{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);font-weight:600;text-transform:uppercase}.ffc-shortcode .ffc-verification-status-pending{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-shortcode .ffc-verification-status-confirmed{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-cancelled{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-completed{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-no_show{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-verification-status-in_progress{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-submitted{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-approved{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-rejected{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-expired{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block{margin:25px 0 var(--ffc-spacing-2xs);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-preview-body .ffc-schedule-exception-block h4{display:flex;align-items:center;gap:var(--ffc-spacing-sm);margin:0 0 var(--ffc-spacing-sm);padding-bottom:var(--ffc-spacing-sm);border-bottom:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-schedule-exception-icon{width:18px;height:18px;flex-shrink:0}.ffc-shortcode .ffc-schedule-exception-block .description{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row{border-bottom-color:var(--ffc-warning-border);padding:var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row:last-child{border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-preview-actions{padding:25px 30px;text-align:center;background:var(--ffc-bg-alt);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-download-btn{display:inline-block;background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);border:none;padding:var(--ffc-spacing-xl) 40px;font-size:var(--ffc-font-size-xl);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all var(--ffc-transition-slow);box-shadow:0 4px 12px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:hover{transform:translateY(-2px);box-shadow:0 6px 16px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:active{transform:translateY(0);box-shadow:var(--ffc-shadow-sm)}.ffc-shortcode .ffc-download-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-download-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none;box-shadow:none}.ffc-shortcode.ffc-has-geofence .ffc-submission-form{display:none!important}.ffc-shortcode.ffc-has-geofence.ffc-validated .ffc-submission-form{display:block!important}.ffc-shortcode .ffc-geofence-loading-msg{text-align:center;padding:30px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-geofence-loading-msg p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-geofence-blocked{background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-blocked p{margin:0;color:var(--ffc-warning-text);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-geofence-reload-btn{margin-top:var(--ffc-spacing-lg)}.ffc-shortcode .ffc-geofence-admin-bypass{background:var(--ffc-info-bg);border-left:4px solid var(--ffc-info-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-admin-bypass p{margin:0;color:var(--ffc-info-text);font-size:var(--ffc-font-size-base);font-weight:500}.ffc-shortcode .ffc-geofence-bypass-badge{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);margin:0 0 var(--ffc-spacing-sm) 0;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);background:var(--ffc-info-bg);color:var(--ffc-info-text);font-size:var(--ffc-font-size-xs);font-weight:600;line-height:1.4;cursor:help}.ffc-shortcode .ffc-verify-loading{text-align:center;padding:60px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-verify-loading p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-spinner{width:50px;height:50px;margin:0 auto;border:4px solid var(--ffc-border-light);border-top:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media (max-width:768px){.ffc-shortcode .ffc-certificate-preview,.ffc-shortcode.ffc-form-wrapper,.ffc-shortcode.ffc-verification-container{padding:var(--ffc-spacing-2xl);margin:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-form-title,.ffc-shortcode .ffc-verification-header h2{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-detail-row{flex-direction:column;align-items:flex-start;gap:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{text-align:left;max-width:100%}.ffc-shortcode .ffc-download-btn{width:100%;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-preview-body h3{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-status-badge{font-size:var(--ffc-font-size-xl)}}@media print{.ffc-shortcode .ffc-preview-actions,.ffc-shortcode .ffc-preview-header,.ffc-shortcode .ffc-submit-btn{display:none}.ffc-shortcode .ffc-certificate-preview{border:none;box-shadow:none}}.ffc-shortcode .ffc-success-auth-code .ffc-detail-value.ffc-detail-value-code{display:inline-flex;align-items:center;gap:var(--ffc-spacing-sm);flex-wrap:wrap;justify-content:flex-end}.ffc-shortcode .ffc-success-code{white-space:nowrap}.ffc-shortcode .ffc-success-row-hint{margin:var(--ffc-spacing-xs) 0 var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);line-height:1.5}.ffc-shortcode .ffc-detail-row.ffc-success-magic-link-row{justify-content:flex-start;gap:var(--ffc-spacing-md);flex-wrap:wrap}.ffc-shortcode .ffc-magic-link-url{color:var(--ffc-primary);text-decoration:underline;font-family:'Courier New',monospace;font-size:var(--ffc-font-size-sm);word-break:break-all;flex:1 1 200px;min-width:0}.ffc-shortcode .ffc-copy-btn{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border:1px solid var(--ffc-primary);background:0 0;color:var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-family:inherit;font-size:var(--ffc-font-size-xs);font-weight:600;letter-spacing:normal;line-height:1.4;cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.ffc-shortcode .ffc-copy-btn:focus,.ffc-shortcode .ffc-copy-btn:hover{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-shortcode .ffc-success-where-is-file{max-width:calc(var(--ffc-form-width) - 150px);margin:var(--ffc-spacing-xl) auto 0;padding:0;text-align:left;box-sizing:border-box}.ffc-shortcode .ffc-success-where-title{cursor:pointer;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);list-style:revert;padding:0}.ffc-shortcode .ffc-success-where-is-file[open] .ffc-success-where-title{margin-bottom:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-success-where-is-file ul{margin:0;padding-left:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-success-where-is-file li{font-size:var(--ffc-font-size-base);line-height:1.5;margin:var(--ffc-spacing-2xs) 0}.ffc-preflight-banner{border:1px solid var(--ffc-warning-border);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);padding:var(--ffc-spacing-xl) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);margin:var(--ffc-spacing-lg) 0;text-align:left}.ffc-preflight-banner-title{display:block;font-size:var(--ffc-font-size-lg);margin-bottom:var(--ffc-spacing-xs);color:var(--ffc-warning-text)}.ffc-preflight-banner-body,.ffc-preflight-banner-how{margin:var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-preflight-banner-how{color:var(--ffc-warning-text);font-style:italic}.ffc-preflight-try-anyway{display:inline-block;margin-top:var(--ffc-spacing-md);padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:0 0;color:var(--ffc-warning-text);border:1px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm);font-weight:600;cursor:pointer;transition:background .15s ease}.ffc-preflight-try-anyway:focus,.ffc-preflight-try-anyway:hover{background:var(--ffc-warning);color:var(--ffc-text-on-warning)}.ffc-submit-btn.ffc-btn-loading{opacity:.7;cursor:not-allowed}.ffc-public-csv-download .ffc-info-screen{width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header{display:flex;align-items:center;gap:var(--ffc-spacing-lg);margin-bottom:var(--ffc-spacing-3xl);padding-bottom:var(--ffc-spacing-xl);border-bottom:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header h2{margin:0;font-size:var(--ffc-font-size-2xl);font-weight:600;color:var(--ffc-text);flex:1}.ffc-public-csv-download .ffc-info-back{background:0 0;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);white-space:nowrap}.ffc-public-csv-download .ffc-info-back:hover{border-color:var(--ffc-primary);color:var(--ffc-primary)}.ffc-public-csv-download .ffc-info-back-arrow{font-size:var(--ffc-font-size-lg);line-height:1}.ffc-public-csv-download .ffc-info-section{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm,6px);border:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-section h3{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);font-weight:600;color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.5px}.ffc-public-csv-download .ffc-info-section.ffc-info-summary{background:var(--ffc-bg-card);border-color:var(--ffc-primary);border-left:3px solid var(--ffc-primary)}.ffc-public-csv-download .ffc-info-row{display:flex;justify-content:space-between;align-items:center;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-xs) 0;width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-row+.ffc-info-row{border-top:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-label{font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-value{font-size:var(--ffc-font-size-base);font-weight:500;color:var(--ffc-text);text-align:right}.ffc-public-csv-download .ffc-info-subsection{margin-bottom:var(--ffc-spacing-sm)}.ffc-public-csv-download .ffc-info-subsection:last-child{margin-bottom:0}.ffc-public-csv-download .ffc-info-sublabel{font-size:var(--ffc-font-size-sm);font-weight:500;color:var(--ffc-text-muted);display:block;margin-bottom:var(--ffc-spacing-2xs)}.ffc-public-csv-download .ffc-info-list{margin:0;padding:0 0 0 var(--ffc-spacing-2xl);list-style:disc}.ffc-public-csv-download .ffc-info-list li{font-size:var(--ffc-font-size-base);color:var(--ffc-text);padding:var(--ffc-spacing-3xs) 0}.ffc-public-csv-download .ffc-info-list-restrictions li{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-list-locations li a{color:var(--ffc-primary);text-decoration:none}.ffc-public-csv-download .ffc-info-list-locations li a:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-alert{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);line-height:1.5;margin-top:var(--ffc-spacing-lg)}.ffc-public-csv-download .ffc-info-alert-warning{background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text)}.ffc-public-csv-download .ffc-info-alert-info{background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);color:var(--ffc-info-text)}.ffc-public-csv-download .ffc-info-alert-success{background:var(--ffc-success-bg);border:1px solid var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-public-csv-download .ffc-info-actions{display:flex;gap:var(--ffc-spacing-lg);margin-top:var(--ffc-spacing-3xl);flex-wrap:wrap;width:100%;box-sizing:border-box}.ffc-extend-end-modal .ffc-info-btn,.ffc-open-early-modal .ffc-info-btn,.ffc-public-csv-download .ffc-info-btn{flex:1;min-width:160px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);border:none;border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);font-weight:600;cursor:pointer;transition:all .2s ease;text-align:center}.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-extend-end-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-primary:hover:not([disabled]){background:var(--ffc-primary-hover)}.ffc-extend-end-modal .ffc-info-btn-primary[disabled],.ffc-open-early-modal .ffc-info-btn-primary[disabled],.ffc-public-csv-download .ffc-info-btn-primary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-secondary,.ffc-open-early-modal .ffc-info-btn-secondary,.ffc-public-csv-download .ffc-info-btn-secondary{background:var(--ffc-bg-alt);color:var(--ffc-text);border:1px solid var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-secondary:hover:not([disabled]){background:var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary[disabled],.ffc-open-early-modal .ffc-info-btn-secondary[disabled],.ffc-public-csv-download .ffc-info-btn-secondary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-warning,.ffc-open-early-modal .ffc-info-btn-warning,.ffc-public-csv-download .ffc-info-btn-warning{background:var(--ffc-warning);color:var(--ffc-text-on-warning);border:1px solid var(--ffc-warning)}.ffc-extend-end-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-warning:hover:not([disabled]){background:var(--ffc-warning-text);border-color:var(--ffc-warning-text)}.ffc-extend-end-modal .ffc-info-btn-warning[disabled],.ffc-open-early-modal .ffc-info-btn-warning[disabled],.ffc-public-csv-download .ffc-info-btn-warning[disabled]{opacity:.5;cursor:not-allowed}.ffc-open-early-modal{position:fixed;inset:0;z-index:100001;display:flex;align-items:center;justify-content:center}.ffc-schedule-exception-opening{display:flex;align-items:center;gap:var(--ffc-spacing-md);margin:0}.ffc-schedule-exception-spinner{display:inline-block;flex:0 0 auto;width:22px;height:22px;border:3px solid var(--ffc-border-light);border-top:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}.ffc-public-csv-download .ffc-info-form-link{color:var(--ffc-primary);font-weight:600;text-decoration:none;white-space:nowrap}.ffc-public-csv-download .ffc-info-form-link:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-table{width:100%;border-collapse:collapse;font-size:var(--ffc-font-size-base)}.ffc-public-csv-download .ffc-info-table thead th{font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--ffc-text-muted);border-bottom:1px solid var(--ffc-border);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xs)}.ffc-public-csv-download .ffc-info-table thead th.ffc-info-table-col{text-align:right}.ffc-public-csv-download .ffc-info-table td{padding:var(--ffc-spacing-xs);border-bottom:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-table tbody tr:last-child td{border-bottom:0}.ffc-public-csv-download .ffc-info-table .ffc-info-table-label{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-table .ffc-info-table-value{text-align:right;font-weight:500;color:var(--ffc-text);font-variant-numeric:tabular-nums}.ffc-public-csv-download .ffc-info-table .ffc-info-table-dash{text-align:right;color:var(--ffc-border)}.ffc-public-csv-download .ffc-info-schedule-ref-note{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);margin:var(--ffc-spacing-sm) 0 0}.ffc-open-early-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-open-early-container{position:relative;z-index:var(--ffc-z-raised);width:92%;max-width:540px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);box-shadow:var(--ffc-shadow-lg);display:flex;flex-direction:column;overflow:hidden}.ffc-open-early-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary)}.ffc-open-early-header h2{margin:0;font-size:var(--ffc-font-size-xl);font-weight:600;color:var(--ffc-text-on-primary);display:flex;align-items:center;gap:var(--ffc-spacing-sm)}.ffc-open-early-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:26px;cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1;transition:color var(--ffc-transition-base)}.ffc-open-early-close:focus-visible,.ffc-open-early-close:hover{color:var(--ffc-inverse-on-surface);outline:0}.ffc-open-early-body{padding:var(--ffc-spacing-2xl) var(--ffc-spacing-3xl);color:var(--ffc-text);font-size:var(--ffc-font-size-base);line-height:1.55}.ffc-open-early-body p{margin:0 0 var(--ffc-spacing-lg)}.ffc-open-early-times{list-style:none;padding:0;margin:var(--ffc-spacing-sm) 0 var(--ffc-spacing-lg)}.ffc-open-early-times li{margin:var(--ffc-spacing-2xs) 0}.ffc-open-early-warn{color:var(--ffc-danger-text);background:var(--ffc-danger-bg);border-left:3px solid var(--ffc-danger);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 var(--ffc-spacing-2xs);border-radius:var(--ffc-radius-sm,4px);font-weight:500}.ffc-open-early-warn-cache{background:var(--ffc-warning-light);border-left:3px solid var(--ffc-warning);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-warning-text);border-radius:var(--ffc-radius-sm,4px)}.ffc-extend-end-modal .ffc-extend-end-input{width:100%;height:45px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);font-size:var(--ffc-font-size-lg);line-height:1.5;background:var(--ffc-bg-input);color:var(--ffc-text);box-sizing:border-box;transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base)}.ffc-extend-end-modal .ffc-extend-end-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-extend-end-modal .ffc-extend-end-input-invalid{border-color:var(--ffc-danger)}.ffc-extend-end-error{margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-danger)}.ffc-open-early-actions{display:flex;justify-content:flex-end;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl) var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border);background:var(--ffc-bg-alt)}.ffc-open-early-actions .ffc-extend-end-cancel,.ffc-open-early-actions .ffc-open-early-cancel{flex:0 1 auto;min-width:120px;font-weight:600;padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-extend-end-confirm,.ffc-open-early-actions .ffc-open-early-confirm{flex:0 1 auto;min-width:120px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-open-early-confirm{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm)}#ffc-preview-modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--ffc-z-modal);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s ease;pointer-events:none}#ffc-preview-modal.ffc-preview-visible{opacity:1;pointer-events:auto}.ffc-preview-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-preview-container{position:relative;width:90%;max-width:900px;height:85vh;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--ffc-shadow-lg)}#ffc-preview-modal .ffc-preview-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);background:var(--ffc-inverse-surface);color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-header h2{margin:0;font-size:var(--ffc-font-size-lg);font-weight:500;color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:var(--ffc-font-size-2xl);cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1}#ffc-preview-modal .ffc-preview-close:hover{color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-note{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:var(--ffc-primary-light);border-bottom:1px solid var(--ffc-border);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary)}#ffc-preview-modal .ffc-preview-body{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;padding:var(--ffc-spacing-lg)}.ffc-preview-stage{position:relative;flex:0 0 auto;overflow:hidden}#ffc-preview-iframe{display:block;border:none;background:#fff}@media (prefers-reduced-motion:reduce){.ffc-shortcode .ffc-certificate-preview{animation:none}.ffc-shortcode .ffc-spinner{animation:none}.ffc-shortcode .ffc-consent-text a,.ffc-shortcode .ffc-csv-progress-bar-fill,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-input,.ffc-shortcode .ffc-submit-btn,.ffc-shortcode .ffc-verify-input{transition:none}}.ffc-webview-warning{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-left:4px solid var(--ffc-warning);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-webview-warning-icon{font-size:26px;line-height:1;color:var(--ffc-warning-text);flex-shrink:0}.ffc-webview-warning-icon::before{margin-right:0}.ffc-webview-warning-content{flex:1;min-width:0}.ffc-webview-warning-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-warning-text);line-height:1.3}.ffc-webview-warning-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-text)}.ffc-webview-warning-actions{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-md)}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{padding:var(--ffc-spacing-md) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-base);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-webview-warning-open{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-webview-warning-open:focus-visible,.ffc-webview-warning-open:hover{background:var(--ffc-primary-hover,var(--ffc-link-hover));outline:0}.ffc-webview-warning-dismiss{background:0 0;color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-webview-warning-dismiss:focus-visible,.ffc-webview-warning-dismiss:hover{background:var(--ffc-bg-alt);border-color:var(--ffc-border-focus);outline:0}@media (max-width:600px){.ffc-webview-warning{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-xl)}.ffc-webview-warning-actions{flex-direction:column;align-items:stretch}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{width:100%;text-align:center}}.ffc-already-submitted-notice{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-already-submitted-icon{font-size:var(--ffc-font-size-2xl);line-height:1;color:var(--ffc-primary);flex-shrink:0;font-weight:700}.ffc-already-submitted-icon::before{margin-right:0}.ffc-already-submitted-content{flex:1;min-width:0}.ffc-already-submitted-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-info-text);line-height:1.3}.ffc-already-submitted-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-info-text)}.ffc-already-submitted-dismiss{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);font-weight:600;background:0 0;color:var(--ffc-primary);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-already-submitted-dismiss:focus-visible,.ffc-already-submitted-dismiss:hover{background:var(--ffc-primary-light);border-color:var(--ffc-primary);outline:0}@media (max-width:600px){.ffc-already-submitted-notice{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl)}.ffc-already-submitted-dismiss{width:100%;text-align:center}}@media (forced-colors:active){.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-submit-btn{border:1px solid ButtonText}.ffc-shortcode .ffc-status-badge,.ffc-shortcode .ffc-status-badge.ffc-status-badge-error,.ffc-shortcode .ffc-status-badge.ffc-status-badge-success,.ffc-shortcode .ffc-verification-status-approved,.ffc-shortcode .ffc-verification-status-cancelled,.ffc-shortcode .ffc-verification-status-completed,.ffc-shortcode .ffc-verification-status-confirmed,.ffc-shortcode .ffc-verification-status-expired,.ffc-shortcode .ffc-verification-status-in_progress,.ffc-shortcode .ffc-verification-status-no_show,.ffc-shortcode .ffc-verification-status-pending,.ffc-shortcode .ffc-verification-status-rejected,.ffc-shortcode .ffc-verification-status-submitted{border:1px solid CanvasText}} /*# sourceMappingURL=ffc-frontend.min.css.map */ \ No newline at end of file diff --git a/assets/js/ffc-admin-field-builder.js b/assets/js/ffc-admin-field-builder.js index b8d741f21..67c42bdda 100644 --- a/assets/js/ffc-admin-field-builder.js +++ b/assets/js/ffc-admin-field-builder.js @@ -19,6 +19,8 @@ 'use strict'; var CHOICE_TYPES = ['select', 'radio', 'checkbox']; + var TEXT_TYPES = ['text', 'textarea']; + var RANGE_TYPES = ['number', 'date']; var fieldCounter = 0; @@ -70,12 +72,70 @@ $row.find('.ffc-hidden-value-field').toggleClass('ffc-hidden', type !== 'hidden'); $row.find('.ffc-standard-row').toggleClass('ffc-hidden', isInfo || isEmbed); $row.find('.ffc-options-field').toggleClass('ffc-hidden', !isChoice); - $row.find('.ffc-quiz-points').toggleClass('ffc-hidden', !(isChoice && quizOn())); $row.find('[data-ffc-types]').each(function() { var types = String($(this).attr('data-ffc-types')).split(' '); $(this).toggleClass('ffc-hidden', types.indexOf(type) === -1); }); $row.find('.ffc-type-desc').text(typeDescription(type)); + applyQuiz($row, type); + } + + /** + * Show the quiz settings a row's type and choices call for (#1730). + */ + function applyQuiz($row, type) { + type = type || String($row.find('.ffc-field-type-selector').val() || ''); + var $block = $row.find('.ffc-field-quiz'); + var scorable = String($block.attr('data-ffc-quiz-types') || '').split(' ').indexOf(type) !== -1; + var on = quizOn() && scorable; + var scored = on && $block.find('.ffc-quiz-scored').is(':checked'); + var isChoice = CHOICE_TYPES.indexOf(type) !== -1; + var mode = isChoice ? String($block.find('.ffc-quiz-mode').val()) : ''; + var textNone = TEXT_TYPES.indexOf(type) !== -1 && $block.find('.ffc-quiz-text').val() === 'none'; + + $block.toggleClass('ffc-hidden', !on); + $block.find('.ffc-field-quiz-body').toggleClass('ffc-hidden', !scored); + $row.find('.ffc-choice-quiz').each(function() { + $(this).toggleClass('ffc-hidden', !(scored && isChoice && $(this).attr('data-ffc-quiz-mode') === mode)); + }); + $block.find('.ffc-quiz-points-setting').toggleClass('ffc-hidden', (isChoice && mode === 'points') || textNone); + $block.find('[data-ffc-types]').each(function() { + $(this).toggleClass('ffc-hidden', String($(this).attr('data-ffc-types')).split(' ').indexOf(type) === -1); + }); + $block.find('[data-ffc-quiz-help="correct"]').toggleClass('ffc-hidden', !(isChoice && mode === 'correct')); + $block.find('[data-ffc-quiz-help="points"]').toggleClass('ffc-hidden', !(isChoice && mode === 'points')); + $block.find('[data-ffc-quiz-help="range"]').toggleClass('ffc-hidden', RANGE_TYPES.indexOf(type) === -1); + checkMaxSelect($row); + } + + /** + * A checkbox scored by its correct options cannot cap the selections + * below how many are correct: nobody could answer it right. + */ + function checkMaxSelect($row) { + var $max = $row.find('input[name$="[max_select]"]'); + if (!$max.length || !$max[0].setCustomValidity) { + return; + } + var type = String($row.find('.ffc-field-type-selector').val() || ''); + var limit = parseInt($max.val(), 10); + var correct = $row.find('.ffc-choice-correct-value').filter(function() { + return this.value === '1'; + }).length; + var applies = type === 'checkbox' && quizOn() && + $row.find('.ffc-quiz-scored').is(':checked') && + $row.find('.ffc-quiz-mode').val() === 'correct'; + var message = ''; + if (applies && limit > 0 && limit < correct) { + message = (strings().maxSelectBelowCorrect || 'The maximum selections is below the number of correct options (%d).').replace('%d', String(correct)); + } + $max[0].setCustomValidity(message); + } + + function refreshQuiz() { + $('#ffc-fields-container .ffc-field-row').each(function() { + applyQuiz($(this)); + }); } // A number above every index already on the page, so a new row's @@ -98,10 +158,17 @@ } var $row = $first.clone(); $row.find('.ffc-choice-input').val(value || ''); + resetChoiceQuiz($row); $list.append($row); return $row; } + function resetChoiceQuiz($choice) { + $choice.find('.ffc-choice-correct-value').val('0'); + $choice.find('.ffc-choice-correct-input').prop('checked', false); + $choice.find('.ffc-choice-points-input').val(''); + } + function makeChoicesSortable($scope) { if ($.fn.sortable) { $scope.find('.ffc-choice-list').sortable({ handle: '.ffc-choice-handle', axis: 'y' }); @@ -150,13 +217,34 @@ $container.on('click', '.ffc-choice-remove', function(e) { e.preventDefault(); var $choice = $(this).closest('.ffc-choice-row'); + var $fieldRow = $choice.closest('.ffc-field-row'); if ($choice.siblings('.ffc-choice-row').length) { $choice.remove(); } else { $choice.find('.ffc-choice-input').val(''); + resetChoiceQuiz($choice); } + checkMaxSelect($fieldRow); }); + // The visible box drives the aligned 0/1 the server reads. + $container.on('change', '.ffc-choice-correct-input', function() { + $(this).closest('.ffc-choice-row').find('.ffc-choice-correct-value').val(this.checked ? '1' : '0'); + checkMaxSelect($(this).closest('.ffc-field-row')); + }); + + $container.on('change', '.ffc-quiz-scored, .ffc-quiz-mode, .ffc-quiz-text', function() { + applyQuiz($(this).closest('.ffc-field-row')); + }); + + $container.on('input change', 'input[name$="[max_select]"]', function() { + checkMaxSelect($(this).closest('.ffc-field-row')); + }); + + $(document).off('change.ffcFieldBuilder'); + $(document).on('change.ffcFieldBuilder', '#ffc_quiz_enabled', refreshQuiz); + refreshQuiz(); + // Enter in an option adds the next one instead of submitting the post. $container.on('keydown', '.ffc-choice-input', function(e) { if (e.key === 'Enter') { @@ -253,7 +341,8 @@ window.FFC.Admin.FieldBuilder = { init: initFormBuilder, addField: addFieldToBuilder, - applyType: applyType + applyType: applyType, + refreshQuiz: refreshQuiz }; if (FFC && FFC.registerModule) { diff --git a/assets/js/ffc-admin-field-builder.min.js b/assets/js/ffc-admin-field-builder.min.js index 27da4857d..24b01adb2 100644 --- a/assets/js/ffc-admin-field-builder.min.js +++ b/assets/js/ffc-admin-field-builder.min.js @@ -1,2 +1,2 @@ -!function(e,f){"use strict";var i=["select","radio","checkbox"],t=0;function n(){return"undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{}}function c(f,t){var n="info"===t,c="embed"===t,l=-1!==i.indexOf(t);f.find(".ffc-content-field").toggleClass("ffc-hidden",!n),f.find(".ffc-embed-field").toggleClass("ffc-hidden",!c),f.find(".ffc-hidden-value-field").toggleClass("ffc-hidden","hidden"!==t),f.find(".ffc-standard-row").toggleClass("ffc-hidden",n||c),f.find(".ffc-options-field").toggleClass("ffc-hidden",!l),f.find(".ffc-quiz-points").toggleClass("ffc-hidden",!(l&&e("#ffc_quiz_enabled").is(":checked"))),f.find("[data-ffc-types]").each(function(){var f=String(e(this).attr("data-ffc-types")).split(" ");e(this).toggleClass("ffc-hidden",-1===f.indexOf(t))}),f.find(".ffc-type-desc").text(function(e){return("undefined"!=typeof ffc_ajax&&ffc_ajax.fieldTypeDescriptions?ffc_ajax.fieldTypeDescriptions:{})[e]||""}(t))}function l(){var f=-1;return e("#ffc-fields-container .ffc-field-row").each(function(){var i=parseInt(e(this).attr("data-index"),10);!isNaN(i)&&i>f&&(f=i)}),Math.max(f+1,t)}function o(e,f){var i=e.children(".ffc-choice-row").first();if(!i.length)return null;var t=i.clone();return t.find(".ffc-choice-input").val(f||""),e.append(t),t}function a(f){e.fn.sortable&&f.find(".ffc-choice-list").sortable({handle:".ffc-choice-handle",axis:"y"})}function d(f){var i=e(".ffc-field-template .ffc-field-row").first();if(!i.length)return null;var n=String(l());t=parseInt(n,10)+1;var o=i.clone();return o.attr("data-index",n),o.find("[name], [id], [for]").each(function(){var e=this;["name","id","for"].forEach(function(f){var i=e.getAttribute(f);i&&-1!==i.indexOf("TEMPLATE")&&e.setAttribute(f,i.split("TEMPLATE").join(n))})}),e("#ffc-fields-container").append(o),o.find(".ffc-field-type-selector").val(f),c(o,f),a(o),o.find('input[type="text"]').first().trigger("focus"),o}window.FFC=window.FFC||{},window.FFC.Admin=window.FFC.Admin||{},window.FFC.Admin.FieldBuilder={init:function(){var f=e("#ffc-fields-container");0!==f.length&&(t=0,t=l(),e(document).off("click.ffcFieldBuilder"),e(document).on("click.ffcFieldBuilder",".ffc-add-field",function(f){f.preventDefault(),function(f){e(".ffc-field-type-menu").remove();var i=e('
');i.append(e('').text(n().chooseFieldType||"Choose Field Type:"));var t=e("'+n+'
'+n+'
+
{{score}}{{max_score}}{{correct_count}}{{question_count}}
- {{score}}, {{max_score}}, {{score_percent}}
+ {{score}}, {{max_score}}, {{score_percent}}, {{correct_count}}, {{question_count}}
,
,
,
,
define( \'DISABLE_WP_CRON\', true ); to wp-config.php so page visits stop triggering WP-Cron.'=>'Recomendado: instale a linha do servidor abaixo e depois adicione define( \'DISABLE_WP_CRON\', true ); ao wp-config.php, para que as visitas deixem de disparar o WP-Cron.','Method'=>'Método','WP-CLI runs on the server itself and needs WP-CLI installed. The HTTP methods call the site over the network and work on any host.'=>'O WP-CLI roda no próprio servidor e precisa do WP-CLI instalado. Os métodos HTTP chamam o site pela rede e funcionam em qualquer hospedagem.','Every'=>'A cada','%d minutes'=>'%d minutos','Line to install'=>'Linha a instalar','Add it with "crontab -e" as the user that owns the WordPress files, or paste it into your hosting panel\'s cron section.'=>'Adicione com "crontab -e" como o usuário dono dos arquivos do WordPress, ou cole na seção de cron do painel da sua hospedagem.','Birthday'=>'Aniversário','Birthday message (default for new rules)'=>'Mensagem de aniversário (padrão para novas regras)','Choose a range of 1 to %d days, starting on or before its end.'=>'Escolha um intervalo de 1 a %d dias, com início igual ou anterior ao fim.','Could not record the run.'=>'Não foi possível registrar a execução.','Date Messages'=>'Mensagens por Data','Date messages'=>'Mensagens por data','Date messages (birthdays and other dates)'=>'Mensagens por data (aniversários e outras datas)','Date messages (such as birthday greetings)'=>'Mensagens por data (como felicitações de aniversário)','Date messages batch (one per batch)'=>'Lote de mensagens por data (um por lote)','Done. You will no longer receive date messages. You can turn them back on in your dashboard profile.'=>'Pronto. Você não receberá mais mensagens por data. É possível reativá-las no perfil do seu painel.','E-mails sent on a date in each person\'s profile, such as a birthday.'=>'E-mails enviados em uma data do perfil de cada pessoa, como o aniversário.','Everyone at %s wishes you a very happy birthday and a wonderful year ahead.'=>'Todos em %s desejam a você um feliz aniversário e um ano maravilhoso pela frente.','Give the rule a name.'=>'Dê um nome à regra.','Happy birthday!'=>'Feliz aniversário!','Happy birthday, {{first_name}}!'=>'Feliz aniversário, {{first_name}}!','Lists people by name with their birthday (day and month) in the recipient preview and the upcoming-dates panel.'=>'Lista as pessoas por nome com o aniversário (dia e mês) na prévia de destinatários e no painel de próximas datas.','Manage date messages'=>'Gerenciar mensagens por data','Maria'=>'Maria','Maria da Silva'=>'Maria da Silva','Prefer not to receive these messages? Unsubscribe.'=>'Prefere não receber estas mensagens? Cancelar inscrição.','Read-only access to the date-message rules, their send history and recipient totals.'=>'Acesso somente leitura às regras de mensagens por data, ao histórico de envios e aos totais de destinatários.','See who receives date messages'=>'Ver quem recebe mensagens por data','Stop receiving date messages, such as birthday greetings, at this account?'=>'Deixar de receber mensagens por data, como felicitações de aniversário, nesta conta?','The e-mail needs a subject and a body.'=>'O e-mail precisa de assunto e corpo.','The number of days must be a whole number between -%1$d and %1$d.'=>'O número de dias deve ser um inteiro entre -%1$d e %1$d.','This page expired. Open the link in the message again.'=>'Esta página expirou. Abra o link da mensagem novamente.','This unsubscribe link is not valid.'=>'Este link de cancelamento de inscrição não é válido.','Unknown date source.'=>'Fonte de data desconhecida.','Unknown digest mode.'=>'Modo de resumo desconhecido.','Unsubscribe'=>'Cancelar inscrição','View date messages'=>'Ver mensagens por data','"Sent" counts messages handed to wp_mail(); with a mail queue active, delivery happens afterwards from the queue.'=>'"Enviados" conta as mensagens entregues ao wp_mail(); com uma fila de e-mail ativa, a entrega acontece depois, a partir da fila.','(deleted rule)'=>'(regra excluída)','Activate'=>'Ativar','Active (the daily run sends it)'=>'Ativa (o envio diário a envia)','Active, not sending to people'=>'Ativa, sem envio às pessoas','Add rule'=>'Adicionar regra','Already sent'=>'Já enviado','Check before saving'=>'Confira antes de salvar','Choose a rule.'=>'Escolha uma regra.','Daily send time'=>'Horário do envio diário','Dates'=>'Datas','Dates in the profile'=>'Datas no perfil','Days from the date'=>'Dias em relação à data','Delete this rule? What it already sent stays in the history.'=>'Excluir esta regra? O que ela já enviou continua no histórico.','E-mail each person on their date'=>'Enviar e-mail a cada pessoa na sua data','Each rule sends its own message on a date in each person\'s profile, or a number of days before it. The daily run sends every active rule; the Send now tab sends one rule over dates you choose.'=>'Cada regra envia sua própria mensagem em uma data do perfil de cada pessoa, ou alguns dias antes dela. O envio diário envia todas as regras ativas; a aba Enviar agora envia uma regra para as datas que você escolher.','Edit rule'=>'Editar regra','Enter both dates.'=>'Informe as duas datas.','Everyone'=>'Todos','Failed'=>'Falharam','Finished'=>'Concluído','In the site timezone (%s), set in Settings → General.'=>'No fuso horário do site (%s), definido em Configurações → Geral.','Manual'=>'Manual','New rule'=>'Nova regra','Next daily run: %s.'=>'Próximo envio diário: %s.','No mail queue is active, so a large range is handed to wp_mail() as fast as PHP runs. Installing a mail queue plugin paces the sending.'=>'Nenhuma fila de e-mail está ativa, então um intervalo grande é entregue ao wp_mail() tão rápido quanto o PHP executa. Instalar um plugin de fila de e-mail dosa o envio.','No rules yet.'=>'Nenhuma regra ainda.','No valid e-mail'=>'Sem e-mail válido','Nobody falls on these dates.'=>'Ninguém tem data neste intervalo.','Nothing has been sent yet.'=>'Nada foi enviado ainda.','On the day'=>'No dia','Only the first rows are listed; the totals count everyone.'=>'Apenas as primeiras linhas são listadas; os totais contam todos.','Opted out'=>'Descadastrado','Placeholders:'=>'Marcadores:','Preview recipients'=>'Prévia dos destinatários','Replace the current message with the default text? Your changes will be lost.'=>'Substituir a mensagem atual pelo texto padrão? Suas alterações serão perdidas.','Restore default text'=>'Restaurar texto padrão','Rule'=>'Regra','Rule activated.'=>'Regra ativada.','Rule copied. The copy starts inactive.'=>'Regra copiada. A cópia começa inativa.','Rule deactivated.'=>'Regra desativada.','Rule deleted. Its history stays.'=>'Regra excluída. O histórico dela permanece.','Rule saved.'=>'Regra salva.','Rules'=>'Regras','Save rule'=>'Salvar regra','Send now'=>'Enviar agora','Send test to me'=>'Enviar teste para mim','Send these messages now?'=>'Enviar estas mensagens agora?','Sending'=>'Envio','Sending started. The first batch went out now; the rest continues in the background. Follow it in History.'=>'Envio iniciado. O primeiro lote saiu agora; o restante continua em segundo plano. Acompanhe em Histórico.','Sends one rule to everyone whose date falls in a range of up to %d days. People already sent this rule for that date are skipped, so running a range twice sends nothing new.'=>'Envia uma regra a todos cuja data cai em um intervalo de até %d dias. Quem já recebeu esta regra para aquela data é pulado, então repetir um intervalo não envia nada novo.','Sent'=>'Enviados','Started'=>'Início','Test message sent to %s.'=>'Mensagem de teste enviada para %s.','That rule no longer exists.'=>'Essa regra não existe mais.','The dates are the dates in the profile (such as birthdays), not the day the message goes out.'=>'As datas são as do perfil (como aniversários), não o dia em que a mensagem sai.','The header and footer come from the Email Model in Settings → SMTP. A message that does not place {{unsubscribe_url}} gets an unsubscribe line added at the end.'=>'O cabeçalho e o rodapé vêm do Modelo de E-mail em Configurações → SMTP. Uma mensagem sem {{unsubscribe_url}} recebe uma linha de descadastro no final.','The request failed. Reload the page and try again.'=>'A requisição falhou. Recarregue a página e tente novamente.','The rule could not be copied.'=>'Não foi possível copiar a regra.','The rule could not be deleted.'=>'Não foi possível excluir a regra.','The rule could not be saved.'=>'Não foi possível salvar a regra.','The test message was not sent. Check whether e-mails are disabled in the settings.'=>'A mensagem de teste não foi enviada. Verifique se os e-mails estão desativados nas configurações.','Trigger'=>'Origem','Uses the values on this form, saved or not. Nothing is sent and nothing is recorded.'=>'Usa os valores deste formulário, salvos ou não. Nada é enviado e nada é registrado.','Will receive'=>'Vai receber','You do not have permission to do this.'=>'Você não tem permissão para fazer isto.','You do not have permission to view this page.'=>'Você não tem permissão para ver esta página.','Your account has no valid e-mail address.'=>'Sua conta não tem um endereço de e-mail válido.','[TEST] %s'=>'[TESTE] %s','%d day after'=>'%d dia depois' . "\0" . '%d dias depois','%d day before'=>'%d dia antes' . "\0" . '%d dias antes','Birthdays in the period, by day and month; the year of birth is never shown.'=>'Aniversários no período, por dia e mês; o ano de nascimento nunca é exibido.','Counts and the names of who received it'=>'Totais e os nomes de quem recebeu','Counts only'=>'Apenas totais','Date messages manager summary (one per run)'=>'Resumo de mensagens por data para gestores (um por execução)','E-mail a summary of each run, 24 hours after it starts'=>'Enviar por e-mail um resumo de cada execução, 24 horas após o início','In'=>'Em','Manager summary'=>'Resumo para gestores','Names go only to recipients allowed to see who receives date messages; the others get the counts. A run that reached nobody sends no summary.'=>'Os nomes vão apenas para quem pode ver quem recebe mensagens por data; os demais recebem os totais. Uma execução que não alcançou ninguém não envia resumo.','Next 30 days'=>'Próximos 30 dias','Next 7 days'=>'Próximos 7 dias','No account can receive the summary: it goes to administrators and to accounts holding a date-messages permission.'=>'Nenhuma conta pode receber o resumo: ele vai para administradores e contas com permissão de mensagens por data.','Only the first names are listed; the counts above include everyone.'=>'Apenas os primeiros nomes são listados; os totais acima incluem todos.','Received the message'=>'Receberam a mensagem','Send the summary to'=>'Enviar o resumo para','Summary of the %1$s for the dates %2$s.'=>'Resumo do %1$s para as datas %2$s.','Upcoming dates'=>'Próximas datas','daily run'=>'envio diário','manual send'=>'envio manual','%d day'=>'%d dia' . "\0" . '%d dias','day and month, without the yearF j'=>'j \\d\\e F','Change it in Scheduled Tasks'=>'Alterar em Tarefas Agendadas','Every daily task of the plugin has its time chosen on that one screen, which also shows the server line that keeps scheduled tasks running.'=>'Todas as tarefas diárias do plugin têm o horário escolhido nessa única tela, que também mostra a linha do servidor que mantém as tarefas agendadas rodando.','Save times'=>'Salvar horários','The daily run is not scheduled.'=>'O envio diário não está agendado.','Time of day'=>'Horário','Times are in the site timezone (%s). Leave a time empty to keep the task where it is. A task becomes due at its time and runs when WP-Cron next fires, so with the server line below it runs within that line\'s interval.'=>'Os horários estão no fuso do site (%s). Deixe um horário vazio para manter a tarefa onde está. Uma tarefa fica devida no seu horário e roda quando o WP-Cron disparar em seguida; com a linha do servidor abaixo, ela roda dentro do intervalo dessa linha.','Times saved, except the ones that were not a valid time of day.'=>'Horários salvos, exceto os que não eram um horário válido.','Times saved. Changed tasks were moved to their new time.'=>'Horários salvos. As tarefas alteradas foram movidas para o novo horário.','Form cache warming (when "Pre-load cache daily" is on)'=>'Pré-carregamento do cache de formulários (quando "Pré-carregar cache diariamente" está ligado)','These fields arrived empty or with an invalid choice and kept their previous value: %s'=>'Estes campos chegaram vazios ou com uma opção inválida e mantiveram o valor anterior: %s','The birth-date migration has %d account left to examine. Until it runs, a birth date given before the profile field existed is not on the profile, so that person does not appear in previews or upcoming dates and receives no messages.'=>'A migração da data de nascimento ainda tem %d conta para examinar. Até ela rodar, uma data de nascimento informada antes de o campo existir no perfil não está no perfil, então essa pessoa não aparece nas prévias nem nas próximas datas e não recebe mensagens.' . "\0" . 'A migração da data de nascimento ainda tem %d contas para examinar. Até ela rodar, uma data de nascimento informada antes de o campo existir no perfil não está no perfil, então essas pessoas não aparecem nas prévias nem nas próximas datas e não recebem mensagens.','Write the display name, first name and last name of every account that has none of them, from the name its own candidacy or submission already carries. A promotion used to create the account without passing the person\'s name, so WordPress fell back to storing the login — which is what the user list, the dashboard greeting and every e-mail then showed them. Only an account whose display name is still its login and whose first name is empty is touched, because those two are written together and an account with one but not the other was changed by something else. Completion here means every such account was EXAMINED: one whose records name nobody is read, left alone, and counted as done.'=>'Grava o nome de exibição, o primeiro nome e o sobrenome de toda conta que não tem nenhum deles, a partir do nome que a própria candidatura ou submission dela já carrega. A promoção criava a conta sem passar o nome da pessoa, então o WordPress gravava o login no lugar — e era isso que a lista de usuários, a saudação do painel e todo e-mail mostravam a ela. Só é tocada a conta cujo nome de exibição ainda é o login e cujo primeiro nome está vazio, porque esses dois são gravados juntos e uma conta com um e sem o outro foi alterada por outra coisa. Aqui, concluído significa que toda conta dessas foi EXAMINADA: uma cujos registros não nomeiam ninguém é lida, deixada como está, e contada como feita.','Fill WordPress\'s first and last name from the full name the plugin stores — first word, then the rest — on accounts where the whole name sits in the first name, or neither is filled. Account creation used to store the whole name as the first name. Parts somebody filled in by hand are not touched. Completion here means every such account was EXAMINED: a one-word name is read, left as it is, and counted as done.'=>'Preenche o primeiro nome e o sobrenome do WordPress a partir do nome completo que o plugin guarda — a primeira palavra e depois o restante — nas contas em que o nome inteiro está no primeiro nome, ou nenhum dos dois está preenchido. A criação de contas gravava o nome inteiro como primeiro nome. Partes que alguém preencheu à mão não são tocadas. Aqui, concluído significa que toda conta dessas foi EXAMINADA: um nome de uma só palavra é lido, deixado como está, e contado como feito.','Split Full Names into First and Last Name'=>'Dividir nomes completos em primeiro nome e sobrenome','Every account whose name was stored whole has been examined.'=>'Toda conta cujo nome foi gravado inteiro já foi examinada.','Examined %1$d accounts and split the name of %2$d; the rest have a one-word name or none.'=>'%1$d contas examinadas e o nome de %2$d dividido; as demais têm um nome de uma só palavra ou nenhum.','da Silva'=>'da Silva','A designed code is drawn as SVG. Certificates embed it directly; short URL PNG downloads are rasterised by your browser so they match the preview.'=>'Um código com design é desenhado em SVG. Os certificados o incorporam diretamente; os downloads PNG das URLs curtas são rasterizados pelo seu navegador para ficarem iguais à prévia.','Apply the design to'=>'Aplicar o design em','Background colour'=>'Cor de fundo','Blend the modules diagonally into a second colour'=>'Mesclar os módulos na diagonal com uma segunda cor','Circle'=>'Círculo','Corner centre'=>'Centro dos cantos','Corner centre colour'=>'Cor do centro dos cantos','Corner frame'=>'Moldura dos cantos','Corner frame colour'=>'Cor da moldura dos cantos','Diamond'=>'Losango','Dots'=>'Pontos','Draw the short URL QR codes (preview and downloads) with this design'=>'Desenhar os QR Codes das URLs curtas (prévia e downloads) com este design','Draw the {{qr_code}} placeholder with this design'=>'Desenhar o placeholder {{qr_code}} com este design','Fluid'=>'Fluido','Gradient end colour'=>'Cor final do degradê','Leaf'=>'Folha','Low contrast (%s:1). Phones may fail to read this code; aim for 4:1 or more.'=>'Contraste baixo (%s:1). Celulares podem não ler este código; busque 4:1 ou mais.','Module colour'=>'Cor dos módulos','QR Code Design'=>'Design do QR Code','QR Code settings view file not found.'=>'Arquivo de visualização das configurações de QR Code não encontrado.','Readable: contrast and colours are fine.'=>'Legível: contraste e cores adequados.','Rounded'=>'Arredondado','Shapes and colours of the QR codes the plugin draws. Applies only where it is switched on below; elsewhere the plain black-and-white code is kept.'=>'Formas e cores dos QR Codes que o plugin desenha. Vale apenas onde estiver ativado abaixo; nos demais lugares o código simples em preto e branco é mantido.','Square'=>'Quadrado','The modules are lighter than the background. Most readers cannot scan an inverted code.'=>'Os módulos estão mais claros que o fundo. A maioria dos leitores não consegue ler um código invertido.','The preview could not be drawn.'=>'Não foi possível desenhar a prévia.','Settings → QR Code also sets the shape of the modules and of the three corner markers, their colours and an optional gradient, with a live preview that warns about low contrast and inverted colours. The design is applied only where it is switched on: the {{qr_code}} placeholder of certificates, and the QR codes of short URLs. Elsewhere the plain black-and-white code is kept.'=>'Configurações → QR Code também define o formato dos módulos e dos três marcadores de canto, suas cores e um degradê opcional, com uma prévia ao vivo que avisa sobre contraste baixo e cores invertidas. O design só é aplicado onde estiver ativado: no placeholder {{qr_code}} dos certificados e nos QR Codes das URLs curtas. Nos demais lugares o código simples em preto e branco é mantido.','Badge with caption above'=>'Selo com legenda acima','Banner below'=>'Faixa abaixo','Frame'=>'Moldura','Frame caption'=>'Legenda da moldura','Frame colour'=>'Cor da moldura','Logo'=>'Logotipo','PNG, JPEG, WebP or GIF up to 512 KB, drawn in the centre. A logo raises error correction to H so the covered modules can be rebuilt.'=>'PNG, JPEG, WebP ou GIF de até 512 KB, desenhado no centro. Um logotipo eleva a correção de erros para H, para que os módulos cobertos possam ser reconstruídos.','Speech bubble above'=>'Balão de fala acima','Up to 24 characters, e.g. "Scan to verify". The caption colour is picked to stay readable on the frame.'=>'Até 24 caracteres, por exemplo "Escaneie para verificar". A cor da legenda é escolhida para continuar legível sobre a moldura.','Could not create the short URL.'=>'Não foi possível criar a URL curta.','Dense code (version %d): print it at least 3 cm wide, or shorten the content.'=>'Código denso (versão %d): imprima com pelo menos 3 cm de largura ou encurte o conteúdo.','Design'=>'Design','Enter a valid e-mail address.'=>'Informe um endereço de e-mail válido.','Enter a valid phone number.'=>'Informe um número de telefone válido.','Enter the network name.'=>'Informe o nome da rede.','Enter the network password, or choose an open network.'=>'Informe a senha da rede ou escolha uma rede aberta.','Enter the text to encode.'=>'Informe o texto a codificar.','Error correction'=>'Correção de erros','Hidden network'=>'Rede oculta','Margin (modules)'=>'Margem (módulos)','Network name (SSID)'=>'Nome da rede (SSID)','Open network (no password)'=>'Rede aberta (sem senha)','Phone call'=>'Ligação telefônica','QR Code Generator'=>'Gerador de QR Code','SMS'=>'SMS','The QR code could not be drawn.'=>'Não foi possível desenhar o QR Code.','The network does not broadcast its name'=>'A rede não divulga o próprio nome','Type of content'=>'Tipo de conteúdo','Unknown QR code type.'=>'Tipo de QR Code desconhecido.','WPA / WPA2 / WPA3'=>'WPA / WPA2 / WPA3','Website'=>'Site','WhatsApp'=>'WhatsApp','Wi-Fi'=>'Wi-Fi','With the country code, so it works from anywhere.'=>'Com o código do país, para funcionar de qualquer lugar.','A calendar file (.ics) for any calendar app'=>'Um arquivo de agenda (.ics) para qualquer app de calendário','Choose a social network.'=>'Escolha uma rede social.','Contact card (vCard)'=>'Cartão de contato (vCard)','Country'=>'País','Enter a name or an organisation.'=>'Informe um nome ou uma organização.','Enter a valid date.'=>'Informe uma data válida.','Enter the event title.'=>'Informe o título do evento.','Enter the start and end times.'=>'Informe os horários de início e de fim.','Enter the user name (letters, digits, dots, dashes and underscores).'=>'Informe o nome de usuário (letras, números, pontos, hífens e sublinhados).','First name'=>'Nome','Google Calendar, already filled in'=>'O Google Agenda, já preenchido','In the site\'s time zone, on one day.'=>'No fuso horário do site, em um único dia.','Job title'=>'Cargo','Last name'=>'Sobrenome','Location'=>'Local','Mobile'=>'Celular','Network'=>'Rede','Note'=>'Observação','Organisation'=>'Organização','Scanning opens'=>'Ao escanear, abre','Social profile'=>'Perfil em rede social','The event itself (the phone offers to add it to its calendar)'=>'O próprio evento (o celular oferece adicioná-lo à agenda)','The event must end after it starts.'=>'O evento precisa terminar depois de começar.','The whole card travels inside the code: it works offline and nothing about the person is stored. Every field you fill makes the code denser.'=>'O cartão inteiro vai dentro do código: funciona offline e nada sobre a pessoa é armazenado. Cada campo preenchido deixa o código mais denso.','This event link is not valid.'=>'Este link de evento não é válido.','User name'=>'Nome de usuário','Work phone'=>'Telefone comercial','Enter a valid date for the link expiry.'=>'Informe uma data válida para a expiração do link.','The link cannot expire before the event.'=>'O link não pode expirar antes do evento.','This event link has expired.'=>'Este link de evento expirou.','Link valid until'=>'Link válido até','Calendar file only. Leave empty for a link that never expires -- a printed code keeps working. After this date the link answers that it has expired.'=>'Somente para o arquivo de calendário. Deixe vazio para um link que nunca expira — um código impresso continua funcionando. Depois desta data, o link responde que expirou.','Reset to default'=>'Restaurar padrão','Design reset to the global default.'=>'Design restaurado para o padrão global.','Pattern'=>'Padrão','The shape of the modules that carry the data.'=>'O formato dos módulos que levam os dados.','Corners'=>'Cantos','The three corner markers a reader locks onto first.'=>'Os três marcadores de canto que o leitor localiza primeiro.','Colours'=>'Cores','Module and background colours, and an optional gradient.'=>'Cores dos módulos e do fundo, e um degradê opcional.','An image in the centre of the code.'=>'Uma imagem no centro do código.','A printed frame with a short call to action.'=>'Uma moldura para impressão com uma chamada curta.','Quiet zone and error correction.'=>'Margem e correção de erros.','Format'=>'Formato','Size'=>'Tamanho','Download'=>'Baixar','The generator remembers your design when you download a code; "Reset to default" goes back to the global design from Settings → QR Code.'=>'O gerador lembra o seu design quando você baixa um código; "Restaurar padrão" volta ao design global de Configurações → QR Code.','Bands above and below'=>'Faixas em cima e embaixo','Circle with curved caption'=>'Círculo com legenda em arco','Corner brackets'=>'Cantoneiras','Cross'=>'Cruz','Cut corners'=>'Cantos chanfrados','Dotted'=>'Pontilhado','Draw no background, for placing the code on a coloured surface'=>'Não desenhar fundo, para aplicar o código sobre uma superfície colorida','Flower'=>'Flor','Globe'=>'Globo','Heart'=>'Coração','Icon (pill and outline frames)'=>'Ícone (molduras pílula e contorno)','One rounded corner'=>'Um canto arredondado','Outline with pointer and icon'=>'Contorno com seta e ícone','Pill with icon below'=>'Pílula com ícone embaixo','Scan'=>'Escanear','Star'=>'Estrela','The frame caption is hard to read on this background; pick a darker frame colour.'=>'A legenda da moldura fica difícil de ler neste fundo; escolha uma cor de moldura mais escura.','Transparent background'=>'Fundo transparente','Transparent background: contrast cannot be checked. Test the code on the surface it will be printed on; a dark one makes it unreadable.'=>'Fundo transparente: não é possível verificar o contraste. Teste o código na superfície onde ele será impresso; uma superfície escura o torna ilegível.','X'=>'X','Send date-based messages'=>'Envie mensagens por data','E-mail people on a date in their profile, such as a birthday, through the same e-mail pipeline, with one-click unsubscribe.'=>'Envie e-mails às pessoas em uma data do perfil delas, como o aniversário, pelo mesmo fluxo de e-mail, com cancelamento de inscrição em um clique.','or jump to any area (Scheduling, Reregistration, Recruitment, Short URLs, Date Messages, Developer).'=>'ou vá direto a qualquer área (Agendamento, Recadastramento, Recrutamento, URLs Curtas, Mensagens por Data, Desenvolvedor).','Colours of the certificate HTML editor on the form screen: Auto (follows Dark Mode), Light or Dark. New installs default to Dark.'=>'Cores do editor HTML do certificado na tela do formulário: Automático (segue o Modo Escuro), Claro ou Escuro. Instalações novas usam Escuro por padrão.','Off by default. When switched on, the daily cleanup permanently deletes published submissions older than the "Delete after (days)" window (default 365).'=>'Desativado por padrão. Quando ativado, a limpeza diária exclui permanentemente os envios publicados mais antigos que a janela "Excluir após (dias)" (padrão 365).','Off by default. When on, forms and the recruitment CSV import reject an RF whose check digit does not match. Before turning it on, run the identity audit on the Data Migrations tab to see how many stored RFs would fail.'=>'Desativado por padrão. Quando ativado, os formulários e a importação CSV do recrutamento recusam um RF cujo dígito verificador não confere. Antes de ativá-lo, execute a auditoria de identidades na aba Migrações de Dados para ver quantos RFs armazenados seriam recusados.','Branding logos'=>'Logotipos de branding','A government / institution logo and an organization logo, picked from the Media Library. They fill the {{logo_gov}} and {{logo_org}} placeholders in the default Record and appointment-receipt templates; a generic placeholder is used when empty.'=>'Um logotipo de governo/instituição e um logotipo da organização, escolhidos na Biblioteca de Mídia. Eles preenchem os marcadores {{logo_gov}} e {{logo_org}} nos modelos padrão de Ficha e de comprovante de agendamento; quando vazios, é usado um marcador genérico.','Hides the Date Messages menu and stops date-based e-mails such as birthdays. While it is on, nothing is sent until an administrator creates and activates a rule.'=>'Oculta o menu Mensagens por Data e interrompe os e-mails por data, como os de aniversário. Enquanto estiver ativado, nada é enviado até que um administrador crie e ative uma regra.','See Date Messages.'=>'Veja Mensagens por Data.','How many ALTCHA challenges one IP address may request per window is set on the Rate Limit tab, in the IP group (default 60 per 10 minutes; 0 removes the cap, which suits sites where many people share one address).'=>'Quantos desafios ALTCHA um endereço IP pode solicitar por janela é definido na aba Taxa Limite, no grupo IP (padrão 60 a cada 10 minutos; 0 remove o limite, o que convém a sites em que muitas pessoas compartilham um mesmo endereço).','See Rate Limit.'=>'Veja Taxa Limite.','Cloudflare:'=>'Cloudflare:','when Cloudflare is in front of the site, a Cloudflare Page Cache card reads the edge cache status of the front page. Cloudflare\'s default (static assets only) is safe; with "Cache Everything", APO or a Cache Rule that caches HTML, add a bypass for the form and dashboard URLs or for the wordpress_logged_in cookie.'=>'quando a Cloudflare está na frente do site, um cartão Cache de páginas da Cloudflare lê o status do cache de borda da página inicial. O padrão da Cloudflare (apenas arquivos estáticos) é seguro; com "Cache Everything", APO ou uma Cache Rule que armazene HTML, adicione uma exceção para as URLs dos formulários e do painel ou para o cookie wordpress_logged_in.','narrow the table by level and by action, or search the entries by text.'=>'filtre a tabela por nível e por ação, ou pesquise os registros por texto.','an activity summary for the last 30 days: the total, the counts by level and the most frequent actions.'=>'um resumo das atividades dos últimos 30 dias: o total, as contagens por nível e as ações mais frequentes.','The most rows the synchronous (no-JavaScript) public CSV download may return (default 2000). Larger exports must use the JavaScript batched flow, which runs in steps and survives shared-hosting timeouts.'=>'O número máximo de linhas que o download síncrono (sem JavaScript) do CSV público pode retornar (padrão 2000). Exportações maiores precisam usar o fluxo em lotes com JavaScript, que roda em etapas e resiste aos tempos limite de hospedagens compartilhadas.','Certificate editor'=>'Editor de certificado','The colour theme of the certificate HTML editor is on the General tab, next to Dark Mode.'=>'O tema de cores do editor HTML do certificado fica na aba Geral, ao lado do Modo Escuro.','See General.'=>'Veja Geral.','Defining a constant is effectively one-way: new writes use the new key the moment it is defined. On a site that already stores data, adopt the constants and then run the Encryption Key Rotation (Settings → Data Migrations) to re-encrypt existing records. Removing or blindly changing a constant on a live site makes existing records unreadable until the exact value is restored — it is never a blind edit.'=>'Definir uma constante é, na prática, um caminho sem volta: novas gravações usam a nova chave assim que ela é definida. Em um site que já armazena dados, adote as constantes e então execute a Rotação de Chaves de Criptografia (Configurações → Migrações de Dados) para recriptografar os registros existentes. Remover ou alterar uma constante às cegas em um site em produção torna os registros existentes ilegíveis até que o valor exato seja restaurado — nunca é uma edição às cegas.','ALTCHA challenges per IP:'=>'Desafios ALTCHA por IP:','the IP group also caps how many captcha challenges one address may request per window (default 60 per 600 seconds). 0 removes the cap — the honest choice where many people share one address, since any per-address number would cap the whole building.'=>'o grupo IP também limita quantos desafios de captcha um endereço pode solicitar por janela (padrão 60 a cada 600 segundos). 0 remove o limite — a escolha honesta quando muitas pessoas compartilham um mesmo endereço, já que qualquer número por endereço limitaria o prédio inteiro.','See Captcha.'=>'Veja Captcha.','Report-only scan (never changes data) of how people are linked to WordPress users. Over certificate submissions: a link to a deleted user, one user bound to multiple CPF/RF identities, an unlinked submission whose CPF matches a linked one, and a single CPF shared across users. Across submissions, appointments, recruitment candidacies and the identity index: one identifier held by two accounts, one account holding two identifiers, and identifiers the index does not carry yet. It also flags a stored CPF or RF whose own check digit does not match. Findings can be exported as CSV and are worked on the Identity Resolution screen.'=>'Varredura somente de relatório (nunca altera dados) de como as pessoas estão vinculadas a usuários do WordPress. Nos envios de certificado: vínculo com um usuário excluído, um usuário ligado a várias identidades CPF/RF, um envio sem vínculo cujo CPF coincide com um vinculado e um mesmo CPF compartilhado entre usuários. Entre envios, agendamentos, candidaturas de recrutamento e o índice de identidades: um identificador em duas contas, uma conta com dois identificadores e identificadores que o índice ainda não contém. Também aponta um CPF ou RF armazenado cujo próprio dígito verificador não confere. Os achados podem ser exportados em CSV e são tratados na tela Resolução de identidade.','Always run the preview first. Deletions (short URLs) are permanent; disabling Public Operator Access is reversible (re-enable on the form editor); the link audit only reports — resolve each finding on the Identity Resolution screen or by hand.'=>'Sempre execute a pré-visualização primeiro. Exclusões (URLs curtas) são permanentes; desativar o Acesso Público do Operador é reversível (reative no editor do formulário); a auditoria de vínculos só relata — resolva cada achado na tela Resolução de identidade ou manualmente.','See Identity Resolution.'=>'Veja Resolução de identidade.','See Data Migrations.'=>'Veja Migrações de Dados.','Check the form\'s Date & Time Restrictions (the "Time" tab of its restrictions) — the form may be outside its open/close window'=>'Verifique as Restrições de Data e Horário do formulário (a aba "Horário" das restrições) — o formulário pode estar fora da sua janela de abertura/encerramento','Reminders, cleanups or date messages run late or not at all'=>'Lembretes, limpezas ou mensagens por data atrasam ou não rodam','Open Settings → Scheduled Tasks and look for tasks marked late'=>'Abra Configurações → Tarefas Agendadas e procure tarefas marcadas como atrasadas','WP-Cron only runs when the site gets visits — install the server cron line that tab generates'=>'O WP-Cron só roda quando o site recebe visitas — instale a linha de cron do servidor que essa aba gera','Upgrade notice.'=>'Aviso de atualização.','View details.'=>'Ver detalhes.','The "View details" modal shows the plugin\'s banner and the tabs a WordPress.org plugin has: description, installation, FAQ, changelog and screenshots, taken from the offered release\'s readme. The screenshots load from GitHub when the modal opens; ratings and active installs are not shown, because only WordPress.org has them.'=>'A janela "Ver detalhes" mostra o banner do plugin e as abas que um plugin do WordPress.org tem: descrição, instalação, perguntas frequentes, registro de alterações e telas, tiradas do readme da versão oferecida. As telas são carregadas do GitHub quando a janela abre; avaliações e instalações ativas não aparecem, porque só o WordPress.org as tem.','Settings → Scheduled Tasks lists the background tasks the plugin runs through WP-Cron — cleanups, reminders, cache warming, date messages and the like — and helps you keep them running on time.'=>'Configurações → Tarefas Agendadas lista as tarefas em segundo plano que o plugin executa pelo WP-Cron — limpezas, lembretes, aquecimento de cache, mensagens por data e afins — e ajuda a mantê-las rodando no horário.','The task table'=>'A tabela de tarefas','Frequency, next run and last run'=>'Frequência, próxima execução e última execução','WordPress only records when a task is due, so the plugin records the last real run itself; it appears after a task first runs.'=>'O WordPress registra apenas quando uma tarefa vence, por isso o próprio plugin registra a última execução real; ela aparece depois que a tarefa roda pela primeira vez.','a recurring task whose last run is older than its interval allows is marked late, and a warning tops the page. A task whose module is turned off on the Modules tab still fires but does nothing.'=>'uma tarefa recorrente cuja última execução é mais antiga do que seu intervalo permite é marcada como atrasada, e um aviso aparece no topo da página. Uma tarefa cujo módulo está desativado na aba Módulos continua disparando, mas não faz nada.','each daily task can be given a time, in the site timezone. Leave it empty to keep the task where it is. Saving times needs the settings-management capability.'=>'cada tarefa diária pode receber um horário, no fuso horário do site. Deixe em branco para manter a tarefa onde está. Salvar horários exige a capacidade de gerenciar configurações.','tasks created per piece of work (one per submission, per reminder batch, per date-messages batch) and removed once they run. A number that keeps growing means WP-Cron is not running.'=>'tarefas criadas por unidade de trabalho (uma por envio, por lote de lembretes, por lote de mensagens por data) e removidas assim que rodam. Um número que só cresce indica que o WP-Cron não está rodando.','By default WP-Cron runs only when someone visits the site, so on a quiet site a daily task can run hours late. The tab generates a crontab line — WP-CLI (recommended, needs WP-CLI on the server), or HTTP with wget or curl (works on any host) — at an interval you pick. Add it with "crontab -e" as the user that owns the WordPress files, or paste it into your hosting panel.'=>'Por padrão, o WP-Cron só roda quando alguém visita o site, então em um site com pouco movimento uma tarefa diária pode atrasar horas. A aba gera uma linha de crontab — WP-CLI (recomendado, exige WP-CLI no servidor) ou HTTP com wget ou curl (funciona em qualquer hospedagem) — no intervalo que você escolher. Adicione-a com "crontab -e" como o usuário dono dos arquivos do WordPress, ou cole-a no painel da sua hospedagem.','The line does not decide when tasks run.'=>'A linha não decide quando as tarefas rodam.','WordPress keeps each task\'s schedule; the server line only makes sure due tasks run promptly, so a short interval is right. Once the line is installed you can add DISABLE_WP_CRON to wp-config.php so visits stop triggering WP-Cron — but with that constant set and no server line, no task runs at all.'=>'O WordPress mantém a agenda de cada tarefa; a linha do servidor só garante que as tarefas vencidas rodem prontamente, por isso um intervalo curto é o adequado. Depois de instalar a linha, você pode adicionar DISABLE_WP_CRON ao wp-config.php para que as visitas deixem de acionar o WP-Cron — mas com essa constante definida e sem a linha do servidor, nenhuma tarefa roda.','Settings → User Access keeps people who only need their own certificates, appointments and profile out of the WordPress admin, sending them to the front-end dashboard instead.'=>'Configurações → Acesso do Usuário mantém fora do painel administrativo do WordPress quem só precisa dos próprios certificados, agendamentos e perfil, levando essas pessoas ao painel do usuário no site.','See User Dashboard & Access.'=>'Veja Painel do Usuário e Acesso.','Off by default. When on, users of the blocked roles who open wp-admin are redirected. Front-end AJAX requests are never blocked, so forms and the dashboard keep working.'=>'Desativado por padrão. Quando ativado, usuários das funções bloqueadas que abrirem o wp-admin são redirecionados. Requisições AJAX do site nunca são bloqueadas, então os formulários e o painel continuam funcionando.','The roles to keep out; the FFC End User role is selected by default. A user is blocked only when every role they hold is in the list, so someone who is also an editor keeps wp-admin access.'=>'As funções a manter fora; a função FFC Usuário Final vem selecionada por padrão. Um usuário só é bloqueado quando todas as funções que ele tem estão na lista, então quem também é editor mantém o acesso ao wp-admin.','On by default: an administrator is never redirected, even when holding a blocked role.'=>'Ativado por padrão: um administrador nunca é redirecionado, mesmo tendo uma função bloqueada.','Where blocked users land — by default the site\'s /dashboard page.'=>'Para onde os usuários bloqueados vão — por padrão, a página /dashboard do site.','The notice shown on the dashboard page after a redirect.'=>'O aviso exibido na página do painel após um redirecionamento.','Off by default, which hides the WordPress admin bar on the front end for users whose roles are all blocked.'=>'Desativado por padrão, o que oculta a barra de administração do WordPress no site para usuários cujas funções estão todas bloqueadas.','The "FFC End User" role is assigned automatically to people who submit forms with a CPF or RF.'=>'A função "FFC Usuário Final" é atribuída automaticamente a quem envia formulários com CPF ou RF.','Settings → IP Diagnostics decides how the plugin works out a visitor\'s IP address. That one choice governs every IP read in the plugin: the activity log, IP geolocation, rate limiting, the geofence and the public listing throttle.'=>'Configurações → Diagnóstico de IP define como o plugin descobre o endereço IP de um visitante. Essa única escolha rege toda leitura de IP no plugin: o registro de atividades, a geolocalização por IP, a limitação de taxa, a cerca geográfica e o controle da listagem pública.','Legacy'=>'Legado','the effective default. It trusts client-supplied headers such as X-Forwarded-For, so a forged header can spoof the address.'=>'o padrão em vigor. Confia em cabeçalhos enviados pelo cliente, como X-Forwarded-For, então um cabeçalho forjado pode falsificar o endereço.','Secure (recommended)'=>'Segura (recomendada)','a trusted-proxy model: a forwarded header is honoured only when the request really comes from Cloudflare or a proxy you trust, so the real client is found and cannot be forged.'=>'um modelo de proxy confiável: um cabeçalho encaminhado só é aceito quando a requisição vem de fato da Cloudflare ou de um proxy em que você confia, de modo que o cliente real é encontrado e não pode ser forjado.','With the secure strategy, the trusted-proxy mode says whom to believe: Auto (detect Cloudflare or a known proxy, else use the direct connection — recommended), Cloudflare, Custom (your own proxy CIDRs, one per line — never Cloudflare\'s, which are kept up to date automatically) or Direct (ignore every forwarded header).'=>'Com a estratégia segura, o modo de proxy confiável diz em quem acreditar: Automático (detecta a Cloudflare ou um proxy conhecido, senão usa a conexão direta — recomendado), Cloudflare, Personalizado (os CIDRs do seu próprio proxy, um por linha — nunca os da Cloudflare, que são mantidos atualizados automaticamente) ou Direto (ignora todo cabeçalho encaminhado).','What the tab shows'=>'O que a aba mostra','how your own request would be resolved, the headers received, and what each strategy would do with a forged X-Forwarded-For. IPs are masked unless you are a full administrator.'=>'como a sua própria requisição seria resolvida, os cabeçalhos recebidos e o que cada estratégia faria com um X-Forwarded-For forjado. Os IPs ficam mascarados, a menos que você seja administrador completo.','Cloudflare ranges'=>'Intervalos da Cloudflare','the official Cloudflare IP lists, refreshed daily (a bundled list is used until the first refresh), with a button to refresh them now.'=>'as listas oficiais de IPs da Cloudflare, atualizadas diariamente (uma lista embutida é usada até a primeira atualização), com um botão para atualizá-las agora.','off by default. When on, it logs (with a hashed IP) every request where the two strategies would disagree, so you can measure the impact before switching.'=>'desativado por padrão. Quando ativado, registra (com IP em hash) cada requisição em que as duas estratégias divergiriam, para que você meça o impacto antes de trocar.','Why Legacy is still the default:'=>'Por que Legado ainda é o padrão:','switching changes which address rate limits and the geofence see, which can matter on shared hosting. The tab recommends Secure, and putting Cloudflare (free plan) in front of the site for an address that cannot be forged.'=>'trocar muda o endereço que a limitação de taxa e a cerca geográfica enxergam, o que pode pesar em hospedagens compartilhadas. A aba recomenda Segura e colocar a Cloudflare (plano gratuito) na frente do site, para ter um endereço que não pode ser forjado.','Settings → Data Migrations brings stored data in line with what newer versions of the plugin expect. Each migration is a card showing how many records are migrated and how many are still pending. Click "Run Migration" once: it keeps processing batches until the card reaches 100%, with a live progress bar. Running a migration needs the Danger Zone capability.'=>'Configurações → Migrações de Dados adequa os dados armazenados ao que as versões mais novas do plugin esperam. Cada migração é um cartão que mostra quantos registros já foram migrados e quantos ainda estão pendentes. Clique em "Executar Migração" uma vez: ela continua processando lotes até o cartão chegar a 100%, com uma barra de progresso ao vivo. Executar uma migração exige a capacidade da Zona de Perigo.','What the cards do'=>'O que os cartões fazem','Identifiers and search hashes'=>'Identificadores e hashes de busca','split the old combined CPF/RF column into separate CPF and RF columns, rewrite stored CPF, RF and e-mail values into one canonical form, rebuild the e-mail lookup hashes, and copy the CPF/RF hashes already linked to a user into the identity index.'=>'separam a antiga coluna combinada CPF/RF em colunas distintas de CPF e RF, reescrevem os valores armazenados de CPF, RF e e-mail em uma forma canônica única, recalculam os hashes de busca de e-mail e copiam para o índice de identidades os hashes de CPF/RF já vinculados a um usuário.','See Advanced → Encryption Key Health.'=>'Veja Avançado → Integridade da Chave de Criptografia.','Accounts and profiles'=>'Contas e perfis','grant the certificate capabilities to accounts that own a certificate but cannot open it, name accounts created without a name, split full names into WordPress\'s first and last name, and copy birth dates already given in reregistrations to the profile.'=>'concedem as capacidades de certificado às contas que possuem um certificado mas não conseguem abri-lo, dão nome às contas criadas sem nome, dividem o nome completo em nome e sobrenome do WordPress e copiam para o perfil as datas de nascimento já informadas em recadastramentos.','Legacy certificate templates'=>'Modelos de certificado legados','import layouts left in the old html/ drop-folder into the template pool and move the images they reference into the Media Library. These cards appear only while that folder exists.'=>'importam os layouts deixados na antiga pasta html/ para o acervo de modelos e movem as imagens que eles referenciam para a Biblioteca de Mídia. Esses cartões só aparecem enquanto essa pasta existir.','Safe to repeat, not to undo.'=>'Pode repetir, não pode desfazer.','A migration can be run again safely, and a finished one simply has nothing left to do. It cannot be undone, so take a database backup first and run the encryption cards during low traffic.'=>'Uma migração pode ser executada de novo com segurança, e uma já concluída simplesmente não tem mais nada a fazer. Ela não pode ser desfeita, então faça antes um backup do banco de dados e execute os cartões de criptografia em horário de pouco movimento.','The same tab hosts the maintenance tools and the identity audit.'=>'A mesma aba abriga as ferramentas de manutenção e a auditoria de identidades.','See Maintenance Tools.'=>'Veja Ferramentas de Manutenção.','Certificate → Identities lists accounts and stored CPF/RF numbers that do not agree with each other — the findings of the identity audit on the Data Migrations tab — sorted by how much of the answer is already known. Check digits can say a number is wrong, never what the right one is, so confirm corrections with HR. Identifiers are shown as a hash; a stored number is never displayed.'=>'Certificado → Identidades lista contas e números de CPF/RF armazenados que não concordam entre si — os achados da auditoria de identidades da aba Migrações de Dados — ordenados por quanto da resposta já se sabe. O dígito verificador pode dizer que um número está errado, nunca qual é o certo, por isso confirme as correções com o RH. Os identificadores aparecem como hash; um número armazenado nunca é exibido.','The panels'=>'Os painéis','a stored CPF or RF that fails its own check digit. Work these first: a number that cannot be anyone\'s is not evidence that two accounts are one person, so a merge or move that depends on it is refused.'=>'um CPF ou RF armazenado que não passa no próprio dígito verificador. Trate estes primeiro: um número que não pode ser de ninguém não prova que duas contas são a mesma pessoa, por isso uma mesclagem ou movimentação que dependa dele é recusada.','an account holding two values where the check digits show which one is wrong, so no value has to be asked for.'=>'uma conta com dois valores em que os dígitos verificadores mostram qual está errado, então não é preciso pedir nenhum valor.','one number stored against more than one account: either a duplicate login to merge, or one login carrying someone else\'s mistyped number.'=>'um número armazenado em mais de uma conta: ou um login duplicado a mesclar, ou um login com o número digitado errado de outra pessoa.','numbers that share one address without being variants of each other, such as a shared mailbox or an account submitting for other people. Each number shows the names recorded beside it, read from the submissions themselves, so the right person can be found for each one.'=>'números que compartilham um mesmo endereço sem serem variações uns dos outros, como uma caixa de correio compartilhada ou uma conta que envia por outras pessoas. Cada número mostra os nomes registrados junto a ele, lidos das próprias submissões, para que se encontre a pessoa certa de cada um.','the check digits do not single one value out, so HR has to say which number is this person\'s.'=>'os dígitos verificadores não apontam um único valor, então o RH precisa dizer qual número é o desta pessoa.','records carrying an identifier that belongs to no account, usually recruitment candidacies never promoted or records whose account was deleted.'=>'registros com um identificador que não pertence a nenhuma conta, geralmente candidaturas de recrutamento nunca promovidas ou registros cuja conta foi excluída.','replace a wrong stored number with the right one.'=>'substitua um número armazenado errado pelo correto.','Move or link'=>'Mover ou vincular','attach records to the account they belong to. The two sides must already agree on one identifier, and the screen says before you confirm whether the move would be accepted.'=>'associe registros à conta a que pertencem. Os dois lados já precisam concordar em um identificador, e a tela informa, antes da confirmação, se a movimentação seria aceita.','give records an account of their own, which creates a WordPress user.'=>'dê aos registros uma conta própria, o que cria um usuário do WordPress.','consolidate two logins that are one person. It cannot be undone: afterwards nothing can say which record came from which login.'=>'una dois logins que são a mesma pessoa. Não pode ser desfeito: depois, nada consegue dizer de qual login veio cada registro.','when the number was never supplied or HR cannot say whose it is, record that decision. The finding moves to "Accepted — no resolution possible", where it can be put back in the queue; nothing stored changes, and a merge or move blocked by that number stays blocked.'=>'quando o número nunca foi informado ou o RH não sabe dizer de quem é, registre essa decisão. O achado passa para "Aceitos — sem resolução possível", de onde pode ser devolvido à fila; nada armazenado muda, e uma mesclagem ou movimentação bloqueada por esse número continua bloqueada.','Every action runs as a single transaction, rolled back whole if any part refuses. The findings can be exported as CSV.'=>'Cada ação roda como uma única transação, desfeita por inteiro se qualquer parte recusar. Os achados podem ser exportados em CSV.','open the screen, correct numbers and move records. It does not reveal a stored identifier.'=>'abrir a tela, corrigir números e mover registros. Não revela um identificador armazenado.','open a new account from the queue.'=>'abrir uma nova conta a partir da fila.','merge two accounts.'=>'mesclar duas contas.','New wrong RFs keep arriving while the RF check digit setting is off.'=>'Novos RFs errados continuam chegando enquanto a configuração do dígito verificador do RF estiver desativada.','On the Geolocation tab of the form editor\'s "Certificate Form Configuration" box, choose the area source for GPS and IP validation:'=>'Na aba Geolocalização da caixa "Configuração do Formulário de Certificado" do editor de formulários, escolha a origem da área para a validação por GPS e por IP:','Turning a form into a quiz'=>'Transformando um formulário em quiz','Enable it on the Quiz tab of the form editor\'s "Certificate Form Configuration" box, then give each scored field its points per option on the Fields tab. Only radio and select fields are scored.'=>'Ative-o na aba Quiz da caixa "Configuração do Formulário de Certificado" do editor de formulários e, em seguida, defina os pontos por opção de cada campo pontuado na aba Campos. Apenas campos de botões de seleção única e de caixa de seleção suspensa são pontuados.','minimum percentage to pass (default 70; 0 means no minimum).'=>'percentual mínimo para aprovação (padrão 70; 0 significa sem mínimo).','retries allowed per CPF/RF (0 = unlimited).'=>'tentativas permitidas por CPF/RF (0 = ilimitadas).','show the score after submission (on by default) and show which answers were correct or incorrect.'=>'mostrar a pontuação após o envio (ativado por padrão) e mostrar quais respostas estavam corretas ou incorretas.','An attempt below the passing score is kept as a "Quiz: Retry" submission while attempts remain, and as "Quiz: Failed" once they run out; no certificate is issued for either.'=>'Uma tentativa abaixo da nota de aprovação é mantida como submissão "Quiz: Tentando" enquanto restarem tentativas, e como "Quiz: Reprovado" quando elas se esgotam; nenhum certificado é emitido em nenhum dos dois casos.','Validation page:'=>'Página de validação:','The public /valid page also finds a record by its authentication code or its magic link'=>'A página pública /valid também localiza uma ficha pelo código de autenticação ou pelo link mágico','Account email'=>'E-mail da conta','Authentication code — filled only once the submission is approved'=>'Código de autenticação — preenchido somente depois que a submissão é aprovada','Ready-made "Authentication: …" footer fragment, empty until the submission is approved'=>'Trecho de rodapé pronto "Autenticação: …", vazio até a submissão ser aprovada','Year the campaign started'=>'Ano de início da campanha','Branding logo URLs from Settings > General > Branding'=>'URLs dos logotipos definidas em Configurações > Geral > Identidade Visual','Division / Sector (see the dependent-select note below for each half)'=>'Divisão / Setor (veja a nota sobre seleção dependente abaixo para cada parte)','The certificate PDF a form issues on submission (the default kind). Three ready-made certificate models ship.'=>'O PDF do certificado que um formulário emite no envio (o tipo padrão). Três modelos de certificado prontos acompanham o plugin.','A read-only "Current assignments" overview on the Document Templates tab shows which pool template the appointment receipts (Regular and Custom) and the reregistration record are using right now, with a "Change →" link into that feature\'s own settings. Each row appears only to users who can view that feature, and certificates have no row because each form chooses its own. The overview is display-only — the selection controls (and their capabilities) stay per-feature.'=>'Uma visão geral somente leitura, "Atribuições atuais", na aba Modelos de documento, mostra qual modelo do acervo os comprovantes de agendamento (Regular e Personalizado) e a ficha de recadastramento estão usando no momento, com um link "Alterar →" para as configurações do próprio recurso. Cada linha aparece apenas para usuários que podem visualizar aquele recurso, e os certificados não têm linha porque cada formulário escolhe o seu. A visão geral é apenas informativa — os controles de seleção (e suas permissões) continuam em cada recurso.','A form\'s input fields are defined on the Fields tab ("Form Builder (Fields)") of the form editor\'s "Certificate Form Configuration" box — a sortable list of fields. Each field has a Variable Name (Tag); that tag is the machine key that becomes a {{token}} on the certificate PDF and in emails.'=>'Os campos de entrada de um formulário são definidos na aba Campos ("Construtor de Formulários (Campos)") da caixa "Configuração do Formulário de Certificado" do editor de formulários — uma lista ordenável de campos. Cada campo tem um Nome da variável (etiqueta); essa etiqueta é a chave interna que se torna um {{token}} no PDF do certificado e nos e-mails.','Name fields (keys such as name, nome, nome_completo, full_name or participante) are normalized on submit to proper capitalization, keeping Portuguese connectives such as "da" and "de" in lowercase.'=>'Campos de nome (chaves como name, nome, nome_completo, full_name ou participante) são normalizados no envio para a capitalização correta, mantendo em minúsculas conectivos como "da" e "de".','Each form has its own Email tab ("Email Configuration") in the form editor\'s "Certificate Form Configuration" box, controlling the message sent to the participant on submission, plus an optional admin notification.'=>'Cada formulário tem sua própria aba E-mail ("Configuração de E-mail") na caixa "Configuração do Formulário de Certificado" do editor de formulários, que controla a mensagem enviada ao participante no envio, além de uma notificação opcional ao administrador.','the subject is a plain text field and the body is edited in a visual editor. "Restore Default Text" restores the current global default, and an empty body also falls back to the default when the email is sent.'=>'o assunto é um campo de texto simples e o corpo é editado em um editor visual. "Restaurar Texto Padrão" restaura o padrão global atual, e um corpo vazio também volta ao padrão quando o e-mail é enviado.','Geofencing restricts where a form may be submitted. It is configured on the Geolocation tab of the form editor\'s "Certificate Form Configuration" box, and can validate by GPS position, by IP geolocation, or both.'=>'O georreferenciamento restringe os locais onde um formulário pode ser enviado. Ele é configurado na aba Geolocalização da caixa "Configuração do Formulário de Certificado" do editor de formulários e pode validar pela posição GPS, pela geolocalização por IP ou por ambos.','When both are enabled you choose whether the visitor must pass GPS AND IP, or either one (OR, the default). Blocked visitors see a configurable message, the title + description + message, or the form is hidden. A separate Error Message is shown when the location cannot be determined (e.g. GPS permission denied).'=>'Quando ambos estão habilitados, você escolhe se o visitante deve passar pela verificação de GPS E IP, ou por apenas um deles (OU, o padrão). Visitantes bloqueados veem uma mensagem configurável, o título + descrição + mensagem, ou têm o formulário ocultado. Uma Mensagem de Erro separada é exibida quando não é possível determinar a localização (ex.: permissão de GPS negada).','You pick where the allowed GPS area comes from; IP validation reuses the GPS areas unless "Use different areas for IP validation" is checked, in which case IP gets its own source:'=>'Você escolhe de onde vem a área permitida para o GPS; a validação por IP reutiliza as áreas do GPS, a menos que "Utilize áreas diferentes para validação por IP." esteja marcado, caso em que o IP tem sua própria origem:','Public Operator Access (formerly "Public CSV Download") lets a trusted operator who does NOT have a WordPress login interact with a single form through a secret, per-form link. It is enabled on the Operator tab ("Public Operator Access") of the form editor\'s "Certificate Form Configuration" box.'=>'O Acesso Público de Operador (anteriormente "Download de CSV Público") permite que um operador de confiança, que NÃO possui login no WordPress, interaja com um formulário específico por meio de um link secreto exclusivo para aquele formulário. O recurso é ativado na aba Operador ("Acesso Público de Operador") da caixa "Configuração do Formulário de Certificado" do editor de formulários.','The hash is the only credential — treat the link as a password. Set the base page under Settings → General ("CSV Download Page URL") so the editor shows the full link instead of just the query string. The hash is regenerated on demand ("Regenerate hash on save") and is deliberately NOT copied when a form is duplicated. A separate option resets the download counter to zero on save.'=>'O hash é a única credencial — trate o link como uma senha. Defina a página base em Configurações → Geral ("URL da página de download do arquivo CSV") para que o editor exiba o link completo, em vez de apenas a query string. O hash é regenerado sob demanda ("Regenerar hash ao salvar") e, deliberadamente, não é copiado quando um formulário é duplicado. Uma opção separada zera o contador de downloads ao salvar.','The CPF gate is checked again when the operator uses Start Form Early or Postpone Close.'=>'A exigência de CPF é verificada novamente quando o operador usa Início Antecipado ou Adiar Fechamento.','With "Enable Schedule Exception" switched on in the form\'s Time tab, the operator page shows an "Entry/exit exception" button. It records an individual entry/exit time for one participant, which replaces {{schedule}} on that participant\'s certificate. The "Default Modal Mode" setting chooses whether the dialog opens with the end time pre-filled with the current moment (Now) or lets the operator type both ends (Manual).'=>'Com "Habilitar exceção de horário" ativado na aba Horário do formulário, a página do operador exibe o botão "Entrada/saída diferenciada". Ele registra um horário de entrada/saída individual para um participante, que substitui {{schedule}} no certificado desse participante. A configuração "Modo padrão do modal" define se a janela abre com o horário de término preenchido com o momento atual (Agora) ou deixa o operador digitar os dois horários (Manual).','A form can accept submissions only inside a date/time window. The window is configured on the Time tab of the form editor\'s "Certificate Form Configuration" box. Outside the window the form is blocked with a configurable message (or hidden entirely). Administrators can be set to bypass date/time restrictions under Settings → Geolocation.'=>'Um formulário pode aceitar submissões apenas dentro de uma janela de data/horário. A janela é configurada na aba Horário da caixa "Configuração do Formulário de Certificado" do editor de formulários. Fora da janela, o formulário é bloqueado com uma mensagem configurável (ou totalmente ocultado). Os administradores podem ser configurados para ignorar as restrições de data/hora em Configurações → Geolocalização.','Before / during / after the window you can independently show a message, show the title + description + message, or hide the form. The "during" setting applies only in daily mode, outside that day\'s hours.'=>'Antes, durante ou após a janela, você pode, de forma independente, exibir uma mensagem, exibir título + descrição + mensagem, ou ocultar o formulário. A opção "durante" só se aplica ao modo diário, fora do horário do dia.','The "Event Schedule (Reference)" times on the same tab are printed on the certificate via the {{schedule}} and {{schedule_total}} tokens — they do not open or close the form. Once they are filled, the certificate layout must contain {{schedule}}. The tokens use a per-participant exception first, then the Event Schedule, then the window\'s start/end time. See'=>'Os horários do "Cronograma do Evento (Referência)" na mesma aba são impressos no certificado pelos tokens {{schedule}} e {{schedule_total}} — eles não abrem nem fecham o formulário. Depois de preenchidos, o layout do certificado precisa conter {{schedule}}. Os tokens usam primeiro uma exceção individual do participante, depois o Cronograma do Evento e, por fim, o horário de início/término da janela. Veja','moves the close time later on the scheduled close day, after the form has opened; the new time must stay within the same day.'=>'adia o horário de fechamento no dia previsto para o encerramento, depois que o formulário já abriu; o novo horário deve permanecer no mesmo dia.','The /valid page (the [ffc_verification] shortcode) also offers a manual lookup: anyone can type a certificate\'s authentication code to confirm it is genuine and view its status. The same lookup and the magic link also verify appointment receipts and reregistration records by their own codes and links. This path is protected by a nonce, a honeypot + the configured captcha, and IP rate-limiting.'=>'A página /valid (shortcode [ffc_verification]) também oferece uma consulta manual: qualquer pessoa pode digitar o código de autenticação de um certificado para confirmar que ele é autêntico e ver seu status. A mesma consulta e o link mágico também verificam comprovantes de agendamento e fichas de recadastramento pelos seus próprios códigos e links. Esse caminho é protegido por nonce, honeypot + o captcha configurado e limitação de taxa por IP.','The table shows the id, form, email, a short preview of non-sensitive fields, status and date. You can filter by one or more forms and switch between Published, Trash, and the quiz states (Retry, Failed). The search box matches a submission id, an auth code, or an exact email, CPF or RF. Personal columns are decrypted only for the row display; the preview never includes email, CPF/RF or the auth code.'=>'A tabela exibe o ID, o formulário, o e-mail, uma breve prévia de campos não sensíveis, o status e a data. É possível filtrar por um ou mais formulários e alternar entre Publicado, Lixeira e os estados do quiz (Tentando, Reprovado). A caixa de busca encontra um ID de submissão, um código de autenticação ou um e-mail, CPF ou RF exato. Colunas com dados pessoais são descriptografadas apenas para a exibição na linha; a prévia nunca inclui e-mail, CPF/RF ou código de autenticação.','The edit screen lets you correct the participant email and the form\'s custom-field values, and link, unlink or re-link the WordPress user. The LGPD consent status is shown for reference only. Identity and integrity fields are read-only: submission id, date, status, magic-link token, IP, CPF/RF and the auth code (so a certificate can never be silently re-pointed).'=>'A tela de edição permite corrigir o e-mail do participante e os valores dos campos personalizados do formulário, além de vincular, desvincular ou trocar o usuário do WordPress. O status de consentimento da LGPD é exibido apenas para consulta. Os campos de identidade e integridade são somente leitura: ID da submissão, data, status, token de link mágico, IP, CPF/RF e código de autenticação (garantindo que um certificado nunca possa ser redirecionado silenciosamente).','Export the current (filtered) submissions to CSV in the background. The export contains decrypted personal data (email, IP, CPF/RF), the magic-link token and the consent record, so it is gated by its own capability.'=>'Exporte as submissões atuais (filtradas) para CSV em segundo plano. A exportação contém dados pessoais descriptografados (e-mail, IP, CPF/RF), o token de link mágico e o registro de consentimento, por isso é controlada por uma permissão própria.','Trash / restore and bulk actions, including "Move to form…" (offered when the list is filtered to a single form).'=>'Enviar para a lixeira / restaurar e ações em massa, incluindo "Mova para o formulário…" (oferecida quando a lista está filtrada por um único formulário).','Reveal the decrypted CPF / RF / email on demand instead of the masked values; every reveal is audited. Without it the list and the edit screen stay masked, whatever else the operator holds. The certificate PDF is not masked: it prints CPF/RF formatted with punctuation.'=>'Revelar sob demanda o CPF / RF / e-mail descriptografados em vez dos valores mascarados; cada revelação é auditada. Sem ela, a lista e a tela de edição permanecem mascaradas, independentemente de outras permissões do operador. O PDF do certificado não é mascarado: ele imprime o CPF/RF formatado com pontuação.','Minimum interval between bookings'=>'Intervalo mínimo entre agendamentos','Stops a user from booking again within this many hours of their last booking (default 24; 0 disables it).'=>'Impede que um usuário agende novamente dentro desse número de horas após o seu último agendamento (padrão 24; 0 desativa).','Business-hours restrictions'=>'Restrições ao horário de funcionamento','Optionally limit viewing the calendar, or only booking on it, to the configured working hours.'=>'Opcionalmente, limita a visualização do calendário, ou apenas os agendamentos nele, ao horário de funcionamento configurado.','Admin bypass'=>'Bypass de administrador','Per calendar: whether holders of manage_options or ffc_bypass_appointments may book outside the advance window, on blocked dates, outside working hours and past the daily/interval limits. Turn it off to apply every rule to administrators too.'=>'Por calendário: define se quem possui manage_options ou ffc_bypass_appointments pode agendar fora da janela de antecedência, em datas bloqueadas, fora do horário de funcionamento e além dos limites diário e de intervalo. Desative para aplicar todas as regras também aos administradores.','Active, Inactive (no new bookings) or Archived.'=>'Ativo, Inativo (sem novos agendamentos) ou Arquivado.','Each calendar independently enables: user confirmation, admin notification, approval notice, cancellation notice and a reminder (default 24h before). When the waitlist is on, an "added to waitlist" notice and a "spot opened up" promotion notice are sent too. The user-facing ones are token-based and editable once in Settings → Email texts (the confirmation can also be overridden per calendar); the admin notification has a fixed body. Every one is wrapped in the shared Email Model chrome. A user who turns off "Appointment reminder" in their dashboard notification preferences does not receive the reminder.'=>'Cada calendário ativa de forma independente: confirmação ao usuário, notificação ao administrador, aviso de aprovação, aviso de cancelamento e um lembrete (padrão: 24h antes). Com a lista de espera ativa, também são enviados o aviso de "adicionado à lista de espera" e o aviso de promoção "vaga liberada". Os e-mails destinados ao usuário usam tokens e são editados uma única vez em Configurações → Textos dos e-mails (a confirmação também pode ser personalizada por calendário); a notificação ao administrador tem corpo fixo. Todos são envolvidos pelo layout compartilhado do Modelo de e-mail. Um usuário que desativa "Lembrete de agendamento" nas preferências de notificação do seu painel não recebe o lembrete.','view the calendars read-only, or create, edit, publish and delete them (structure, working hours and options).'=>'ver os calendários somente para leitura, ou criá-los, editá-los, publicá-los e excluí-los (estrutura, horário de funcionamento e opções).','view or manage the appointments booked on those calendars.'=>'ver ou gerenciar os agendamentos feitos nesses calendários.','Go to Scheduling → Audiences, edit an audience, and use its Reregistration Fields section'=>'Acesse Agendamento → Públicos-alvo, edite um público-alvo e use a seção Campos de Recadastramento','Viewing the field definitions needs ffc_view_custom_fields and editing them needs ffc_manage_custom_fields; without either, the section is hidden.'=>'Ver as definições dos campos exige ffc_view_custom_fields e editá-las exige ffc_manage_custom_fields; sem nenhuma das duas, a seção fica oculta.','Field definitions are stored in the ffc_custom_fields table. User data is stored as JSON in wp_usermeta under the key ffc_custom_fields_data; fields mapped to a profile key (such as CPF, RF, RG or birth date) are also written, encrypted, to the plugin user profile.'=>'As definições dos campos são armazenadas na tabela ffc_custom_fields. Os dados do usuário são armazenados como JSON em wp_usermeta, na chave ffc_custom_fields_data; os campos mapeados para uma chave de perfil (como CPF, RF, RG ou data de nascimento) também são gravados, criptografados, no perfil de usuário do plugin.','An audience is a named group of members, with a color, an active/inactive status and an optional 3-level parent hierarchy. Members are imported or self-join (when allowed): an audience can let users join or leave its child groups from their dashboard, with a cap on how many child groups one user may join, and its descendants inherit the setting. Audiences also carry the custom fields used by reregistration.'=>'Um público-alvo é um grupo nomeado de membros, com uma cor, um status ativo/inativo e uma hierarquia opcional de até 3 níveis. Os membros são importados ou entram por conta própria (quando permitido): um público-alvo pode permitir que os usuários entrem ou saiam dos seus grupos filhos pelo painel, com um limite de quantos grupos filhos um mesmo usuário pode integrar, e os seus descendentes herdam essa configuração. Os públicos-alvo também carregam os campos personalizados usados no recadastramento.','Admin pages'=>'Páginas administrativas','Besides the calendars, environments and audiences, the Scheduling menu has a Dashboard and an Audience Bookings list of every booking (exportable as CSV with ffc_export_audiences). Global holidays, set on the Scheduling → Settings → General tab, block bookings on those dates.'=>'Além dos calendários, ambientes e públicos-alvo, o menu Agendamento tem um Painel e a lista Agendamentos de Público-alvo, com todos os agendamentos (exportável em CSV com ffc_export_audiences). Os feriados globais, definidos na aba Agendamento → Configurações → Geral, bloqueiam agendamentos nessas datas.','The Scheduling → Settings → Import & Export tab imports and exports audiences (name, color, parent) and members (email, name, audience) as CSV, optionally creating WordPress users for imported members.'=>'A aba Agendamento → Configurações → Importar e Exportar importa e exporta públicos-alvo (nome, cor, pai) e membros (e-mail, nome, público-alvo) em CSV, criando opcionalmente usuários do WordPress para os membros importados.','A campaign shows the union of the custom fields of its linked audiences (standard identity/contact fields plus any custom ones). Each submission can be exported as a Record PDF. The standard birth-date field reads and writes the single encrypted birth date on the user profile, which Date Messages uses.'=>'Uma campanha exibe a união dos campos personalizados dos públicos-alvo vinculados (os campos padrão de identidade/contato e os personalizados). Cada envio pode ser exportado como PDF da Ficha. O campo padrão de data de nascimento lê e grava a data de nascimento única e criptografada do perfil do usuário, usada pelas Mensagens por Data.','create/edit campaigns, approve/reject, generate Records. Editing the field definitions needs ffc_manage_custom_fields.'=>'criar/editar campanhas, aprovar/rejeitar, gerar Fichas. Editar as definições dos campos exige ffc_manage_custom_fields.','Candidates are imported from CSV (headers: name, cpf, rf, email, adjutancy, rank, score, pcd, plus optional phone, time_points, hab_emebs) into either the preliminary or the definitive list. Call-ups are recorded per candidate; calling out of rank order requires a reason. Outcomes move a candidate through called → accepted / not_shown / hired / withdrew. Importing a candidate also links or creates their WordPress account (matched by CPF, RF or e-mail), which is what lets them follow their own call-ups.'=>'Os candidatos são importados de CSV (cabeçalhos: name, cpf, rf, email, adjutancy, rank, score, pcd, além dos opcionais phone, time_points, hab_emebs) para a lista preliminar ou para a definitiva. As convocações são registradas por candidato; convocar fora da ordem de classificação exige um motivo. Os resultados levam o candidato por called → accepted / not_shown / hired / withdrew. Importar um candidato também vincula ou cria a sua conta do WordPress (localizada por CPF, RF ou e-mail), o que permite que ele acompanhe as próprias convocações.','A capacity meter and density and contrast warnings help keep the code readable, and the preview panel can also print it. An event code can open the event itself, a pre-filled Google Calendar link, or a signed link to an .ics file; that link may carry an optional "valid until" date, after which it answers that it has expired, while a link without one never expires. The generator reopens with each user\'s last downloaded design (design only, never content), and "Reset to default" restores the global one.'=>'Um medidor de capacidade e avisos de densidade e de contraste ajudam a manter o código legível, e o painel de pré-visualização também permite imprimi-lo. Um código de evento pode abrir o próprio evento, um link pré-preenchido do Google Agenda ou um link assinado para um arquivo .ics; esse link pode ter uma data opcional de "válido até", após a qual informa que expirou, enquanto um link sem essa data nunca expira. O gerador reabre com o último design baixado por cada usuário (apenas o design, nunca o conteúdo), e "Restaurar padrão" volta ao design global.','Enable the shortener (Settings → Modules)'=>'Ativar o encurtador (Configurações → Módulos)','Their audience bookings, and the Recruitment tab with their call-ups, when they belong to an audience or are linked to a candidate'=>'Seus agendamentos de público-alvo e a aba Recrutamento com as suas convocações, quando pertence a um público-alvo ou está vinculado a um candidato','A Profile tab, read from the plugin\'s own user profile, where they edit their display name, phone, department, organization, notes and birth date (stored encrypted, and the date Date Messages uses)'=>'Uma aba Perfil, lida do perfil de usuário do próprio plugin, onde edita nome de exibição, telefone, departamento, organização, observações e data de nascimento (armazenada criptografada e usada pelas Mensagens por Data)','Notification Preferences: an "Appointment reminder" toggle and, when the Date Messages module is on, a "Date messages (such as birthday greetings)" toggle that opts them out; both are on until turned off'=>'Preferências de Notificação: uma chave "Lembrete de agendamento" e, quando o módulo Mensagens por Data está ativo, uma chave "Mensagens por data (como felicitações de aniversário)" que permite deixar de recebê-las; ambas ficam ativas até serem desligadas','Change Password, and Privacy & Data (LGPD) buttons to request an export or the deletion of their personal data'=>'Alterar a Senha e os botões de Privacidade e Dados (LGPD) para solicitar a exportação ou a exclusão dos seus dados pessoais','View as user:'=>'Ver como usuário:','holders of ffc_view_as_user can open the dashboard as another user, under a banner, from the users list or the user-edit screen ("Login as User").'=>'quem possui ffc_view_as_user pode abrir o painel como outro usuário, sob um aviso, a partir da lista de usuários ou da tela de edição do usuário ("Entrar como Usuário").','The identity/contact/address/employment fields live on the plugin\'s user profile and are mapped to the reregistration and audience data, so a user\'s details stay consistent across a certificate PDF, a record and their profile. WordPress\'s first and last name follow the plugin\'s full name (first word / the rest), and editing First/Last Name on the user-edit screen updates it back.'=>'Os campos de identidade/contato/endereço/vínculo ficam no perfil de usuário do plugin e são mapeados para os dados de recadastramento e de público-alvo, de modo que os dados do usuário permanecem consistentes entre o PDF do certificado, a ficha e o perfil. O nome e o sobrenome do WordPress acompanham o nome completo do plugin (primeira palavra / o restante), e editar Nome/Sobrenome na tela de edição do usuário atualiza o nome completo de volta.','A read-only index at the bottom of the tab lists the plugin\'s emails, grouped by feature, each with a one-line purpose, a personalisation state (Editable text / On-off only / System default) and an "Open →" deep-link to where it is configured. It is discoverability only — it moves no controls.'=>'Um índice somente leitura no fim da aba lista os e-mails do plugin, agrupados por recurso, cada um com uma linha de finalidade, um estado de personalização (Texto editável / Apenas ativar/desativar / Padrão do sistema) e um link "Abrir →" para onde é configurado. Ele serve apenas para descoberta — não move nenhum controle.','See Date Messages'=>'Ver Mensagens por Data','Birthday message — the default text a new rule starts from'=>'Mensagem de aniversário — o texto padrão com que uma nova regra começa','Date-message e-mails'=>'E-mails das mensagens por data','Each Date Messages rule sends its own subject and body to each person on their date, through the same pipeline and chrome. A body that does not place {{unsubscribe_url}} gets an unsubscribe line appended. A rule can also e-mail chosen managers a summary 24 hours after each run; that summary has a fixed body.'=>'Cada regra de Mensagens por Data envia o seu próprio assunto e corpo a cada pessoa na sua data, pelo mesmo fluxo e com o mesmo layout. Um corpo que não inclui {{unsubscribe_url}} recebe uma linha de cancelamento de inscrição ao final. Uma regra também pode enviar a gestores escolhidos um resumo 24 horas após cada execução; esse resumo tem corpo fixo.','Date-message tokens:'=>'Tokens das mensagens por data:','Date Messages sends an e-mail on a date stored in each person\'s profile — today, their birthday. It has its own top-level "Date Messages" menu with the Rules, Send now, History, Upcoming dates and Schedule tabs.'=>'Mensagens por Data envia um e-mail em uma data armazenada no perfil de cada pessoa — hoje, o aniversário. O módulo tem o seu próprio menu principal "Mensagens por Data", com as abas Regras, Enviar agora, Histórico, Próximas datas e Agendar.','On, but silent until you create a rule.'=>'Ativo, mas sem enviar nada até que você crie uma regra.','The module is enabled by default (Settings → Modules), but no rule ships with the plugin, so nothing is sent until an administrator creates a rule and activates it.'=>'O módulo vem ativado por padrão (Configurações → Módulos), mas o plugin não traz nenhuma regra pronta; portanto, nada é enviado até que um administrador crie uma regra e a ative.','Operator-facing label for the rule.'=>'Rótulo da regra exibido aos operadores.','Which date in the profile the rule follows (the birth date).'=>'Qual data do perfil a regra acompanha (a data de nascimento).','0 sends on the date itself; a negative number sends that many days before it, a positive one after it, up to two months either way.'=>'0 envia na própria data; um número negativo envia essa quantidade de dias antes dela, e um positivo, depois, até dois meses em qualquer direção.','Subject and message'=>'Assunto e mensagem','The e-mail body only; the header and footer come from the Email Model. A new rule starts from the "Birthday message" default in Settings → Email texts, and "Restore default text" brings it back.'=>'Apenas o corpo do e-mail; o cabeçalho e o rodapé vêm do Modelo de e-mail. Uma nova regra começa com o padrão "Mensagem de aniversário" de Configurações → Textos dos e-mails, e "Restaurar texto padrão" o traz de volta.','"E-mail each person on their date" and "Active (the daily run sends it)". A rule can stay active with personal e-mails off and send only the manager summary.'=>'"Enviar e-mail a cada pessoa na sua data" e "Ativa (o envio diário a envia)". Uma regra pode ficar ativa com os e-mails pessoais desligados e enviar apenas o resumo para gestores.','Optionally e-mails chosen managers a summary 24 hours after each run, with counts only or counts and the names of who received it. See below.'=>'Opcionalmente, envia a gestores escolhidos um resumo 24 horas após cada execução, apenas com os totais ou com os totais e os nomes de quem recebeu. Veja abaixo.','Rules can be edited, duplicated, activated or deactivated and deleted from the Rules tab. Deleting a rule keeps what it already sent in the history.'=>'As regras podem ser editadas, duplicadas, ativadas ou desativadas e excluídas na aba Regras. Excluir uma regra mantém no histórico o que ela já enviou.','Who receives a message'=>'Quem recebe uma mensagem','For each person whose date falls on the day, the first matching decision wins: outside the audience, opted out, no valid e-mail, already sent, otherwise will receive. Each person gets a rule\'s message once per occurrence of their date, however often the run repeats. People born on 29 February are reached on 28 February in a common year. The year of birth is never shown; {{age}} is computed from it.'=>'Para cada pessoa cuja data cai no dia, vale a primeira decisão aplicável: fora do público-alvo, cancelou o recebimento, sem e-mail válido, já enviado; caso contrário, receberá. Cada pessoa recebe a mensagem de uma regra uma vez por ocorrência da sua data, por mais que a execução se repita. Quem nasceu em 29 de fevereiro é contemplado em 28 de fevereiro nos anos não bissextos. O ano de nascimento nunca é exibido; {{age}} é calculado a partir dele.','Preview recipients and test send'=>'Prévia dos destinatários e envio de teste','Sends one rule to everyone whose date falls in a chosen range of up to 31 days, in batches handed to wp_mail(). People already sent that rule for that date are skipped, so running the same range twice sends nothing new. With no mail-queue plugin active, a large range is sent as fast as PHP runs.'=>'Envia uma regra a todos cuja data cai em um intervalo escolhido de até 31 dias, em lotes entregues ao wp_mail(). Quem já recebeu essa regra para aquela data é ignorado, então executar o mesmo intervalo duas vezes não envia nada novo. Sem um plugin de fila de e-mails ativo, um intervalo grande é enviado tão rápido quanto o PHP executa.','When enabled on a rule, the chosen managers receive a summary 24 hours after each run starts. Names go only to recipients allowed to see who receives date messages (ffc_view_date_messages_pii, or administrators); everyone else gets the counts. A run that reached nobody sends no summary. Only administrators and accounts holding a date-messages capability can be chosen.'=>'Quando ativado em uma regra, os gestores escolhidos recebem um resumo 24 horas após o início de cada execução. Os nomes vão apenas para os destinatários autorizados a ver quem recebe mensagens por data (ffc_view_date_messages_pii, ou administradores); os demais recebem os totais. Uma execução que não alcançou ninguém não envia resumo. Só podem ser escolhidos administradores e contas que possuam uma permissão de mensagens por data.','Daily schedule'=>'Agendamento diário','Opting out'=>'Cancelar o recebimento','On their dashboard, under Notification Preferences, a person can turn off "Date messages (such as birthday greetings)".'=>'No seu painel, em Preferências de Notificação, a pessoa pode desligar "Mensagens por data (como felicitações de aniversário)".','Every message carries a one-click unsubscribe link; a body that does not place {{unsubscribe_url}} gets an unsubscribe line appended. The link is a signed token that stores nothing; opening it shows a confirmation page, and only confirming turns date messages off, so mail scanners that follow links change nothing.'=>'Toda mensagem traz um link de cancelamento de inscrição com um clique; um corpo que não inclui {{unsubscribe_url}} recebe uma linha de cancelamento ao final. O link é um token assinado que não armazena nada; abri-lo mostra uma página de confirmação, e só a confirmação desliga as mensagens por data, de modo que os verificadores de e-mail que seguem links não alteram nada.','E-mail tokens'=>'Tokens de e-mail','The person\'s e-mail address'=>'O endereço de e-mail da pessoa','The date of this occurrence and the age reached on it'=>'A data desta ocorrência e a idade completada nela','Days between the send and the date'=>'Dias entre o envio e a data','Site name and the link to the user dashboard'=>'Nome do site e o link para o painel do usuário','The one-click unsubscribe link'=>'O link de cancelamento de inscrição com um clique','Messages go through the shared e-mail pipeline and Email Model chrome, and respect the global "Disable all emails" switch.'=>'As mensagens passam pelo fluxo de e-mail compartilhado e pelo layout do Modelo de e-mail, e respeitam a chave global "Desativar todos os e-mails".','read-only access to the rules, their send history and recipient totals.'=>'acesso somente leitura às regras, ao histórico de envios e aos totais de destinatários.','see people by name with their birthday (day and month) in the recipient preview, the upcoming dates and the manager summary.'=>'ver as pessoas pelo nome, com o aniversário (dia e mês), na prévia dos destinatários, nas próximas datas e no resumo para gestores.','Unique authentication code for validation, printed with the certificate prefix "C-"'=>'Código de autenticação único para validação, impresso com o prefixo de certificado "C-"','QR Code image.'=>'Imagem do QR Code.','See QR Code Options & Attributes.'=>'Veja Opções e Atributos do QR Code.','The single-use ticket code the participant entered (forms with the Ticket restriction only).'=>'O código de bilhete de uso único informado pelo participante (apenas em formulários com a restrição Ingresso).','Quiz forms:'=>'Formulários de questionário:','See Quiz / Evaluation.'=>'Veja Questionário / Avaliação.','{{name}} is filled from a form field whose key is "name"; first_name, last_name and full_name are not certificate tokens (they belong to the date-message emails).'=>'{{name}} é preenchido a partir de um campo do formulário cuja chave é "name"; first_name, last_name e full_name não são tokens de certificado (pertencem aos e-mails de mensagens de datas).','Set "notice" to the notice code. The list shows only the columns marked public in the notice editor. Draft notices show a "being prepared" message instead of data; preliminary, definitive and closed notices show the list (a closed notice with a "Notice closed" banner).'=>'Defina "notice" com o código do edital. A lista mostra apenas as colunas marcadas como públicas no editor do edital. Editais em rascunho exibem uma mensagem de "em preparação" no lugar dos dados; editais preliminares, definitivos e encerrados exibem a lista (um edital encerrado com o aviso "Edital encerrado").','Each submitter must present a single-use code from a generated pool. The code is claimed atomically (one use only) and removed from the pool as soon as the restriction check passes, before the submission is saved.'=>'Cada participante deve apresentar um código de uso único de um conjunto gerado. O código é resgatado de forma atômica (apenas uma utilização) e removido do conjunto assim que a verificação de restrições é aprovada, antes de o envio ser salvo.','E-mail, CPF, RF, the client IP and the submission\'s extra form data are stored encrypted with AES-256-CBC using encrypt-then-HMAC; a salted hash backs lookups. Display is masked unless the viewer holds a PII capability.'=>'E-mail, CPF, RF, o IP do cliente e os dados extras do formulário do envio são armazenados criptografados com AES-256-CBC usando encrypt-then-HMAC; um hash com salt sustenta as buscas. A exibição é mascarada, a menos que o usuário tenha uma capacidade de dados pessoais (PII).','Sensitive identifiers — e-mail, CPF and RF — are encrypted (AES-256-CBC with a per-record random IV and an encrypt-then-HMAC integrity check), never stored in the clear. Certificate submissions also encrypt the client IP and the extra form data.'=>'Identificadores sensíveis — e-mail, CPF e RF — são criptografados (AES-256-CBC com um IV aleatório por registro e uma verificação de integridade encrypt-then-HMAC), nunca armazenados em texto puro. Os envios de certificado também criptografam o IP do cliente e os dados extras do formulário.','On screen, CPF/RF and e-mail are masked unless the operator holds the matching PII capability. Revealing recruitment PII writes an activity-log entry (repeat reveals of the same field within a minute are not logged again, and a recruitment setting can switch this audit off).'=>'Na tela, CPF/RF e e-mail são mascarados, a menos que o operador tenha a capacidade de dados pessoais correspondente. Revelar dados pessoais do recrutamento grava uma entrada no registro de atividades (revelações repetidas do mesmo campo dentro de um minuto não são registradas de novo, e uma configuração do recrutamento pode desativar essa auditoria).','A logo from the Media Library can be drawn in the centre (error correction is raised to H automatically), and a frame (banner, badge, bubble, pill, speech, circle, brackets or double) can carry a short caption such as "Scan to verify", optionally with an icon. A frame makes the image taller than wide; certificates keep the width the placeholder asks for and grow in height.'=>'Um logotipo da Biblioteca de Mídia pode ser desenhado no centro (a correção de erros é elevada para H automaticamente), e uma moldura (banner, badge, bubble, pill, speech, circle, brackets ou double) pode trazer uma legenda curta como "Escaneie para verificar", opcionalmente com um ícone. Uma moldura deixa a imagem mais alta do que larga; os certificados mantêm a largura pedida pelo placeholder e crescem em altura.','With the design applied to certificates, the {{qr_code}} placeholder is drawn as an SVG and is not cached; without it, a PNG is generated and may be served from the QR Code cache.'=>'Com o design aplicado aos certificados, o placeholder {{qr_code}} é desenhado como SVG e não é armazenado em cache; sem ele, é gerado um PNG que pode ser servido pelo cache de QR Code.','When the submission has no magic token, "m" falls back to the /valid page. The generated link carries the class ffc-validation-link.'=>'Quando o envio não tem token mágico, "m" volta para a página /valid. O link gerado recebe a classe ffc-validation-link.','Inline styling, a horizontal rule, and legacy font color/size/face'=>'Estilo em linha, uma linha horizontal e cor/tamanho/fonte legados de font','The template is filtered on save.'=>'O modelo é filtrado ao salvar.','Image scaled to exactly these dimensions (it is stretched, not cropped, when the proportions differ)'=>'Imagem redimensionada exatamente para essas dimensões (é esticada, não recortada, quando as proporções diferem)','Helper classes:'=>'Classes auxiliares:','The PDF stylesheet ships alignment helpers for the certificate body:'=>'A folha de estilos do PDF inclui auxiliares de alinhamento para o corpo do certificado:','Use them on a paragraph, div, span, heading, list or table.'=>'Use-as em um parágrafo, div, span, título, lista ou tabela.','Whether validate_rf() also requires the RF check digit, rejecting a mistyped number at the form instead of storing it. Off by default; normally set from Settings → General, and the filter overrides that setting — args ( enforce ).'=>'Define se validate_rf() também exige o dígito verificador do RF, recusando no formulário um número digitado errado em vez de armazená-lo. Desativado por padrão; normalmente definido em Configurações → Geral, e o filtro sobrepõe essa configuração — argumentos ( enforce ).','The token map used to build the certificate HTML — args ( data, submission_id, submission_row ).'=>'O mapa de tokens usado para montar o HTML do certificado — argumentos ( data, submission_id, submission_row ).','The certificate PDF filename — args ( filename, form_title, auth_code, submission_id ).'=>'O nome do arquivo PDF do certificado — argumentos ( filename, form_title, auth_code, submission_id ).','Every plugin PDF filename, before the per-type filters — args ( filename, type, entity_id, auth_code ).'=>'Todo nome de arquivo PDF do plugin, antes dos filtros por tipo — argumentos ( filename, type, entity_id, auth_code ).','The img tag that replaces a certificate {{qr_code}} placeholder — args ( img_html, url, submission_id ).'=>'A tag img que substitui um placeholder {{qr_code}} do certificado — argumentos ( img_html, url, submission_id ).','The appointment receipt template: return HTML to replace it — args ( html, schedule_type ) — or point to another file inside the plugin or theme — args ( file ).'=>'O modelo do comprovante de agendamento: retorne HTML para substituí-lo — argumentos ( html, schedule_type ) — ou aponte para outro arquivo dentro do plugin ou do tema — argumentos ( file ).','The receipt PDF filename — args ( filename, calendar_id, validation_code, appointment ) — and its background image URL — args ( url, appointment, calendar ).'=>'O nome do arquivo PDF do comprovante — argumentos ( filename, calendar_id, validation_code, appointment ) — e a URL da imagem de fundo — argumentos ( url, appointment, calendar ).','When a calendar is deleted: whether its appointments are cancelled — args ( true, calendar_id, post_id ) — and whether each person is notified — args ( true, appointment ).'=>'Quando um calendário é excluído: se seus agendamentos são cancelados — argumentos ( true, calendar_id, post_id ) — e se cada pessoa é notificada — argumentos ( true, appointment ).','The certificate confirmation email — args ( subject, form_title, form_config ), ( to, form_title, submission_data ) and ( body, to, form_title, submission_data ).'=>'O e-mail de confirmação do certificado — argumentos ( subject, form_title, form_config ), ( to, form_title, submission_data ) e ( body, to, form_title, submission_data ).','Who receives the new-submission admin notification — args ( recipients, form_title, data ).'=>'Quem recebe a notificação de novo envio para o administrador — argumentos ( recipients, form_title, data ).','Whether to stamp the mail-queue source headers on an email — args ( emit, source_key ).'=>'Define se os cabeçalhos de origem da fila de e-mails são adicionados a um e-mail — argumentos ( emit, source_key ).','Submissions CSV exports (admin and public): the header row — args ( headers, include_edit_columns, form_ids ) — the filename — args ( filename, form_ids, status ) — and each batch of rows — args ( rows, form_ids, status ).'=>'Exportações CSV de envios (administrativa e pública): a linha de cabeçalho — argumentos ( headers, include_edit_columns, form_ids ) — o nome do arquivo — argumentos ( filename, form_ids, status ) — e cada lote de linhas — argumentos ( rows, form_ids, status ).','The sanitized ffc_settings array before it is written — args ( clean, current ).'=>'O array ffc_settings sanitizado antes de ser gravado — argumentos ( clean, current ).','The capabilities that let a user open the Settings page — args ( caps ).'=>'As capacidades que permitem a um usuário abrir a página de Configurações — argumentos ( caps ).','Add a tab to the Scheduling settings screen — args ( tabs ).'=>'Adiciona uma aba à tela de configurações de Agendamento — argumentos ( tabs ).','The page URL used for a form\'s schedule-exception link — args ( url, form_id ).'=>'A URL da página usada no link de exceção de horário de um formulário — argumentos ( url, form_id ).','Call the IP geolocation API over HTTPS instead of HTTP — args ( false ).'=>'Chama a API de geolocalização por IP via HTTPS em vez de HTTP — argumentos ( false ).','Turn off the GitHub update check — args ( true ) — or point it at another repository — args ( repo ).'=>'Desativa a verificação de atualizações no GitHub — argumentos ( true ) — ou aponta para outro repositório — argumentos ( repo ).','After a submission is edited — args ( submission_id, update_data ) — or deleted — args ( submission_id ).'=>'Depois que um envio é editado — argumentos ( submission_id, update_data ) — ou excluído — argumentos ( submission_id ).','Audience booking lifecycle — args ( booking_id ) on create, ( booking_id, reason ) on cancel.'=>'Ciclo de vida da reserva de público-alvo — argumentos ( booking_id ) na criação, ( booking_id, reason ) no cancelamento.','Before a short-URL redirect is sent — args ( record, target_url, redirect_type ).'=>'Antes de o redirecionamento de uma URL curta ser enviado — argumentos ( record, target_url, redirect_type ).','After a submissions CSV export finishes (admin or public) — args ( job_id, file, rows, job ). The other exports do not fire it. Renamed from ffcertificate_csv_export_completed in 6.17.0.'=>'Depois que uma exportação CSV de envios termina (administrativa ou pública) — argumentos ( job_id, file, rows, job ). As demais exportações não o disparam. Renomeado de ffcertificate_csv_export_completed na versão 6.17.0.','Before a public submission is stored — args ( form_id, submission_data, user_email, form_config ).'=>'Antes de um envio público ser armazenado — argumentos ( form_id, submission_data, user_email, form_config ).','Before a submission is edited — args ( submission_id, email, data ) — or permanently deleted — args ( submission_id ).'=>'Antes de um envio ser editado — argumentos ( submission_id, email, data ) — ou excluído definitivamente — argumentos ( submission_id ).','A submission moved to or restored from the trash — args ( submission_id ).'=>'Um envio movido para a lixeira ou restaurado dela — argumentos ( submission_id ).','After a certificate\'s PDF payload is built — args ( pdf_data, submission_id ).'=>'Depois que os dados do PDF de um certificado são montados — argumentos ( pdf_data, submission_id ).','Before the certificate confirmation email is composed — args ( submission_id, user_email, form_id, form_config ).'=>'Antes de o e-mail de confirmação do certificado ser composto — argumentos ( submission_id, user_email, form_id, form_config ).','Before an audience booking is stored — args ( booking_data ).'=>'Antes de uma reserva de público-alvo ser armazenada — argumentos ( booking_data ).','After an audience (group) is created — args ( audience_id, data ).'=>'Depois que um público-alvo (grupo) é criado — argumentos ( audience_id, data ).','While the Audience module registers its capabilities — no args.'=>'Enquanto o módulo de Público-alvo registra suas capacidades — sem argumentos.','After a form\'s cached data is purged — args ( form_id, reason ).'=>'Depois que os dados em cache de um formulário são limpos — argumentos ( form_id, reason ).','After the ffc_settings option is saved — args ( clean ).'=>'Depois que a opção ffc_settings é salva — argumentos ( clean ).','Before a Danger Zone data deletion runs — args ( target, reset_counter ).'=>'Antes de uma exclusão de dados da Zona de Perigo ser executada — argumentos ( target, reset_counter ).','fires when a submissions export finishes; the other exports do not fire it.'=>'é disparada quando uma exportação de envios termina; as demais exportações não a disparam.','Public — books an appointment.'=>'Público — cria um agendamento.','Read or cancel one appointment — requires access to that appointment.'=>'Lê ou cancela um agendamento — exige acesso a esse agendamento.','Logged-in (acts on the current user).'=>'Conectado (atua sobre o usuário atual).','Public — anonymous callers get bookings of the schedules they may read, without personal details.'=>'Público — chamadas anônimas recebem as reservas das agendas que podem ler, sem dados pessoais.','Logged-in — creating needs ffc_view_own_audience_bookings (or the scheduling bypass); cancelling needs ownership of the booking or the bypass.'=>'Conectado — criar exige ffc_view_own_audience_bookings (ou a permissão de ignorar restrições de agendamento); cancelar exige ser dono da reserva ou essa permissão.','ffc_view_certificates (personal data stays masked without the PII capability).'=>'ffc_view_certificates (os dados pessoais permanecem mascarados sem a capacidade de dados pessoais).','Logged-in — the current candidate\'s own recruitment data.'=>'Conectado — os dados de recrutamento do próprio candidato atual.','The plugin\'s only authenticated write API: a field-operator app issues certificates over WordPress Application Passwords (HTTP Basic auth, so capability checks work with no nonce). Added in 6.18.0.'=>'A única API de escrita autenticada do plugin: um aplicativo de operador de campo emite certificados utilizando Senhas de Aplicativo do WordPress (autenticação HTTP Basic, permitindo que as verificações de capacidade funcionem sem *nonce*). Adicionada na versão 6.18.0.','Activity Log: Encrypt Client IPs'=>'Registro de atividades: Criptografar IPs dos clientes','Encrypt the client IP address of activity log rows written before addresses were stored encrypted, and clear the plaintext copy. An address that cannot be encrypted is cleared all the same.'=>'Criptografa o endereço IP do cliente nas linhas do registro de atividades gravadas antes de os endereços serem armazenados criptografados, e apaga a cópia em texto puro. Um endereço que não puder ser criptografado é apagado do mesmo jeito.','Encrypted the client IP of %d activity log rows.'=>'IP do cliente criptografado em %d linhas do registro de atividades.','Encryption keys are not configured, so the addresses cannot be encrypted.'=>'As chaves de criptografia não estão configuradas, então os endereços não podem ser criptografados.','Activity-log entries store the client IP address encrypted, and an entry whose details carry a sensitive field (such as CPF or an IP address) has those details encrypted too; the log is still personal data. Entries written before 6.34.0 kept the address in clear until the "Activity Log: Encrypt Client IPs" migration runs. The debug logs hash IP addresses instead.'=>'As entradas do registro de atividades armazenam o endereço IP do cliente criptografado, e uma entrada cujos detalhes trazem um campo sensível (como CPF ou um endereço IP) também tem esses detalhes criptografados; o registro continua sendo dado pessoal. Entradas gravadas antes da 6.34.0 mantêm o endereço em texto puro até a migração "Registro de atividades: Criptografar IPs dos clientes" ser executada. Os logs de depuração guardam um hash dos endereços IP.','the Encryption Key Rotation re-encrypts stored personal data under FFC_ENCRYPTION_KEY from wp-config.php, with a second card for the remaining areas (recruitment candidates and reregistration bodies); two more cards clear plaintext left on activity log rows that are already encrypted and encrypt the client IP addresses older activity log rows still hold in clear.'=>'a Rotação de Chaves de Criptografia recriptografa os dados pessoais armazenados com a FFC_ENCRYPTION_KEY do wp-config.php, com um segundo cartão para as áreas restantes (candidatos do recrutamento e conteúdo dos recadastramentos); outros dois cartões apagam o texto puro deixado em linhas do registro de atividades que já estão criptografadas e criptografam os endereços IP de clientes que linhas antigas do registro ainda guardam em texto puro.','%1$s — %2$s (%3$s, score %4$s)'=>'%1$s — %2$s (%3$s, pontuação %4$s)','Classification'=>'Classificação','FFC Recruitment'=>'Recrutamento FFC','FFC Reregistration'=>'Recadastramento FFC','What the eraser keeps.'=>'O que o apagador mantém.','%d recruitment candidacies retained: classification lists of a public tender are kept by legal obligation. Remove the candidate in Recruitment if the obligation no longer applies.'=>'%d candidaturas de recrutamento mantidas: as listas de classificação de um concurso público são guardadas por obrigação legal. Remova o candidato em Recrutamento se a obrigação não se aplicar mais.','%d reregistration submissions retained: they are institutional records kept by legal obligation. Remove them from the campaign if the obligation no longer applies.'=>'%d envios de recadastramento mantidos: são registros institucionais guardados por obrigação legal. Remova-os da campanha se a obrigação não se aplicar mais.','Reregistration submissions and recruitment candidacies are exported but not erased: they are institutional records an organisation is usually required to keep, so the eraser reports them as retained, with a message, and changes nothing. Remove them from the campaign or from Recruitment when the obligation no longer applies. A record linked to a different account is that account\'s, even when it carries the same e-mail address.'=>'Envios de recadastramento e candidaturas de recrutamento são exportados, mas não apagados: são registros institucionais que uma organização normalmente é obrigada a guardar, então o apagador os informa como mantidos, com uma mensagem, e não altera nada. Remova-os da campanha ou do Recrutamento quando a obrigação não se aplicar mais. Um registro vinculado a outra conta pertence a essa conta, mesmo que tenha o mesmo endereço de e-mail.','Under Tools → Export Personal Data and Tools → Erase Personal Data, the plugin registers its own handlers. Each one works on the records linked to the WordPress account that has the requested e-mail address and, for records linked to no account, on those whose stored e-mail matches it — so a certificate or appointment made without logging in is found too:'=>'Em Ferramentas → Exportar Dados Pessoais e Ferramentas → Apagar Dados Pessoais, o plugin registra seus próprios manipuladores. Cada um atua sobre os registros vinculados à conta do WordPress que tem o e-mail solicitado e, nos registros sem conta vinculada, sobre aqueles cujo e-mail armazenado corresponde a ele — assim, um certificado ou agendamento feito sem login também é encontrado:','an eraser clears the encrypted personal data (e-mail and its lookup hash, CPF/RF, the client IP, …) from the certificates and appointments and unlinks them from the account, deletes the person\'s audience memberships, booking links, schedule permissions, stored profile and FFC user settings, and unlinks their activity-log entries. Authentication codes and verification tokens may be kept in anonymised form so certificates already issued remain verifiable after the person\'s data is erased.'=>'um apagador remove os dados pessoais criptografados (e-mail e seu hash de busca, CPF/RF, o IP do cliente, …) dos certificados e agendamentos e os desvincula da conta, exclui as participações da pessoa em públicos-alvo, vínculos de reservas, permissões de agenda, perfil armazenado e configurações de usuário FFC, e desvincula suas entradas do registro de atividades. Códigos de autenticação e tokens de verificação podem ser mantidos de forma anonimizada para que certificados já emitidos continuem verificáveis depois que os dados da pessoa forem apagados.','exporters gather the person\'s FFC data: profile, certificates, appointments, audience groups, audience bookings, reregistration submissions (with their answers decrypted), recruitment candidacies and their classifications, and FFC user settings.'=>'exportadores reúnem os dados FFC da pessoa: perfil, certificados, agendamentos, grupos de público-alvo, reservas de público-alvo, envios de recadastramento (com as respostas descriptografadas), candidaturas de recrutamento e suas classificações, e configurações de usuário FFC.','A form with no end date never releases the CSV. Downloads are also capped by a per-form quota (blank inherits the global Default Download Limit under Settings → Advanced). When the CPF gate below is set to anything other than none — or when an operator volunteers a valid CPF — each attempt is written to a per-form audit log of the most recent attempts (timestamp, IP address stored encrypted, mode, result) that admins can export.'=>'Um formulário sem data de término nunca libera o arquivo CSV. Os downloads também estão sujeitos a uma cota por formulário (se o campo estiver em branco, aplica-se o Limite de Download Padrão global, definido em Configurações → Avançado). Quando a exigência de CPF abaixo está em qualquer modo diferente de none — ou quando um operador informa voluntariamente um CPF válido — cada tentativa é registrada em um log de auditoria do formulário com as tentativas mais recentes (data/hora, endereço IP armazenado criptografado, modo e resultado), que os administradores podem exportar.','Value submitted with every entry (the visitor cannot change it):'=>'Valor enviado em todas as respostas (o visitante não pode alterá-lo):','Hidden field — no visible control; every entry submits the fixed value set on the field\'s Value input (the server uses that value, never one sent by the browser).'=>'Campo oculto — sem controle visível; toda resposta envia o valor fixo definido no campo Valor (o servidor usa esse valor, nunca um enviado pelo navegador).','If someone submits again with a CPF/RF that already has a certificate, they are returned their existing certificate instead of generating a new one. This is always on — it is what keeps one person from issuing two certificates. On a form with the Ticket restriction, re-entering a ticket that already issued a certificate returns that certificate the same way; on a quiz form a used ticket is rejected, because there a new submission is a new attempt.'=>'Se alguém enviar novamente com um CPF/RF que já possui certificado, recebe o certificado existente em vez de gerar um novo. Isso está sempre ativo — é o que impede uma pessoa de emitir dois certificados. Em um formulário com a restrição Ingresso, informar de novo um bilhete que já emitiu um certificado devolve esse certificado da mesma forma; em um formulário com quiz, um bilhete já utilizado é recusado, porque ali um novo envio é uma nova tentativa.','(scales a logo down to fit) and'=>'(reduz um logotipo para caber) e','(spans the full width).'=>'(ocupa toda a largura).','Date message (such as a birthday)'=>'Mensagem por data (como aniversário)','Date-message e-mails are listed there too, but each rule\'s subject and body are edited on the rule itself, on the Date Messages screen. The hub\'s "Birthday message (default for new rules)" only sets the text a new rule starts from; existing rules keep their own.'=>'Os e-mails de mensagens por data também aparecem ali, mas o assunto e o corpo de cada regra são editados na própria regra, na tela Mensagens por Data. A "Mensagem de aniversário (padrão para novas regras)" do hub só define o texto com que uma nova regra começa; as regras existentes mantêm o seu.','Images take'=>'Imagens aceitam','Manager digest'=>'Resumo para gestores','Only the tags above survive, each with a fixed set of attributes: style and class work on almost every tag, and style blocks are not allowed — use inline styles. Developers can widen the list with the ffcertificate_allowed_html_tags filter.'=>'Só as tags acima são mantidas, cada uma com um conjunto fixo de atributos: style e class funcionam em quase todas as tags, e blocos style não são permitidos — use estilos inline. Desenvolvedores podem ampliar a lista com o filtro ffcertificate_allowed_html_tags.','Sent to each person on a date in their profile — each rule carries its own subject and body; the hub above holds the text a new rule starts from.'=>'Enviado a cada pessoa em uma data do seu perfil — cada regra tem o próprio assunto e corpo; o hub acima guarda o texto com que uma nova regra começa.','Summary of a run sent to the managers a rule names, 24 hours after it starts; fixed body.'=>'Resumo de uma execução enviado aos gestores indicados na regra, 24 horas depois do início; corpo fixo.','Schedule'=>'Agendamento','WPA2 / WPA3 Enterprise (user name and password)'=>'WPA2 / WPA3 Enterprise (usuário e senha)','EAP method'=>'Método EAP','Phase 2 authentication'=>'Autenticação da fase 2','Anonymous identity'=>'Identidade anônima','Optional. Leave blank unless the network administrator gave you one.'=>'Opcional. Deixe em branco, a menos que o administrador da rede tenha informado uma.','Enter the user name for the Enterprise network.'=>'Informe o usuário da rede Enterprise.','Android saves the network from the code but leaves the CA certificate unset, so it will not connect yet: open the saved network, set CA certificate to "Trust on first use" (or "Do not validate"), then connect. The iPhone camera does not read Enterprise codes; iPhone users type the details in.'=>'O Android salva a rede pelo código, mas deixa o certificado de CA sem seleção, então ela ainda não conecta: abra a rede salva, em Certificado de CA escolha "Confiar no primeiro uso" (ou "Não validar") e conecte. A câmera do iPhone não lê códigos de rede Enterprise; no iPhone os dados são digitados.','%1$d%% full: about %2$d more characters fit at error correction %3$s (an accented letter counts as two).'=>'%1$d%% ocupado: cabem cerca de %2$d caracteres a mais na correção de erros %3$s (uma letra acentuada conta como duas).','%1$d%% full: about %2$d more characters fit at error correction H, which the logo requires (an accented letter counts as two).'=>'%1$d%% ocupado: cabem cerca de %2$d caracteres a mais na correção de erros H, exigida pelo logotipo (uma letra acentuada conta como duas).','This content is about %d characters too long. The logo requires error correction H, which holds the least; remove the logo or shorten the content.'=>'Este conteúdo tem cerca de %d caracteres a mais. O logotipo exige a correção de erros H, a que comporta menos; remova o logotipo ou encurte o conteúdo.','This content is about %1$d characters too long for error correction %2$s. Shorten it, or lower the level.'=>'Este conteúdo tem cerca de %1$d caracteres a mais para a correção de erros %2$s. Encurte-o ou reduza o nível.','(no title)'=>'(sem título)','A short URL already sends to this address. Use it, or confirm that you want another one.'=>'Já existe uma URL curta que leva a este endereço. Use-a ou confirme que deseja criar outra.','A short URL already sends to this address: click "Use this", or tick the box to create another one.'=>'Já existe uma URL curta que leva a este endereço: clique em "Usar esta" ou marque a caixa para criar outra.','Already shortened'=>'Já encurtado','Copied.'=>'Copiado.','Could not copy; select the address and copy it by hand.'=>'Não foi possível copiar; selecione o endereço e copie manualmente.','Create a QR code for any content and download it. The design starts from Settings → QR Code and changes here apply to this code only. Nothing about the content is stored, except a short URL for a website or a social profile when "Create a short URL" is on — it is saved on download or print and listed with the others.'=>'Crie um QR Code para qualquer conteúdo e baixe-o. O design parte de Configurações → QR Code e as alterações feitas aqui valem só para este código. Nada sobre o conteúdo é armazenado, exceto uma URL curta para um site ou perfil de rede social quando "Criar URL curta" está ligado — ela é gravada ao baixar ou imprimir e aparece na lista com as demais.','Create a short URL'=>'Criar URL curta','Enter a title for the short URL before downloading or printing.'=>'Informe um título para a URL curta antes de baixar ou imprimir.','Enter a title for the short URL.'=>'Informe um título para a URL curta.','I know, and I want to create another short URL for this address.'=>'Estou ciente e quero criar outra URL curta para este endereço.','New short URL'=>'Nova URL curta','On: the code carries a short URL that counts the scans and whose destination can be changed later, even after printing. It is saved on download or print. Off: the code carries the address itself, nothing is stored in the database, and it keeps working even if this site goes down.'=>'Ligado: o código leva uma URL curta que conta as leituras e cujo destino pode ser trocado depois, mesmo após a impressão. Ela é gravada ao baixar ou imprimir. Desligado: o código leva o próprio endereço, nada é gravado no banco de dados e ele continua funcionando mesmo se este site sair do ar.','Required: it names the short URL in the list.'=>'Obrigatório: é o nome da URL curta na lista.','Short URL in the code'=>'URL curta no código','This address is already a short URL of this site, so it is used as is: shortening it again would only chain two redirects.'=>'Este endereço já é uma URL curta deste site, então é usado como está: encurtá-lo de novo só encadearia dois redirecionamentos.','This address is already a short URL of this site; it cannot be shortened again.'=>'Este endereço já é uma URL curta deste site; não pode ser encurtado de novo.','This content type cannot have a short URL.'=>'Este tipo de conteúdo não pode ter URL curta.','Use this'=>'Usar esta','created %1$s, %2$d clicks'=>'criada em %1$s, %2$d cliques','in Short URLs → QR Code Generator (the "New short URL" button on the list opens it), on the Website or Social profile type with "Create a short URL" on: enter the destination and a title, and the short URL is created when the code is downloaded or printed. The short code is generated automatically (there is no custom-slug field).'=>'no Gerador de QR Code (URLs curtas → Gerador de QR Code; o botão "Nova URL curta" da lista abre essa tela), nos tipos Site ou Perfil em rede social com "Criar URL curta" ligado: informe o destino e um título, e a URL curta é criada quando o código é baixado ou impresso. O código curto é gerado automaticamente (não há campo de slug personalizado).','Short URLs → QR Code Generator makes a QR code for a website, plain text, a Wi-Fi network (Enterprise networks that sign in with a user name included), an e-mail, a phone call, an SMS, a WhatsApp chat, a contact card (vCard), a social profile or an event, styled from the global design and downloaded as PNG or SVG. For a website or a social profile, "Create a short URL" (on by default) puts a short URL in the code instead of the address: the preview shows an example, and the real one is created on the first download or print, then reused until the destination or the title changes. The title is then required; an address that already has a short URL is flagged, with "Use this" to reuse it, and creating another needs an explicit confirmation; an address that is already a short URL of this site is never shortened again. With the switch off nothing is stored. It needs ffc_manage_url_shortener.'=>'URLs curtas → Gerador de QR Code cria um QR Code para um site, texto simples, uma rede Wi-Fi (inclusive redes Enterprise, que pedem usuário), um e-mail, uma ligação, um SMS, uma conversa no WhatsApp, um cartão de contato (vCard), um perfil em rede social ou um evento, estilizado a partir do design global e baixado em PNG ou SVG. Para um site ou um perfil em rede social, "Criar URL curta" (ligado por padrão) coloca no código uma URL curta em vez do endereço: a prévia mostra um exemplo, e a URL real é criada no primeiro download ou impressão e reaproveitada até que o destino ou o título mude. O título passa a ser obrigatório; um endereço que já tem URL curta é sinalizado, com "Usar esta" para reaproveitá-la, e criar outra exige confirmação explícita; um endereço que já é uma URL curta deste site nunca é encurtado de novo. Com o switch desligado, nada é gravado. Requer ffc_manage_url_shortener.','Open the Short URLs list'=>'Abrir a lista de URLs curtas','"%s" is stored and now counts the scans. Copy the link to share it.'=>'"%s" foi salva e já conta as leituras. Copie o link para compartilhá-lo.','Short URL saved'=>'URL curta salva','Enter a valid address. Without a scheme, https:// is used; http, ftp, ftps, sftp and ssh must be typed in full.'=>'Informe um endereço válido. Sem esquema, usa-se https://; http, ftp, ftps, sftp e ssh devem ser digitados por completo.','Without a scheme, https:// is used (example.com becomes https://example.com). For http, ftp, ftps, sftp or ssh, type the full address.'=>'Sem esquema, usa-se https:// (exemplo.com vira https://exemplo.com). Para http, ftp, ftps, sftp ou ssh, digite o endereço completo.','Only http and https addresses can have a short URL.'=>'Somente endereços http e https podem ter uma URL curta.','A short URL redirects web addresses only (http or https), so this address is used as is.'=>'A URL curta só redireciona endereços web (http ou https), por isso este endereço é usado como está.','This rule is inactive. Activate it before sending, or use "Send test to me" to check it.'=>'Esta regra está inativa. Ative-a antes de enviar, ou use "Enviar teste para mim" para conferi-la.','A form collects the answers a certificate is issued from. Create one, then place its shortcode on a page.'=>'Um formulário coleta as respostas a partir das quais o certificado é emitido. Crie um e depois coloque o shortcode dele em uma página.','Forms moved to the trash appear here until they are restored or deleted permanently.'=>'Os formulários movidos para a lixeira aparecem aqui até serem restaurados ou excluídos permanentemente.','No failed quiz attempts'=>'Nenhuma reprovação no quiz','No form matches the current search or date filter. A number searches by form ID.'=>'Nenhum formulário corresponde à busca ou ao filtro de data atual. Um número busca pelo ID do formulário.','No forms in "%s"'=>'Nenhum formulário em "%s"','No forms match'=>'Nenhum formulário encontrado','No forms yet'=>'Ainda não há formulários','No quiz retries'=>'Nenhuma nova tentativa de quiz','No submissions match'=>'Nenhuma submissão encontrada','No submissions yet'=>'Ainda não há submissões','Nothing in "%s" matches the current search or form filter.'=>'Nada em "%s" corresponde à busca ou ao filtro de formulário atual.','Participants who failed a quiz and may still try again appear here.'=>'Os participantes que foram reprovados no quiz e ainda podem tentar de novo aparecem aqui.','Participants who used every quiz attempt without passing appear here.'=>'Os participantes que usaram todas as tentativas do quiz sem aprovação aparecem aqui.','Submissions appear here once someone fills in one of your forms.'=>'As submissões aparecem aqui assim que alguém preencher um dos seus formulários.','Submissions moved to the trash appear here until they are restored or deleted permanently.'=>'As submissões movidas para a lixeira aparecem aqui até serem restauradas ou excluídas permanentemente.','Trash is empty'=>'A lixeira está vazia','Open Scheduled Tasks'=>'Abrir Tarefas Agendadas','A notice to the site team for every submission.'=>'Um aviso à equipe do site a cada submissão.','Administrator'=>'Administrador','Allowed areas'=>'Áreas permitidas','As last saved. Unsaved changes show on the tab dots.'=>'Conforme o último salvamento. As alterações não salvas aparecem nos pontos das abas.','Date/time window'=>'Janela de data/hora','Download submissions (CSV)'=>'Baixar submissões (CSV)','Email to the participant'=>'E-mail ao participante','Form summary'=>'Resumo do formulário','How a visitor\'s location is checked: GPS in the browser, the IP address, or both.'=>'Como a localização do visitante é verificada: GPS no navegador, endereço IP ou ambos.','Lets an operator change the schedule for one submission.'=>'Permite que um operador altere o horário de uma submissão.','Limit, access link, CPF check and the audit of every attempt.'=>'Limite, link de acesso, verificação de CPF e auditoria de cada tentativa.','No locations are registered yet.'=>'Ainda não há locais cadastrados.','Not set'=>'Não definido','Notify the administrator'=>'Notificar o administrador','On'=>'Ligado','Open to everyone'=>'Aberto a todos','Opening early and closing late'=>'Abertura antecipada e fechamento adiado','Operator access'=>'Acesso do operador','Participant'=>'Participante','Register them in Settings → Geolocation'=>'Cadastre-os em Configurações → Geolocalização','Restrictions'=>'Restrições','The actions the access link exposes.'=>'As ações que o link de acesso oferece.','The message the submitter receives after a successful submission.'=>'A mensagem que quem enviou recebe após uma submissão bem-sucedida.','Ticket'=>'Ticket','Validation methods'=>'Métodos de validação','Visitors outside the area'=>'Visitantes fora da área','What a visitor sees when the location check fails.'=>'O que o visitante vê quando a verificação de localização falha.','When the event takes place, printed as {{schedule}} on the certificate.'=>'Quando o evento acontece, impresso como {{schedule}} no certificado.','When the form accepts submissions, and what visitors see outside that window.'=>'Quando o formulário aceita submissões e o que os visitantes veem fora dessa janela.','Where submissions are accepted, from registered locations or custom coordinates.'=>'Onde as submissões são aceitas, a partir de locais cadastrados ou coordenadas personalizadas.','Whether the operator can use Start Form Early or Postpone Close right now.'=>'Se o operador pode usar Início Antecipado ou Adiar Fechamento agora.','Anyone with this link can download the certificate.'=>'Qualquer pessoa com este link pode baixar o certificado.','Form answers'=>'Respostas do formulário','Magic Link'=>'Link Mágico','Open certificate'=>'Abrir certificado','This submission has no form answers.'=>'Esta submissão não tem respostas de formulário.','Forms in the month shown'=>'Formulários no mês exibido','Submissions today'=>'Submissões hoje','Submissions in the last 7 days'=>'Submissões nos últimos 7 dias','GeoFence windows open now'=>'Janelas de GeoFence abertas agora','Add Block'=>'Adicionar bloco','Administrator recipients'=>'Destinatários administradores','Approval and waitlist'=>'Aprovação e lista de espera','Booking Rules & Restrictions'=>'Regras e Restrições de Agendamento','Booking slots'=>'Horários de atendimento','Booking window'=>'Janela de agendamento','Calendar Configuration'=>'Configuração do Calendário','Confirmation message'=>'Mensagem de confirmação','Each message on its own switch, and when the reminder goes out.'=>'Cada mensagem com seu próprio interruptor, e quando o lembrete é enviado.','How far ahead, and how often, a person may book.'=>'Com quanta antecedência, e com que frequência, uma pessoa pode agendar.','Manual review of each booking, and a queue for full slots.'=>'Revisão manual de cada agendamento, e uma fila para horários lotados.','Messages'=>'Mensagens','Occupancy Report'=>'Relatório de ocupação','The subject and text of the email the person receives.'=>'O assunto e o texto do e-mail que a pessoa recebe.','Visibility of the calendar, and the hours it can be seen or booked in.'=>'Visibilidade do calendário, e os horários em que ele pode ser visto ou agendado.','Weekly hours or exact blocks, and how each slot is sized.'=>'Horários semanais ou blocos exatos, e o tamanho de cada horário.','What the calendar is, and whether it takes bookings.'=>'O que é o calendário, e se ele aceita agendamentos.','Whether administrators are held to the rules above.'=>'Se os administradores seguem as regras acima.','Whether people can cancel their own bookings, and until when.'=>'Se as pessoas podem cancelar os próprios agendamentos, e até quando.','Which emails are sent'=>'Quais e-mails são enviados','Who can see and book'=>'Quem pode ver e agendar','Who receives the new-booking notification.'=>'Quem recebe a notificação de novo agendamento.','Working Hours & Availability'=>'Horários de Funcionamento e Disponibilidade','Total'=>'Total','Recipients'=>'Destinatários','Summary'=>'Resumo','0 sends on the date itself; -7 sends seven days before it, 7 seven days after it.'=>'0 envia na própria data; -7 envia sete dias antes dela, 7, sete dias depois.','A birth date given before the profile field existed reaches the profile through a migration card in Settings → Data Migrations; while it has accounts left, the Date Messages screen shows a warning, because those people are not yet in previews, upcoming dates or sends.'=>'Uma data de nascimento informada antes de o campo de perfil existir chega ao perfil por um cartão de migração em Configurações → Migrações de Dados; enquanto restarem contas, a tela Mensagens por Data exibe um aviso, porque essas pessoas ainda não aparecem nas prévias, nas próximas datas nem nos envios.','Access-granted notice, sent when a user gains plugin capabilities — only while "Access Granted Notification" is on in the SMTP tab, which it is not by default'=>'Aviso de acesso concedido, enviado quando um usuário recebe capacidades do plugin — somente enquanto "Notificação de Acesso Concedido" estiver ativada na aba SMTP, o que não é o padrão','Administrators see and edit the same fields on the user-edit screen, in the "FFC Custom Data" section, grouped by the audiences the user belongs to. They behave as on the reregistration form: CPF, RF, RG and phone fields are masked and validated, dependent selects follow their parent, and a field mapped to the profile is saved there, encrypted when it holds personal data, so the profile, the dashboard and the next reregistration read the same value.'=>'Administradores veem e editam os mesmos campos na tela de edição do usuário, na seção "Dados Personalizados FFC", agrupados pelos públicos-alvo a que o usuário pertence. Eles se comportam como no formulário de recadastramento: os campos de CPF, RF, RG e telefone têm máscara e validação, as listas dependentes acompanham a lista-mãe, e um campo mapeado para o perfil é salvo nele, criptografado quando contém dados pessoais, de modo que o perfil, o painel e o próximo recadastramento leem o mesmo valor.','An account that also holds a non-FFC role — an Editor who was given an FFC role, for example — keeps the whole of wp-admin, and administrators (manage_options) are never scoped. This is a convenience, not the security boundary: every FFC screen and action still checks its capability.'=>'Uma conta que também tem uma função que não é do FFC — um Editor que recebeu uma função FFC, por exemplo — mantém o wp-admin inteiro, e administradores (manage_options) nunca são restringidos. Isso é uma conveniência, não a barreira de segurança: toda tela e toda ação do FFC continuam verificando sua capacidade.','Below it, the SMTP tab has one switch per optional email: the welcome email when a WordPress user is created by a form submission or an appointment (on by default), by a CSV import or a migration (off by default, to avoid bulk mail), and the "Access Granted Notification" (off by default).'=>'Abaixo dele, a aba SMTP tem um interruptor para cada e-mail opcional: o e-mail de boas-vindas quando um usuário do WordPress é criado por um envio de formulário ou um agendamento (ativado por padrão), por uma importação de CSV ou uma migração (desativado por padrão, para evitar envios em massa), e a "Notificação de Acesso Concedido" (desativada por padrão).','Controls the dark mode appearance of the plugin\'s admin screens and of its public pages (forms, user dashboard, shortcodes).'=>'Controla o modo escuro das telas de administração do plugin e das suas páginas públicas (formulários, painel do usuário, shortcodes).','Create and edit rules and send manually. The daily send time belongs to Settings → Scheduled Tasks.'=>'Criar e editar regras e enviar manualmente. O horário do envio diário fica em Configurações → Tarefas Agendadas.','Dashboard → Updates shows a short summary of the release on offer, taken from that release\'s own readme, together with the WordPress and PHP versions it requires and the WordPress version it was tested up to, so you can read what changes before applying it.'=>'Painel → Atualizações mostra um breve resumo da versão oferecida, tirado do readme dessa própria versão, junto com as versões de WordPress e PHP que ela exige e a versão de WordPress com que foi testada, para que você leia o que muda antes de aplicá-la.','Every run, daily or manual, is listed with its rule, dates and counters: sent, opted out, no valid e-mail, outside the audience and failed. "Sent" counts messages handed to wp_mail(); with a mail queue active, delivery happens afterwards from the queue. Above the list, the tab shows when the next daily run is due, with a link to Settings → Scheduled Tasks for those who can open it.'=>'Cada execução, diária ou manual, é listada com a sua regra, as datas e os contadores: enviados, cancelaram o recebimento, sem e-mail válido, fora do público-alvo e com falha. "Enviados" conta as mensagens entregues ao wp_mail(); com uma fila de e-mails ativa, a entrega acontece depois, a partir da fila. Acima da lista, a aba mostra quando será a próxima execução diária, com um link para Configurações → Tarefas Agendadas para quem pode abri-la.','Independently of the settings above, an account whose roles are all FFC operator roles (a module viewer, operator or manager, or FFC Read-Only) sees a scoped wp-admin: the core menus it has no use for (Posts, Comments, Tools, Plugins and the like) are hidden, the admin bar is pruned, and opening an admin page outside its module redirects to the module\'s own screen. Its profile, the dashboard home and the AJAX endpoints stay reachable.'=>'Independentemente das configurações acima, uma conta cujas funções são todas funções de operador do FFC (visualizador, operador ou gestor de um módulo, ou FFC Somente Leitura) vê um wp-admin restrito: os menus do núcleo que não usa (Posts, Comentários, Ferramentas, Plugins e afins) ficam ocultos, a barra de administração é reduzida, e abrir uma página de administração fora do seu módulo redireciona para a tela do próprio módulo. O perfil, a página inicial do painel e os endpoints AJAX continuam acessíveis.','Off, On (always dark), or Auto (follow the operating system). Applies to the plugin\'s admin screens and to what it shows visitors: the public forms, the user dashboard and the scheduling, audience and recruitment shortcodes. Certificates and other PDFs are always light.'=>'Desativado, Ativado (sempre escuro) ou Automático (segue o sistema operacional). Vale para as telas de administração do plugin e para o que ele mostra aos visitantes: os formulários públicos, o painel do usuário e os shortcodes de agendamento, público-alvo e convocação. Certificados e outros PDFs são sempre claros.','Operator roles in wp-admin'=>'Funções de operador no wp-admin','Per role:'=>'Por função:','Per user:'=>'Por usuário:','Register a migration card and its strategy on Settings → Data Migrations — args ( migrations ) / ( strategies ).'=>'Registra um cartão de migração e sua estratégia em Configurações → Migrações de Dados — args ( migrations ) / ( strategies ).','Send now is also how a missed day is recovered: the daily run covers only the current day, so a day the scheduler did not run is not caught up the next day. Only an active rule can be sent; deactivating a rule stops a run still in progress at its next batch.'=>'"Enviar agora" também é como se recupera um dia perdido: a execução diária cobre só o dia corrente, então um dia em que o agendador não rodou não é recuperado no dia seguinte. Só uma regra ativa pode ser enviada; desativar uma regra interrompe uma execução ainda em andamento no lote seguinte.','Settings → Modules lets you turn individual feature modules on or off. Every module ships enabled; disabling one hides its admin screens and stops its runtime (its scheduled tasks still fire on schedule but do nothing), but never deletes its data — re-enable it at any time and everything is back. Each switch saves instantly and takes effect on the next page load.'=>'Em Configurações → Módulos, você pode ativar ou desativar módulos de recursos individuais. Todos os módulos vêm ativados por padrão; desativar um módulo oculta suas telas de administração e interrompe sua execução (suas tarefas agendadas continuam disparando no horário, mas não fazem nada), mas nunca exclui seus dados — basta reativá-lo a qualquer momento para que tudo volte ao normal. Cada alteração é salva instantaneamente e entra em vigor no próximo carregamento da página.','Settings → User Access → "FFC Roles & Capabilities" edits which capabilities each FFC role carries.'=>'Configurações → Acesso do Usuário → "Funções e Capacidades do FFC" define quais capacidades cada função FFC tem.','The All Forms list has a Features column with three switches per form — CSV (the public operator download), Quiz and Device limit. Each saves as soon as it is flipped, writes the same setting as the form editor, and is read-only for someone who cannot edit that form.'=>'A lista Todos os Formulários tem uma coluna Recursos com três interruptores por formulário — CSV (o download público do operador), Quiz e Limite do dispositivo. Cada um salva assim que é acionado, grava a mesma configuração que o editor do formulário e fica somente leitura para quem não pode editar aquele formulário.','The daily run sends every active rule once a day, for that day\'s dates only, at 08:00 in the site timezone by default. The Schedule tab shows the current time and the next run; the time itself is changed on Settings → Scheduled Tasks, which needs the settings-management capability (ffc_manage_settings) and also shows the server line that keeps scheduled tasks running on a quiet site.'=>'A execução diária envia todas as regras ativas uma vez por dia, só para as datas daquele dia, por padrão às 08:00 no fuso horário do site. A aba Agendamento mostra o horário atual e a próxima execução; o horário em si é alterado em Configurações → Tarefas Agendadas, que exige a capacidade de gerenciar configurações (ffc_manage_settings) e também mostra a linha do servidor que mantém as tarefas agendadas rodando em um site com pouco tráfego.','The person\'s name as stored; the first and last name from the WordPress profile (when empty, the first word of the name and the rest); and the two joined'=>'O nome da pessoa como armazenado; o nome e o sobrenome do perfil do WordPress (quando vazios, a primeira palavra do nome e o restante); e os dois unidos','The plugin registers one role per module tier — viewer, operator, manager — plus "FFC Administrator", "FFC Read-Only (all modules)" and "FFC End User", which is given automatically to people who submit a form with a CPF or RF. The roles the plugin currently registers:'=>'O plugin registra uma função por nível de cada módulo — visualizador, operador, gestor — além de "FFC Administrador", "FFC Somente Leitura (todos os módulos)" e "FFC Usuário Final", atribuída automaticamente a quem envia um formulário com CPF ou RF. As funções que o plugin registra atualmente:','The plugin ships fine-grained capabilities and its own roles, and manages both itself — no capability-management plugin is needed. WordPress administrators (manage_options) always hold every FFC capability.'=>'O plugin traz capacidades granulares e funções próprias, e gerencia ambas por conta própria — nenhum plugin de gestão de capacidades é necessário. Administradores do WordPress (manage_options) sempre têm todas as capacidades do FFC.','The source repository is public, so updates need no access token, account or licence — the site just needs to reach api.github.com and raw.githubusercontent.com over HTTPS. On a locked-down network that blocks outbound HTTPS, the update check cannot see new releases and you would update the plugin manually instead.'=>'O repositório de origem é público, portanto, as atualizações não exigem token de acesso, conta ou licença — basta que o site consiga acessar api.github.com e raw.githubusercontent.com via HTTPS. Em uma rede restrita que bloqueia conexões HTTPS de saída, a verificação de atualizações não conseguirá detectar novas versões; nesse caso, você deverá atualizar o plugin manualmente.','Tick one or more named locations in the list. Coordinates are resolved at runtime from the registry.'=>'Marque um ou mais locais cadastrados na lista. As coordenadas são obtidas do cadastro em tempo de execução.','Where they are assigned'=>'Onde são atribuídas','create and edit rules and send manually. The daily send time is set on Settings → Scheduled Tasks, under ffc_manage_settings.'=>'criar e editar regras e enviar manualmente. O horário do envio diário é definido em Configurações → Tarefas Agendadas, com ffc_manage_settings.','off by default; when "Pre-load cache daily" is on, a daily task pre-loads every published form into the cache. Its time is set on Settings → Scheduled Tasks.'=>'desativado por padrão; com "Pré-carregar cache diariamente" ativado, uma tarefa diária carrega no cache todos os formulários publicados. O horário dela é definido em Configurações → Tarefas Agendadas.','the "FFC Permissions" section of the user-edit screen adds or removes FFC roles and grants individual capabilities on top of them. Roles are toggled one at a time and kept alongside the user\'s other WordPress roles.'=>'a seção "Permissões FFC" da tela de edição do usuário adiciona ou remove funções FFC e concede capacidades individuais além delas. As funções são alternadas uma de cada vez e mantidas junto com as demais funções do usuário no WordPress.','"Shorten" shows the "Short URL & QR Code" meta box on that post type. "Expose" publishes the page\'s short URL as the site\'s canonical shortlink — the rel="shortlink" tag in the page head and the HTTP Link header (also used by the editor\'s "Get Shortlink" button and REST). Expose depends on Shorten and only takes effect once a short URL exists for the page.'=>'A opção "Shorten" exibe a meta-caixa "URL curta e QR Code" para esse tipo de post. A opção "Expor" publica a URL curta da página como o *shortlink* canônico do site — ou seja, a tag `rel="shortlink"` no cabeçalho da página e o cabeçalho HTTP `Link` (recursos também utilizados pelo botão "Obter Shortlink" do editor e pela API REST). O "Expor" depende do "Shorten" e só entra em vigor quando já existe uma URL curta para a página.','A set of per-area debug switches, grouped Client (frontend, geofence, QR, browser environment), Server/Processing (form processor, PDF, email, encryption, REST, user manager) and Admin/Operational (admin, personal calendars, audience calendars, migrations, activity log). All default off — turn one on only while diagnosing, since it increases logging.'=>'Um conjunto de chaves de depuração organizadas por área: Cliente (frontend, geofencing, QR, ambiente do navegador), Servidor/Processamento (processador de formulários, PDF, e-mail, criptografia, REST, gerenciamento de usuários) e Admin/Operacional (administração, calendários pessoais, calendários de público-alvo, migrações, registro de atividades). Todas vêm desativadas por padrão — ative-as apenas durante diagnósticos, pois aumentam o volume de logs.','An RF carries a check digit, and the form has never verified it — which is why a mistyped RF reaches storage where a mistyped CPF does not. Off by default, because the rule was derived from the identifiers this install already holds rather than read from an official specification: turning it on could refuse a number that is genuinely unusual, and a person blocked from registering costs more than a typo the audit finds later. Before turning it on, run the identity audit (Settings → Data Migrations) and read how many stored RFs it reports as failing — that count is what enforcement would have rejected.'=>'O RF tem um dígito verificador, e o formulário nunca o conferiu — por isso um RF digitado errado chega ao banco enquanto um CPF errado não chega. Desligado por padrão, porque a regra foi derivada dos identificadores que esta instalação já possui e não lida de uma especificação oficial: ligá-la pode recusar um número genuinamente incomum, e uma pessoa impedida de se cadastrar custa mais do que um erro de digitação que a auditoria encontra depois. Antes de ligar, rode a auditoria de identidade (Configurações → Migrações de Dados) e veja quantos RFs armazenados ela reporta como inconsistentes — essa contagem é o que a exigência teria recusado.','Apply these directly only on a NEW install with no encrypted data yet. On a site that already stores data, defining a new FFC_ENCRYPTION_KEY makes existing encrypted records unreadable, and a new FFC_HASH_SALT invalidates the stored search hashes — both are repaired by a planned key rotation (S7b) at Settings → Data Migrations, not a blind edit.'=>'Aplique essas configurações diretamente apenas em uma instalação nova, que ainda não contenha dados criptografados. Em um site que já armazena dados, definir uma nova `FFC_ENCRYPTION_KEY` torna ilegíveis os registros criptografados existentes, e um novo `FFC_HASH_SALT` invalida os hashes de busca armazenados — ambos os problemas são resolvidos por meio de uma rotação de chaves planejada (S7b) em Configurações → Migrações de Dados, e não por uma edição direta sem critérios.','Before a personal-calendar appointment is stored — args ( data, calendar ).'=>'Antes de um agendamento de calendário pessoal ser armazenado — argumentos ( data, calendar ).','Configure personal calendars and their booking windows.'=>'Configure calendários pessoais e suas janelas de agendamento.','Create and edit personal calendars — structure, working hours and options. Distinct from managing the bookings made against them (#739).'=>'Crie e edite calendários pessoais — estrutura, horários de funcionamento e opções. Isso é diferente do gerenciamento das reservas feitas com base neles (#739).','Email the user when they are granted access to certificates, appointments or audience groups. Edit the text under Settings → Email texts → Account access.'=>'Envia um e-mail ao usuário quando ele recebe acesso a certificados, agendamentos ou grupos de público-alvo. Edite o texto em Configurações → Textos dos e-mails → Acesso à conta.','Enable debug logging for the Personal Calendars module'=>'Ative o registro de depuração para o módulo Calendários Pessoais','FFCertificate — Audience Calendars'=>'FFCertificate — Calendários de Público-alvo','FFCertificate — Certificates'=>'FFCertificate — Certificados','FFCertificate — Date Messages'=>'FFCertificate — Mensagens por Data','FFCertificate — Personal Calendars'=>'FFCertificate — Calendários Pessoais','FFCertificate — Reregistration'=>'FFCertificate — Recadastramento','Filter the to / subject / body of the audience, reregistration and date-message emails. Personal Calendars appointment emails do not pass through it (use ffcertificate_email).'=>'Filtra os campos para / assunto / corpo dos e-mails de público-alvo, recadastramento e mensagens por data. Os e-mails de agendamento dos Calendários Pessoais não passam por ele (use ffcertificate_email).','General scheduling settings that apply to both Personal Calendars and Audience Calendars.'=>'Configurações gerais de agendamento que se aplicam tanto aos Calendários Pessoais quanto aos Calendários de Público-alvo.','Global holidays and Personal / Audience Calendars visibility.'=>'Feriados globais e visibilidade dos Calendários Pessoais e de Público-alvo.','Manage personal calendars'=>'Gerenciar calendários pessoais','Personal Calendars Settings'=>'Configurações dos Calendários Pessoais','Personal Calendars appointment lifecycle — args ( appointment_id, data, calendar ) on create, ( appointment_id, appointment, reason, cancelled_by ) on cancel.'=>'Ciclo de vida do agendamento dos Calendários Pessoais — argumentos ( appointment_id, data, calendar ) na criação, ( appointment_id, appointment, reason, cancelled_by ) no cancelamento.','Personal Calendars confirmation:'=>'Confirmação dos Calendários Pessoais:','Personal Calendars visibility settings saved.'=>'Configurações de visibilidade dos Calendários Pessoais salvas.','Personal Calendars:'=>'Calendários Pessoais:','Read-only access to personal calendars — structure, working hours and options — without the ability to edit them (#739).'=>'Acesso somente leitura a calendários pessoais — estrutura, horários de trabalho e opções — sem permissão para editá-los (#739).','Run it in Settings → Data Migrations.'=>'Rode-a em Configurações → Migrações de Dados.','Settings → Data Migrations → Rewrite html/ Image References'=>'Configurações → Migrações de Dados → Reescrever HTML/Referências de imagem','Short URLs settings view file not found.'=>'Arquivo de configurações de URLs Curtas não encontrado.','The Personal Calendars appointment receipt. Two defaults ship — Regular and Custom.'=>'O comprovante de agendamento dos Calendários Pessoais. Dois padrões são disponibilizados: Regular e Personalizado.','The bookable slots of a personal calendar\'s day — args ( slots, calendar_id, date, calendar ).'=>'Os horários disponíveis de um dia de um calendário pessoal — argumentos ( slots, calendar_id, date, calendar ).','Their personal-calendar appointments (with receipt / cancel actions where allowed)'=>'Seus agendamentos em calendários pessoais (com comprovante e cancelamento, quando permitido)','Triggers for the Personal Calendars emails; the plugin\'s own email handler listens to them — args ( appointment, calendar ).'=>'Gatilhos dos e-mails dos Calendários Pessoais; o próprio manipulador de e-mails do plugin os escuta — argumentos ( appointment, calendar ).','When on, this template can be chosen as the appointment receipt in the Personal Calendars settings.'=>'Quando ativado, este modelo pode ser escolhido como comprovante de agendamento nas configurações dos Calendários Pessoais.','[%1$s] Date Messages summary: %2$s'=>'[%1$s] Resumo de Mensagens por Data: %2$s','"Multiple Audiences" Badge Color'=>'Cor do badge "Múltiplos Públicos-alvo"','%d QR Code(s) cleared from cache successfully.'=>'%d QR Codes removidos do cache com sucesso.','A reregistration campaign collects updated information from the members of one or more audiences over a set period, with optional emails and an approval workflow. Campaigns are managed under the Reregistration admin menu.'=>'Uma campanha de recadastramento coleta informações atualizadas de membros de um ou mais públicos-alvo durante um período definido, contando com e-mails opcionais e um fluxo de aprovação. As campanhas são gerenciadas no menu administrativo de Recadastramento.','Acknowledgment notice ("Termo de Ciência") HTML — editable per-audience in the Reregistration Fields section, with a shipped default fallback.'=>'Aviso de reconhecimento ("Termo de Ciência") HTML — editável por público-alvo na seção Campos de Recadastramento, com um modelo padrão fornecido como alternativa.','Activate the campaign — a submission is created for every audience member and invitation emails go out.'=>'Ative a campanha — uma submissão é criada para cada membro do público-alvo e e-mails de convite são enviados.','Administrators can schedule activities for audiences (groups) in configured environments.'=>'Os administradores podem agendar atividades para públicos-alvo (grupos) em ambientes configurados.','Are you sure you want to deactivate this audience?'=>'Tem certeza de que deseja desativar este público-alvo?','Are you sure you want to permanently delete this audience?'=>'Tem certeza de que deseja excluir esse público-alvo permanentemente?','Audience calendars book shared spaces (rooms, equipment, "ambientes") for named groups of people, rather than fixed one-on-one slots. Everything lives under the Scheduling menu.'=>'Os calendários de público-alvo servem para reservar espaços compartilhados (salas, equipamentos, "ambientes") para grupos específicos de pessoas, em vez de horários fixos individuais. Tudo isso fica acessível no menu de Agendamento.','Audience Custom Fields'=>'Campos Personalizados do Público-alvo','Audience custom fields'=>'Campos personalizados de público-alvo','Audience groups and the scheduling admin.'=>'Grupos de público-alvo e o administrador de agendamento.','Audience membership'=>'Membros do público-alvo','Audiences (groups)'=>'Públicos-alvo (grupos)','Audiences table not ready yet (will seed on next run).'=>'A tabela para o público-alvo ainda não está pronta (será distribuída na próxima edição).','Available for this form but currently off. Leave it off if your audience submits from shared devices (labs, kiosks); turn it on if each person submits from their own device and you want to prevent repeat issuances.'=>'Disponível para este formulário, mas atualmente desativado. Mantenha-o desativado se o seu público-alvo enviar respostas a partir de dispositivos compartilhados (laboratórios, quiosques); ative-o se cada pessoa enviar respostas do próprio dispositivo e você quiser evitar envios duplicados.','Built-in short URLs, redirects and QR codes.'=>'URLs curtas, redirecionamentos e QR Codes integrados.','Cached QR Codes:'=>'QR Codes em cache:','Change the URL a certificate QR code encodes.'=>'Altere a URL codificada no QR Code de um certificado.','Child audiences inherit fields from parent audiences'=>'Os públicos-alvo filhos herdam os campos dos públicos-alvo pais.','Clear all cached QR Codes?\\n\\nThey will be regenerated automatically when needed.'=>'Limpar todos os QR Codes armazenados em cache?\\n\\nEles serão regenerados automaticamente quando necessário.','Clear All QR Code Cache'=>'Limpar Todo o Cache de QR Codes','Color for the "Multiple audiences" badge shown in the event list when an event has more than 2 audiences.'=>'Cor do selo "Vários públicos-alvo" exibido na lista de eventos quando um evento tem mais de 2 públicos-alvo.','Configure how private audience calendars are displayed to non-logged-in visitors. Note: Scheduling is always restricted to authorized members.'=>'Configure como os calendários de público-alvo privado são exibidos para visitantes não autenticados. Observação: o agendamento é sempre restrito a membros autorizados.','Configure the built-in URL shortener. Short URLs redirect visitors and generate QR Codes.'=>'Configure o encurtador de URLs integrado. URLs curtas redirecionam os visitantes e geram QR Codes.','Copy this audience\'s option lists (departments, unions, work schedules…) to all child and grandchild audiences. Overwrites their current lists.'=>'Copie as listas de opções deste público-alvo (departamentos, sindicatos, horários de trabalho…) para todos os públicos-alvo filhos e netos. Isso sobrescreve as listas atuais deles.','Copy this audience\'s option lists to all child and grandchild audiences? This overwrites their current lists.'=>'Copiar as listas de opções deste público-alvo para todos os públicos-alvo filhos e netos? Isso sobrescreverá as listas atuais deles.','Create a campaign and link it to one or more audiences.'=>'Crie uma campanha e vincule-a a um ou mais públicos-alvo.','Create audiences and manage their members.'=>'Crie públicos-alvo e gerencie seus membros.','create audiences, schedules, environments and members.'=>'crie públicos-alvo, agendamentos, ambientes e membros.','Create certificate-issuance forms, generate the certificate PDF automatically on submission, and let anyone verify authenticity by QR code or validation link.'=>'Crie formulários de emissão de certificados, gere o PDF do certificado automaticamente após o envio e permita que qualquer pessoa verifique a autenticidade via QR Codes ou link de validação.','Custom fields from audience memberships. Fields are grouped by audience.'=>'Campos personalizados provenientes de associações de público-alvo. Os campos são agrupados por público-alvo.','Default QR code (uses settings from QR Code tab)'=>'QR Code padrão (usa as configurações da aba QR Code)','Default QR Code Margin'=>'Margem Padrão do QR Code','Default QR Code Size'=>'Tamanho Padrão do QR Code','Default settings for QR Code generation in certificates.'=>'Configurações padrão para geração de QR Code em certificados.','Delete audiences'=>'Excluir públicos-alvo','Disables the built-in short URLs, redirects and QR codes.'=>'Desativa as URLs curtas, os redirecionamentos e os QR Codes integrados.','Displays the audience scheduling calendar for group bookings.'=>'Exibe o calendário de agendamento de público-alvo para reservas de grupo.','Enable debug logging for QR code generation'=>'Ative o registro de depuração para a geração de QR Code','Enable QR Code Cache'=>'Ativar Cache de QR Code','Every certificate carries a QR code and a validation link; anyone can confirm it is genuine, and the holder gets a one-click "magic link" to re-download.'=>'Cada certificado contém um QR Code e um link de validação; qualquer pessoa pode confirmar sua autenticidade, e o titular recebe um "link mágico" de um clique para baixá-lo novamente.','Every email the plugin sends — certificate delivery, admin notifications, recruitment convocations, booking confirmations, reregistration invitations, audience notices — goes through one shared pipeline with one configurable look.'=>'Todos os e-mails enviados pelo plugin — entrega de certificados, notificações para administradores, convocações de recrutamento, confirmações de agendamento, convites para recadastramento, avisos ao público-alvo — passam por um fluxo único e compartilhado, com um visual configurável.','Failed to load QR Code'=>'Falha ao carregar o QR Code','FFC Appointments - Manager'=>'FFC Agendamentos - Gestor','FFC Audiences - Manager'=>'FFC Público-alvo - Gestor','FFC Calendars - Manager'=>'FFC Calendários - Gestor','FFC Certificates - Manager'=>'FFC Certificados - Gestor','FFC Forms - Manager'=>'FFC Formulários - Gestor','FFC Recruitment - Manager'=>'FFC Recrutamento - Gestor','FFC Reregistration - Manager'=>'FFC Recadastramento - Gestor','FFC Settings'=>'Configurações FFC','Free Form Certificate turns WordPress into a complete platform for issuing verifiable documents. Build a form, design the certificate once, and let people receive a signed PDF the moment they submit — validated by QR code or a public link, protected against fraud and duplicate issuance, and delivered by email automatically.'=>'O Free Form Certificate transforma o WordPress em uma plataforma completa para a emissão de documentos verificáveis. Crie um formulário, projete o certificado uma única vez e permita que as pessoas recebam um PDF assinado assim que enviarem os dados — validado por QR Code ou link público, protegido contra fraudes e emissões duplicadas, e entregue automaticamente por e-mail.','Higher = fewer false positives, but easier to evade (a device only needs to differ on a few strong signals to escape). Lower = closer to the old behavior and more aggressive. 0 disables the strong tier entirely (block on the raw threshold alone — the legacy behavior that over-blocked homogeneous audiences). Submissions that cannot emit this many strong signals (e.g. privacy browsers blocking canvas/WebGL) fall back to the cookie only and are never blocked on weak signals alone. Default is 2.'=>'Um valor mais alto resulta em menos falsos positivos, mas torna a detecção mais fácil de burlar (basta que um dispositivo difira em alguns sinais fortes para escapar). Um valor mais baixo aproxima o sistema do comportamento anterior e o torna mais agressivo. O valor 0 desativa completamente a camada de sinais fortes (o bloqueio baseia-se apenas no limite bruto — o comportamento legado que bloqueava excessivamente públicos-alvo homogêneos). Envios que não conseguem emitir essa quantidade de sinais fortes (por exemplo, navegadores focados em privacidade que bloqueiam *canvas* ou WebGL) recorrem apenas ao uso de cookies e nunca são bloqueados com base apenas em sinais fracos. O valor padrão é 2.','Higher levels allow more damage to QR Code but create denser patterns.'=>'Níveis mais altos permitem mais danos ao QR Code, mas geram padrões mais densos.','How audience badges are displayed. "Name only" shows just the audience name. "Parent: Name" prefixes with the parent category when available.'=>'Como os crachás de público-alvo são exibidos. "Somente nome" mostra apenas o nome do público-alvo. "Categoria principal: Nome" adiciona o prefixo da categoria principal, quando disponível.','Improves performance by caching QR Codes. Increases database size (~4KB per submission).'=>'Melhora o desempenho armazenando QR Codes em cache. Aumenta o tamanho do banco de dados (aproximadamente 4 KB por envio).','Limit submissions from the same physical device by combining a persistent cookie with multiple browser signals. Two visits count as the same device when (a) their cookie matches, or (b) they match at least the threshold number of signals AND at least the minimum number of STRONG signals. The strong-signal tier prevents false blocks across same-model devices in homogeneous audiences, where weak signals (browser/OS/screen/timezone) are identical between different people.'=>'Limite envios provenientes do mesmo dispositivo físico combinando um cookie persistente com múltiplos sinais do navegador. Duas visitas são contabilizadas como sendo do mesmo dispositivo quando (a) seus cookies coincidem ou (b) elas correspondem a, pelo menos, o número limite de sinais E, simultaneamente, ao número mínimo de sinais FORTES. A camada de sinais fortes evita bloqueios indevidos entre dispositivos do mesmo modelo em públicos-alvo homogêneos, nos quais sinais fracos (navegador, sistema operacional, tela, fuso horário) são idênticos para pessoas diferentes.','Logs QR-code asset resolution, cache hits, and URL composition.'=>'Registra a resolução de recursos de QR Code, acessos ao cache e composição de URLs.','Manage audiences'=>'Gerenciar públicos-alvo','No white margin around QR code'=>'Sem margem branca ao redor do QR Code','Notice shown at the end of the reregistration form and printed on the record PDF. Use "Replicate lists to children" to push it to descendant audiences.'=>'Aviso exibido no final do formulário de recadastramento e impresso na ficha PDF. Use "Replicar listas para filhos" para enviá-lo aos públicos-alvo descendentes.','On top of the threshold above, at least this many STRONG signals (canvas, WebGL, audio, fonts, plugins, permissions) must match before two visits count as the same device. Strong signals rarely coincide between different physical devices, so requiring them is what stops false blocks across same-model devices in a homogeneous audience.'=>'Além do limite mencionado, é necessário que pelo menos essa quantidade de sinais FORTES (canvas, WebGL, áudio, fontes, plugins, permissões) coincida para que duas visitas sejam contabilizadas como provenientes do mesmo dispositivo. Sinais fortes raramente coincidem entre dispositivos físicos diferentes; portanto, exigi-los é o que evita bloqueios indevidos de dispositivos do mesmo modelo em um público-alvo homogêneo.','Optionally store generated QR codes in the database (roughly 4 KB per submission) so they are not re-rendered on every PDF. A "Clear all QR-code cache" button flushes them. Statistics show how many codes are cached and their total size.'=>'Opcionalmente, armazene os QR Codes gerados no banco de dados (aproximadamente 4 KB por envio) para evitar que sejam renderizados novamente a cada PDF. Um botão "Limpar cache de QR Codes" realiza a limpeza desses dados. As estatísticas exibem a quantidade de códigos em cache e o tamanho total ocupado por eles.','Personal appointment calendars (fixed slots) and audience calendars for shared spaces (free-form bookings), each with confirmations, reminders and ICS invites.'=>'Agendas de compromissos pessoais (horários fixos) e agendas de público-alvo para espaços compartilhados (reservas de formato livre), cada uma com confirmações, lembretes e convites ICS.','Placeholders replaced with sample data. QR code shown as placeholder.'=>'Placeholders substituídos por dados de exemplo. QR Code exibido como placeholder.','Pure relationships (audience memberships, permission grants, the stored user profile) are removed with the account.'=>'Relacionamentos puros (associações a públicos-alvo, concessões de permissão, perfil de usuário armazenado) são removidos juntamente com a conta.','QR Code'=>'QR Code','QR Code Cache'=>'Cache de QR Code','QR Code Defaults'=>'Configurações Padrão do QR Code','QR Code too large/small'=>'QR Code muito grande/pequeno','QR Codes are also available over REST for external automations:'=>'Os QR Codes também estão disponíveis via REST para automações externas:','QR Codes will be regenerated automatically when needed. This action is safe and reversible.'=>'Os QR Codes serão regenerados automaticamente quando necessário. Essa ação é segura e reversível.','QR generation failed.'=>'A geração do QR Code falhou.','QR-code cache'=>'Cache de QR Code','Removes audience groups and the scheduling admin.'=>'Remove grupos de público-alvo e o administrador de agendamento.','Requires JavaScript and HTTPS. A visitor with JavaScript disabled cannot submit the form at all — acceptable when the audience is known, such as staff filling in forms on a workstation.'=>'Requer JavaScript e HTTPS. Um visitante com o JavaScript desativado não consegue enviar o formulário de forma alguma — o que é aceitável quando o público-alvo é conhecido, como funcionários preenchendo formulários em uma estação de trabalho.','schedule_id/environment_id of 0 show everything the visitor may access; view is month or week. Bookings are made through the plugin\'s REST API and can target one or more audiences or an individual, and are cancelled with a required reason.'=>'`schedule_id`/`environment_id` igual a 0 exibe tudo o que o visitante pode acessar; a visualização é mensal ou semanal. As reservas são realizadas por meio da API REST do plugin, podem ser direcionadas a um ou mais públicos-alvo ou a um indivíduo, e são canceladas mediante a obrigatoriedade de informar o motivo.','See Audience Calendars'=>'Ver calendários de público-alvo','See Audience Custom Fields'=>'Ver campos personalizados de público-alvo','Short URL & QR Code'=>'URL Curta e QR Code','Short URL QR Code (base64)'=>'QR Code de URL curta (base64)','Store generated QR Codes in database'=>'Armazene os QR Codes gerados no banco de dados.','Store generated QR Codes in database to avoid regenerating them on each request.'=>'Armazene os QR Codes gerados no banco de dados para evitar regenerá-los a cada solicitação.','The list & QR codes'=>'A lista e os QR Codes','The list shows each link\'s title, short URL, destination, click count and status, with actions to show a QR code, enable/disable, or trash (trashed links can be restored or permanently deleted). Each link has a QR code (PNG or SVG download) that encodes the short URL itself, so scanning it is also counted.'=>'A lista exibe o título, a URL curta, o destino, a contagem de cliques e o status de cada link, com opções para exibir o QR Code, ativar/desativar ou enviar para a lixeira (links na lixeira podem ser restaurados ou excluídos permanentemente). Cada link possui um QR Code (disponível para download em PNG ou SVG) que codifica a própria URL curta; assim, a leitura do código também é contabilizada.','The member form itself is gated by login + audience membership, not a capability.'=>'O formulário de membro em si é protegido por login e associação a um público-alvo, não por uma permissão.','The QR code can be customized with various attributes:'=>'O QR Code pode ser personalizado com diversos atributos:','The QR code embedded in the PDF points at the same magic link.'=>'O QR Code incorporado ao PDF aponta para o mesmo link mágico.','There is no separate reregistration shortcode. Active campaigns appear as a banner on the member\'s personal dashboard (the user_dashboard_personal shortcode); the form loads and submits there over AJAX. Members are targeted by audience membership, not by matching a CPF/RF. On submit, the plugin generates an authentication code and a Record magic link, syncs mapped fields to the user profile, and sends the confirmation email.'=>'Não existe um shortcode separado para o recadastramento. Campanhas ativas aparecem como um banner no painel pessoal do membro (o shortcode `user_dashboard_personal`); o formulário é carregado e enviado nesse local via AJAX. A segmentação dos membros baseia-se na participação em públicos-alvo, e não na correspondência de CPF/RF. Ao realizar o envio, o plugin gera um código de autenticação e um link mágico da Ficha, sincroniza os campos mapeados com o perfil do usuário e envia o e-mail de confirmação.','This plugin allows you to create certificate issuance forms, generate PDFs automatically, and verify authenticity with QR codes.'=>'Este plugin permite criar formulários de emissão de certificados, gerar PDFs automaticamente e verificar a autenticidade com QR Codes.','This text is suggested by the Free Form Certificate plugin to help you describe how it processes personal data. Review and adapt it to your organisation and to the modules you actually use (form submissions and certificates, appointment scheduling, audiences, re-registration and recruitment). Delete any section that does not apply.'=>'Este texto é sugerido pelo plugin Free Form Certificate para ajudar você a descrever como ele processa dados pessoais. Revise-o e adapte-o à sua organização e aos módulos que você realmente utiliza (envio de formulários e certificados, agendamento de horários, públicos-alvo, recadastramento e recrutamento). Exclua qualquer seção que não se aplique.','Unlike personal calendars, an audience booking has a free start/end time. Two bookings that overlap the same environment are a hard conflict (blocked); overlaps for the same audience or user are soft conflicts the booker can acknowledge. Each booking needs a short description (15–300 characters).'=>'Ao contrário das agendas pessoais, uma reserva de público-alvo não possui horários de início e término fixos. Duas reservas que se sobrepõem no mesmo ambiente geram um conflito crítico (bloqueio); sobreposições envolvendo o mesmo público-alvo ou usuário constituem conflitos leves, que podem ser validados por quem realiza a reserva. Cada reserva requer uma breve descrição (de 15 a 300 caracteres).','view the list and download QR codes.'=>'Visualize a lista e baixe os QR Codes.','view the Scheduling menu and audience pages.'=>'visualize o menu de agendamento e as páginas de público-alvo.','When enabled, all descendant audiences inherit this setting. Users can join up to 2 child groups.'=>'Quando ativada, essa configuração é herdada por todos os públicos-alvo descendentes. Os usuários podem participar de até 2 grupos filhos.','When enabled, audience same-day and user overlap checks only consider bookings within this calendar. Environment conflicts are always per-environment regardless of this setting.'=>'Quando ativado, as verificações de público-alvo no mesmo dia e sobreposição de membros consideram apenas agendamentos dentro deste calendário. Conflitos de ambiente são sempre por ambiente, independentemente desta configuração.','White space around QR Code in modules. 0 = no margin, higher values = more white space.'=>'Espaço em branco ao redor do QR Code nos módulos. 0 = sem margem, valores maiores = mais espaço em branco.','Outside the audience'=>'Fora do público-alvo','Design and generate QR codes'=>'Crie e gere QR Codes','Style the QR codes on certificates and short URLs (shapes, colours, logo, frame), and draw standalone codes for a website, Wi-Fi, contact card, event and more with the QR Code Generator.'=>'Personalize os QR Codes dos certificados e das URLs curtas (formatos, cores, logotipo, moldura) e crie códigos avulsos para site, Wi-Fi, cartão de contato, evento e mais com o Gerador de QR Code.','This cache covers certificate QR codes only. Short URLs cache their own QR codes separately, with no setting and no manual clearing.'=>'Este cache cobre apenas os QR Codes dos certificados. As URLs curtas armazenam seus próprios QR Codes separadamente, sem configuração e sem limpeza manual.','The {{qr_code}} image follows the design set in Settings → QR Code (module shape, colours, logo, frame) when that design is switched on for certificates; otherwise a plain black-and-white code is drawn.'=>'A imagem de {{qr_code}} segue o design definido em Configurações → QR Code (formato dos módulos, cores, logotipo, moldura) quando esse design está ativado para certificados; caso contrário, é gerado um código simples em preto e branco.','%1$s — %2$s (%3$s)'=>'%1$s — %2$s (%3$s)','(offer only notices in that list; with a fixed notice, show a "not published" message while the notice is not in that list).'=>'(oferece só editais com essa lista; com um edital fixo, mostra uma mensagem de "não publicada" enquanto o edital não estiver nessa lista).','(the notice chosen in the selector),'=>'(o edital escolhido no seletor),','Definitive list'=>'Lista definitiva','No notices are published yet.'=>'Ainda não há editais publicados.','Paste it into a page or post to publish this notice\'s classification. For a selector with every published notice, use %s.'=>'Cole numa página ou post para publicar a classificação deste edital. Para um seletor com todos os editais publicados, use %s.','Select a notice'=>'Selecione um edital','Select a notice to see its classification.'=>'Selecione um edital para ver a classificação.','Show on the site'=>'Exibir no site','The definitive list for this notice has not been published yet.'=>'A lista definitiva deste edital ainda não foi publicada.','The list attribute must be "preliminary" or "definitive".'=>'O atributo list deve ser "preliminary" ou "definitive".','The preliminary list for this notice is no longer available.'=>'A lista prévia deste edital não está mais disponível.','Without a notice:'=>'Sem edital:','shows a selector of every notice in its preliminary or definitive list (drafts and closed notices are left out); the visitor picks one and its list appears below. With a single notice on offer it opens directly. The notice edit screen has the shortcode ready to copy.'=>'mostra um seletor com todos os editais em lista prévia ou definitiva (rascunhos e editais encerrados ficam de fora); o visitante escolhe um e a lista dele aparece abaixo. Com um único edital disponível, ele abre direto. A tela de edição do edital traz o shortcode pronto para copiar.','the public classification list for a notice. Shows only the columns the notice marks public. Accepts an optional adjutancy="slug" attribute, and honors the ?q (name search), ?adjutancy, ?subscription (pcd/geral) and ?page_top / ?page_bottom URL filters. The "Show on the site" card on the notice edit screen has it ready to copy.'=>'a lista pública de classificação de um edital. Mostra só as colunas que o edital marca como públicas. Aceita o atributo opcional adjutancy="slug" e respeita os filtros de URL ?q (busca por nome), ?adjutancy, ?subscription (pcd/geral) e ?page_top / ?page_bottom. O card "Exibir no site" na tela de edição do edital traz o shortcode pronto para copiar.','without a notice, a selector of every notice in its preliminary or definitive list; drafts and closed notices are left out. The chosen notice\'s list appears below it. Add list="preliminary" or list="definitive" to offer only one kind.'=>'sem edital, um seletor com todos os editais em lista prévia ou definitiva; rascunhos e editais encerrados ficam de fora. A lista do edital escolhido aparece abaixo. Adicione list="preliminary" ou list="definitive" para oferecer só um tipo.','The history keeps the last %d days. Older runs and their deliveries are removed automatically by the daily run.'=>'O histórico guarda os últimos %d dias. Execuções mais antigas e as entregas delas são apagadas automaticamente pela execução diária.','The history keeps the last 365 days: each daily run removes older runs together with their deliveries, even while e-mails are disabled. A message can never go out twice because of it, since a delivery is recorded per date including its year.'=>'O histórico guarda os últimos 365 dias: cada execução diária apaga as execuções mais antigas junto com as entregas delas, mesmo com os e-mails desativados. Isso nunca faz uma mensagem sair duas vezes, porque cada entrega é registrada por data, incluindo o ano.','A person receives the message when they belong to any audience on the right; members of sub-audiences are included. With none selected, the rule reaches everyone.'=>'A pessoa recebe a mensagem quando pertence a qualquer público da direita; membros de sub-públicos estão incluídos. Sem nenhum selecionado, a regra alcança todos.','All active rules'=>'Todas as regras ativas','All of the rule\'s audiences'=>'Todos os públicos da regra','Everyone, or the members of the audiences chosen in the two-column picker — the same one the reregistration campaign uses. Belonging to any one of them is enough, and members of their sub-audiences are included; choosing an audience brings its sub-audiences along.'=>'Todos, ou os membros dos públicos escolhidos no seletor de duas colunas — o mesmo usado na campanha de recadastramento. Basta pertencer a um deles, e membros dos sub-públicos estão incluídos; escolher um público traz junto os sub-públicos dele.','Lists the birthdays in the next 7 or 30 days or in a chosen month, by day and month. It can be narrowed to one active rule, and then to one of that rule\'s audiences; with no rule chosen, the audience filter offers those of every active rule. An Audiences column names which of them each person belongs to. The tab is shown only to holders of ffc_view_date_messages_pii and administrators.'=>'Lista os aniversários dos próximos 7 ou 30 dias ou de um mês escolhido, por dia e mês. Pode ser filtrada por uma regra ativa e, depois, por um dos públicos dessa regra; sem regra escolhida, o filtro de público oferece os de todas as regras ativas. Uma coluna Públicos mostra a quais deles cada pessoa pertence. A aba aparece só para quem tem ffc_view_date_messages_pii e para administradores.','QR Code in the Certificate'=>'QR Code no Certificado','See the QR Code Generator'=>'Veja o Gerador de QR Code','Their design follows Settings → QR Code when it is applied to short URLs.'=>'O design deles segue Configurações → QR Code quando aplicado às URLs curtas.','See QR Code settings'=>'Veja as configurações de QR Code','Short URLs created here'=>'URLs curtas criadas aqui','This is where manual short URLs are made: the Short URLs list has no form of its own, and its "New short URL" button opens the generator on the Website type. A short URL created here appears on the list like any other and counts the clicks of the printed code.'=>'É aqui que as URLs curtas manuais são criadas: a lista de URLs Curtas não tem formulário próprio, e o botão "Nova URL curta" abre o gerador no tipo Site. Uma URL curta criada aqui aparece na lista como qualquer outra e conta os cliques do código impresso.','See Short URLs'=>'Veja URLs Curtas','The design sections are the same as on Settings → QR Code, and start from the global design (or from the user\'s last downloaded one) whether or not it is applied to certificates or short URLs there. A change made in the generator applies to this code only and never alters the global settings; the QR Code defaults for size, margin and error correction do not apply here either, since each code sets its own.'=>'As seções de design são as mesmas de Configurações → QR Code e partem do design global (ou do último baixado pelo usuário), esteja ele aplicado ou não a certificados ou URLs curtas. Uma alteração feita no gerador vale só para este código e nunca muda as configurações globais; os padrões de tamanho, margem e correção de erros do QR Code também não se aplicam aqui, pois cada código define os seus.','Global QR Code settings'=>'Configurações globais de QR Code','The certificate PDF draws this code with the plugin-wide settings on Settings → QR Code: their defaults fill in any attribute the placeholder leaves out, and their design is used when it is applied to certificates.'=>'O PDF do certificado desenha este código com as configurações gerais do plugin em Configurações → QR Code: os padrões preenchem qualquer atributo que o placeholder omitir, e o design é usado quando está aplicado a certificados.','These settings apply plugin-wide, to every QR code the plugin draws by itself: the {{qr_code}} placeholder of the certificate PDF, and the QR codes of short URLs. The one exception is the QR Code Generator under Short URLs, where each code is designed by hand: it only starts from the global design, and nothing changed there is saved back.'=>'Estas configurações valem para o plugin inteiro, em todo QR Code que o plugin desenha sozinho: o placeholder {{qr_code}} do PDF do certificado e os QR Codes das URLs curtas. A única exceção é o Gerador de QR Code em URLs Curtas, onde cada código é desenhado à mão: ele apenas parte do design global, e nada alterado lá é gravado de volta.','The attributes the {{qr_code}} placeholder can set for itself are listed under'=>'Os atributos que o placeholder {{qr_code}} pode definir por conta própria estão listados em','Reveal the email to edit it.'=>'Revele o e-mail para editá-lo.','On the edit screen the CPF/RF and the email start masked for everyone, administrators included. An operator who may see them uses Reveal to fetch the value, and every reveal writes an Activity Log entry while the Activity Log is on. The email can be edited only after it is revealed; saving without revealing it keeps the stored address.'=>'Na tela de edição, o CPF/RF e o e-mail começam mascarados para todos, inclusive administradores. Quem tem permissão para vê-los usa Revelar para buscar o valor, e cada revelação grava uma entrada no Log de Atividades enquanto ele estiver ligado. O e-mail só pode ser editado depois de revelado; salvar sem revelá-lo mantém o endereço gravado.','Administrators (manage_options) hold all of the above and, like the certificates admin role, see personal data unmasked on the list without a reveal step; the edit screen masks it for them too. See Capabilities & Roles.'=>'Administradores (manage_options) possuem todas as permissões acima e, assim como a função de administrador de certificados, veem os dados pessoais sem máscara na lista, sem a etapa de revelação; a tela de edição também os mascara para eles. Veja Capacidades e Funções.','In the form editor each tab opens into collapsible sections whose chip says On/Off, or the schedule, while closed, and each tab carries a dot that follows its switches. A summary box in the sidebar shows what the saved form does, the shortcode has a Copy button, and the registered locations of a geofence are picked with checkboxes.'=>'No editor de formulário, cada aba se abre em seções recolhíveis cujo indicador mostra Ligado/Desligado, ou o agendamento, quando fechadas, e cada aba tem um ponto que acompanha seus interruptores. Uma caixa de resumo na barra lateral mostra o que o formulário salvo faz, o shortcode tem um botão Copiar e os locais cadastrados de uma cerca geográfica são escolhidos por caixas de seleção.','Certificates → Dashboard opens with a summary row (forms in the month shown, submissions today and over the last 7 days, GeoFence windows open now) above a calendar of forms by GeoFence start date, or by publication date when a form has none. Picking a day lists its forms beside the calendar. It needs ffc_view_certificates.'=>'Certificados → Painel abre com uma linha de resumo (formulários no mês exibido, submissões de hoje e dos últimos 7 dias, janelas de GeoFence abertas agora) acima de um calendário de formulários pela data de início da GeoFence, ou pela data de publicação quando o formulário não tem uma. Escolher um dia lista seus formulários ao lado do calendário. Requer ffc_view_certificates.','The record sits beside a side panel with Save, the magic link with a Copy button, an Open certificate button that opens the public certificate page in a new tab, and the linked user.'=>'O registro fica ao lado de um painel lateral com Salvar, o link mágico com um botão Copiar, um botão Abrir certificado que abre a página pública do certificado em uma nova aba, e o usuário vinculado.','Body appearance'=>'Aparência do corpo','Only the body of this message changes; the header and footer stay the Email Model\'s. Fields left empty follow the Email Model.'=>'Só o corpo desta mensagem muda; o cabeçalho e o rodapé continuam os do Modelo de e-mail. Campos vazios seguem o Modelo de e-mail.','Background image'=>'Imagem de fundo','Choose a background image'=>'Escolha uma imagem de fundo','Choose image'=>'Escolher imagem','It covers the whole body, anchored on the side the text leaves free. Recommended: %d px wide (the Email Model width), up to 200 KB, with the strong details away from the text.'=>'Ela cobre o corpo inteiro, ancorada no lado que o texto deixa livre. Recomendado: %d px de largura (a largura do Modelo de e-mail), até 200 KB, com os detalhes fortes longe do texto.','Fallback colour'=>'Cor de fundo de reserva','Required with an image. It is what Outlook on Windows and readers that block images show instead of the image.'=>'Obrigatória com imagem. É o que o Outlook no Windows e os leitores que bloqueiam imagens mostram no lugar da imagem.','Text colour'=>'Cor do texto','Contrast %s:1 with the fallback colour.'=>'Contraste %s:1 com a cor de reserva.','Contrast %s:1 with the fallback colour: below 4.5:1, hard to read.'=>'Contraste %s:1 com a cor de reserva: abaixo de 4,5:1, difícil de ler.','Text position'=>'Posição do texto','Full width'=>'Largura total','On the left'=>'À esquerda','On the right'=>'À direita','Text area width'=>'Largura da área de texto','Used when the text sits on one side. On phones the text takes the full width, over the image.'=>'Usada quando o texto fica de um lado. No celular o texto ocupa a largura toda, sobre a imagem.','Preview message'=>'Ver prévia da mensagem','Computer'=>'Computador','Message preview'=>'Prévia da mensagem','Sample values; images load as most readers show them. Outlook on Windows and readers that block images show the fallback colour instead.'=>'Valores de exemplo; as imagens carregam como a maioria dos leitores as mostra. O Outlook no Windows e os leitores que bloqueiam imagens mostram a cor de reserva no lugar.','Colours must be written as #RRGGBB.'=>'As cores devem ser escritas como #RRGGBB.','Unknown text position.'=>'Posição do texto desconhecida.','Unknown text area width.'=>'Largura da área de texto desconhecida.','The background must be an image from the Media Library.'=>'O fundo deve ser uma imagem da Biblioteca de Mídia.','Choose a fallback colour: it is what readers that do not load the image will see.'=>'Escolha uma cor de reserva: é o que verão os leitores que não carregam a imagem.','A rule can draw its message body over a background image from the Media Library, with a fallback colour, a text colour and the text on the left, on the right or across the whole width (taking 50, 60 or 70 per cent of it). Only the body changes: the header and footer stay the Email Model\'s, and the image fills the body edge to edge at the Email Model width, at least as tall as the image. On phones the text takes the full width, over the image.'=>'Uma regra pode desenhar o corpo da mensagem sobre uma imagem de fundo da Biblioteca de Mídia, com uma cor de reserva, uma cor de texto e o texto à esquerda, à direita ou na largura toda (ocupando 50, 60 ou 70 por cento dela). Só o corpo muda: o cabeçalho e o rodapé continuam os do Modelo de e-mail, e a imagem preenche o corpo de ponta a ponta na largura do Modelo de e-mail, com pelo menos a altura da imagem. No celular o texto ocupa a largura toda, sobre a imagem.','The fallback colour is required with an image: Outlook on Windows and readers that block images show it instead. The editor shows the contrast of the text against it; over the image itself, check it in "Preview message".'=>'A cor de reserva é obrigatória com imagem: o Outlook no Windows e os leitores que bloqueiam imagens a mostram no lugar. O editor mostra o contraste do texto com ela; sobre a própria imagem, confira em "Ver prévia da mensagem".','A Date Messages rule can give its own message body a background image, colours and a text column; the header, footer, width and padding stay the ones set here.'=>'Uma regra de Mensagens por Data pode dar ao corpo da própria mensagem uma imagem de fundo, cores e uma coluna de texto; o cabeçalho, o rodapé, a largura e o espaçamento continuam os definidos aqui.','"Preview recipients" lists, for a range of dates, everyone the rule would reach and the decision for each, using the very selection the send uses, so the preview cannot disagree with what is sent. Long lists show only the first rows, while the totals count everyone. "Preview message" shows the e-mail as it will be sent, header, body appearance and footer, at computer or phone width. "Send test to me" mails the message, filled with fictional values, to your own address. All three use the values on the form, saved or not, and none sends to anybody else. Only the test send is recorded: it shows in the history marked "Test", with who sent it, and it never counts as a delivery, so it cannot stop the real message from going out.'=>'"Prévia dos destinatários" lista, para um intervalo de datas, todos que a regra alcançaria e a decisão para cada um, usando a mesma seleção do envio, então a prévia não pode divergir do que é enviado. Listas longas mostram só as primeiras linhas, enquanto os totais contam todos. "Ver prévia da mensagem" mostra o e-mail como será enviado, com cabeçalho, aparência do corpo e rodapé, na largura de computador ou de celular. "Enviar teste para mim" envia a mensagem, preenchida com valores fictícios, para o seu próprio endereço. Os três usam os valores do formulário, salvos ou não, e nenhum envia para outra pessoa. Só o envio de teste fica registrado: aparece no histórico com o selo "Teste" e o nome de quem enviou, e nunca conta como entrega, então não impede que a mensagem real seja enviada.','Test'=>'Teste','by %s'=>'por %s','Hide test sends'=>'Ocultar envios de teste','Show test sends'=>'Mostrar envios de teste','(unsaved rule)'=>'(regra não salva)','Developed by %s.'=>'Desenvolvido por %s.','Source code and issue tracker: %s'=>'Código-fonte e relato de problemas: %s','Checking access…'=>'Verificando o acesso…','This content needs JavaScript to check your access.'=>'Este conteúdo precisa de JavaScript para verificar o seu acesso.','This content is not available at this time.'=>'Este conteúdo não está disponível neste momento.','This content is not available in your location.'=>'Este conteúdo não está disponível na sua localização.','This content is not available.'=>'Este conteúdo não está disponível.','(HH:MM),'=>'(HH:MM),','(YYYY-MM-DD),'=>'(AAAA-MM-DD),','(hide the block entirely, or the message shown instead of the content).'=>'(ocultar o bloco inteiro, ou a mensagem exibida no lugar do conteúdo).','(location ids from Settings → Geolocation),'=>'(IDs de locais de Configurações → Geolocalização),','(one continuous period instead of the same hours every day),'=>'(um período contínuo em vez do mesmo horário todos os dias),','(one-off areas, radius in meters),'=>'(áreas avulsas, raio em metros),','(which checks run, and whether GPS and IP must both pass),'=>'(quais verificações rodam, e se GPS e IP precisam passar os dois),','Limits:'=>'Limites:','See Shortcodes.'=>'Veja Shortcodes.','GPS coordinates come from the visitor\'s browser and can be faked, so a GPS check controls who sees the content, not who is allowed to: never put anything secret behind it. The date/time and IP checks are repeated on the server. The shortcode only works in the content of a page or post, not in widgets or templates.'=>'As coordenadas de GPS vêm do navegador do visitante e podem ser falsificadas, então uma verificação por GPS controla quem vê o conteúdo, não quem tem permissão: nunca coloque nada sigiloso atrás dela. As verificações de data/hora e de IP são repetidas no servidor. O shortcode só funciona no conteúdo de uma página ou post, não em widgets ou templates.','Place it in a page or post. The content is not in the page HTML: once the browser checks pass it is loaded from the server, which re-checks the date/time window and, when asked, the IP location. Without any location or area attribute, the default GPS and IP locations of Settings → Geolocation apply.'=>'Coloque-o em uma página ou post. O conteúdo não vai no HTML da página: quando as verificações do navegador passam, ele é carregado do servidor, que verifica de novo a janela de data/hora e, quando pedido, a localização por IP. Sem nenhum atributo de local ou área, valem os locais padrão de GPS e IP de Configurações → Geolocalização.','Shows the content between the tags only to a visitor inside a date/time window and/or inside an area, with the same checks as a geofenced form.'=>'Mostra o conteúdo entre as tags apenas ao visitante dentro de uma janela de data/hora e/ou dentro de uma área, com as mesmas verificações de um formulário com geofence.','The same building blocks protect page content: the [ffc_geofence] shortcode uses these locations, fallbacks and the administrator bypass.'=>'Os mesmos recursos protegem conteúdo de páginas: o shortcode [ffc_geofence] usa estes locais, os fallbacks e o bypass de administrador.','links on white'=>'links sobre o branco','hints on white'=>'dicas sobre o branco','errors on white'=>'erros sobre o branco','field borders on white'=>'bordas dos campos sobre o branco','Public Design'=>'Design Público','Public Design settings view file not found.'=>'Arquivo de visualização das configurações de Design Público não encontrado.','Accent (buttons, links and focus)'=>'Destaque (botões, links e foco)','Field borders'=>'Bordas dos campos','Hints and secondary text'=>'Dicas e texto secundário','Errors'=>'Erros','The look of every screen visitors see: forms, certificate verification, scheduling, audiences, the user dashboard and recruitment. The colours apply to the light theme; in dark mode the plugin keeps its own dark palette, whose contrast is already checked.'=>'A aparência de todas as telas que os visitantes veem: formulários, verificação de certificados, agendamento, públicos, o painel do usuário e o recrutamento. As cores valem para o tema claro; no modo escuro o plugin mantém a própria paleta escura, cujo contraste já é verificado.','Customise'=>'Personalizar','Use the colours, corners, width and font below'=>'Usar as cores, os cantos, a largura e a fonte abaixo','Off, the screens keep the plugin\'s own look and the values below are not used. Saving with it off puts them back to their defaults.'=>'Desligado, as telas mantêm a aparência do próprio plugin e os valores abaixo não são usados. Salvar com ele desligado devolve os valores aos padrões.','Default: %s'=>'Padrão: %s','The text on buttons is chosen for you, black or white, whichever reads best on the accent. A colour that reads poorly on white (below 4.5:1 for text, 3:1 for borders, as WCAG asks) is still saved, with a warning naming it.'=>'O texto dos botões é escolhido automaticamente, preto ou branco, o que for mais legível sobre o destaque. Uma cor pouco legível sobre o branco (abaixo de 4,5:1 para texto e 3:1 para bordas, como pede a WCAG) é salva mesmo assim, com um aviso que a nomeia.','Shape and Font'=>'Forma e Fonte','Rounded corners'=>'Cantos arredondados','Of the fields and buttons; 0 makes them square. Default: %1$d px, up to %2$d.'=>'Dos campos e botões; 0 os deixa retos. Padrão: %1$d px, até %2$d.','Form width'=>'Largura do formulário','The widest a form or verification card grows; its fields are 150 px narrower. On a narrower screen it fills the space it has. Default: %1$d px, from %2$d to %3$d.'=>'A largura máxima de um cartão de formulário ou de verificação; os campos ficam 150 px mais estreitos. Em uma tela mais estreita, ele ocupa o espaço disponível. Padrão: %1$d px, de %2$d a %3$d.','The site theme\'s'=>'A do tema do site','The plugin\'s (the system font)'=>'A do plugin (fonte do sistema)','Arial'=>'Arial','Settings → Public Design sets the look of every screen visitors see: forms, certificate verification, the CSV download, geofenced content, scheduling, audiences, the user dashboard and recruitment. It is off by default, and the screens keep the plugin\'s own look until it is switched on.'=>'Configurações → Design Público define a aparência de todas as telas que os visitantes veem: formulários, verificação de certificados, o download de CSV, conteúdo com geolocalização, agendamento, públicos, o painel do usuário e o recrutamento. Vem desligado, e as telas mantêm a aparência do próprio plugin até que seja ligado.','The accent of buttons, links and the focus outline, the field borders, hints and secondary text, and errors. The text on buttons is chosen automatically, black or white, whichever reads best on the accent. A colour that reads poorly on white (below 4.5:1 for text, 3:1 for borders, as WCAG asks) is still saved, with a warning naming it.'=>'O destaque de botões, links e do contorno de foco, as bordas dos campos, as dicas e o texto secundário, e os erros. O texto dos botões é escolhido automaticamente, preto ou branco, o que for mais legível sobre o destaque. Uma cor pouco legível sobre o branco (abaixo de 4,5:1 para texto e 3:1 para bordas, como pede a WCAG) é salva mesmo assim, com um aviso que a nomeia.','The colours apply to the light theme only. With Dark Mode on, the plugin keeps its own dark palette, because a colour chosen for a white page is often unreadable on a dark one.'=>'As cores valem só para o tema claro. Com o Modo Escuro ligado, o plugin mantém a própria paleta escura, porque uma cor escolhida para uma página branca costuma ficar ilegível numa escura.','The corner radius of fields and buttons (0 makes them square), the widest a form or verification card grows (its fields are 150 px narrower), and the font: the site theme\'s (the default), the plugin\'s system font, or Arial, the same three choices as Email Signature Generator and Institutional Email. These apply in both themes.'=>'O raio dos cantos de campos e botões (0 os deixa quadrados), a largura máxima de um formulário ou cartão de verificação (seus campos ficam 150 px mais estreitos) e a fonte: a do tema do site (padrão), a fonte do sistema do plugin ou Arial, as mesmas três opções do Email Signature Generator e do Institutional Email. Valem nos dois temas.','Cached pages'=>'Páginas em cache','The design is part of the page, so a page cache keeps the old look until it is purged. After changing it, purge the cache of the pages with forms.'=>'O design faz parte da página, então um cache de página mantém a aparência antiga até ser limpo. Depois de alterá-lo, limpe o cache das páginas com formulários.','%1$s (%2$s:1, at least %3$s:1)'=>'%1$s (%2$s:1, pelo menos %3$s:1)','The design was saved, but some colours are hard to read: %s'=>'O design foi salvo, mas algumas cores são difíceis de ler: %s','Screenshots'=>'Capturas de tela','Previous screenshot'=>'Captura anterior','Next screenshot'=>'Próxima captura','Zoom in'=>'Ampliar','Zoom out'=>'Reduzir','In your language, screenshots in place.'=>'No seu idioma, capturas na própria janela.','The tabs and the banner are shown in your language when the plugin ships a translation of them; the changelog stays in English. A screenshot opens larger without leaving the window: the arrows move between them, and the wheel, a pinch or a click zooms in.'=>'As abas e o banner aparecem no seu idioma quando o plugin traz uma tradução deles; o changelog continua em inglês. Uma captura abre ampliada sem sair da janela: as setas passam de uma para outra, e a roda do mouse, o gesto de pinça ou um clique aproximam a imagem.','%1$s accepts up to %2$s characters.'=>'%1$s aceita até %2$s caracteres.','%1$s accepts up to %2$s decimal places.'=>'%1$s aceita até %2$s casas decimais.','%1$s is out of range. %2$s'=>'%1$s está fora do intervalo. %2$s','%1$s needs at least %2$s characters.'=>'%1$s precisa de pelo menos %2$s caracteres.','%1$s of %2$s selected.'=>'%1$s de %2$s selecionadas.','%1$s: choose up to %2$s option.'=>'%1$s: escolha até %2$s opção.' . "\0" . '%1$s: escolha até %2$s opções.','%s has an answer that is not one of its options.'=>'%s tem uma resposta que não está entre as opções.','%s has an invalid answer.'=>'%s tem uma resposta inválida.','%s must be a valid date.'=>'%s precisa ser uma data válida.','%s must be a whole number.'=>'%s precisa ser um número inteiro.','%s or less.'=>'%s ou menos.','%s or more.'=>'%s ou mais.','%s: choose at least one option.'=>'%s: escolha pelo menos uma opção.','A date picked from a calendar, with an optional range.'=>'Uma data escolhida num calendário, com intervalo opcional.','A drop-down list: the participant picks one option.'=>'Uma lista suspensa: o participante escolhe uma opção.','A fixed value saved with every submission. The participant does not see it.'=>'Um valor fixo salvo em todo envio. O participante não o vê.','A number, with an optional range and decimal places.'=>'Um número, com intervalo e casas decimais opcionais.','A video, image or audio shown on the form. Collects nothing.'=>'Um vídeo, imagem ou áudio exibido no formulário. Não coleta nada.','Add option'=>'Adicionar opção','An email address, checked for format.'=>'Um endereço de e-mail, com o formato verificado.','At least %s characters.'=>'Pelo menos %s caracteres.','Between %1$s and %2$s characters.'=>'Entre %1$s e %2$s caracteres.','Between %1$s and %2$s.'=>'Entre %1$s e %2$s.','Choose at least one option.'=>'Escolha pelo menos uma opção.','Choose up to %s option.'=>'Escolha até %s opção.' . "\0" . 'Escolha até %s opções.','Decimal places'=>'Casas decimais','Earliest date'=>'Data mais antiga','Empty means no limit. Once it is reached, the other boxes are disabled.'=>'Vazio = sem limite. Ao atingi-lo, as demais caixas ficam desabilitadas.','Empty means no limit. The participant sees the range.'=>'Vazio = sem limite. O participante vê o intervalo.','Empty means no minimum, and the server ceiling for the maximum: %1$s characters for Text, %2$s for Textarea. The participant sees the limits you set.'=>'Vazio = sem mínimo e, no máximo, o teto do servidor: %1$s caracteres para Texto, %2$s para Área de texto. O participante vê os limites que você definir.','Every option visible: the participant picks exactly one.'=>'Todas as opções visíveis: o participante escolhe exatamente uma.','Every option visible: the participant ticks one or more. "Required" means at least one.'=>'Todas as opções visíveis: o participante marca uma ou mais. "Obrigatório" exige pelo menos uma.','From %s.'=>'A partir de %s.','Latest date'=>'Data mais recente','Maximum'=>'Máximo','Maximum characters'=>'Máximo de caracteres','Maximum selections'=>'Máximo de seleções','Minimum'=>'Mínimo','Minimum characters'=>'Mínimo de caracteres','One line, up to %s characters. For names, roles, codes.'=>'Uma linha, até %s caracteres. Para nomes, cargos, códigos.','Option'=>'Opção','Options (one per row):'=>'Opções (uma por linha):','Remove option'=>'Remover opção','Several lines, up to %s characters. For explanations and comments.'=>'Várias linhas, até %s caracteres. Para justificativas e comentários.','Shuffle the options for each participant'=>'Embaralhar as opções para cada participante','Text shown on the form. Collects nothing.'=>'Texto exibido no formulário. Não coleta nada.','Untick one to choose another.'=>'Desmarque uma para escolher outra.','Until %s.'=>'Até %s.','Up to %s characters.'=>'Até %s caracteres.','Single-line text, up to 255 characters — for names, roles, codes. Optional minimum and maximum length.'=>'Texto em uma linha, até 255 caracteres — para nomes, cargos, códigos. Mínimo e máximo de caracteres opcionais.','Numeric input. Optional minimum, maximum and decimal places (whole numbers by default).'=>'Campo numérico. Mínimo, máximo e casas decimais opcionais (números inteiros por padrão).','Date picker. Optional earliest and latest date.'=>'Seletor de data. Data mais antiga e mais recente opcionais.','Multi-line text, up to 2,000 characters — for explanations and comments. Optional minimum and maximum length.'=>'Texto em várias linhas, até 2.000 caracteres — para justificativas e comentários. Mínimo e máximo de caracteres opcionais.','Dropdown — one option per row. Can carry quiz points.'=>'Lista suspensa — uma opção por linha. Pode ter pontos no quiz.','Radio buttons — one option per row; the participant picks exactly one. Can carry quiz points.'=>'Botões de seleção única — uma opção por linha; o participante escolhe exatamente uma. Pode ter pontos no quiz.','Checkboxes — one option per row; the participant ticks one or more, up to an optional maximum. "Required" means at least one. Not scored in quiz mode.'=>'Caixas de seleção — uma opção por linha; o participante marca uma ou mais, até um máximo opcional. "Obrigatório" exige pelo menos uma. Não pontua no modo quiz.','Options and limits'=>'Opções e limites','Options are edited one per row, so an option may contain a comma. Drag a row to reorder it; Enter in an option adds the next one. A form saved before keeps working and is converted on its next save.'=>'As opções são editadas uma por linha, então uma opção pode conter vírgula. Arraste uma linha para reordená-la; Enter numa opção adiciona a próxima. Um formulário salvo antes continua funcionando e é convertido no próximo salvamento.','"Shuffle the options for each participant" puts a choice field\'s options in a random order in the browser, so a cached page still shows each participant a different order.'=>'"Embaralhar as opções para cada participante" coloca as opções de um campo de escolha em ordem aleatória no navegador, então mesmo uma página em cache mostra a cada participante uma ordem diferente.','The participant sees the limits you set — "Between 50 and 2,000 characters.", "Choose up to 3 options.", "Between 01/01/1800 and 31/12/1999." — and a live character counter under text fields.'=>'O participante vê os limites que você definir — "Entre 50 e 2.000 caracteres.", "Escolha até 3 opções.", "Entre 01/01/1800 e 31/12/1999." — e um contador de caracteres ao vivo sob os campos de texto.','The server checks every rule again on submit — a required answer, the length, the range, the number of options ticked and that each answer is one of the options — and refuses the submission listing every problem at once. The browser is a courtesy, never the guard.'=>'O servidor confere cada regra de novo no envio — resposta obrigatória, tamanho, intervalo, quantidade de opções marcadas e se cada resposta está entre as opções — e recusa o envio listando todos os problemas de uma vez. O navegador é uma cortesia, nunca a proteção.','%1$s: enter the full name — at least two words and %2$s characters.'=>'%1$s: informe o nome completo — pelo menos duas palavras e %2$s caracteres.','Add a field whose variable name is the tag without braces.'=>'Adicione um campo cujo nome da variável seja a etiqueta sem as chaves.','Certificates settings view file not found.'=>'Arquivo de visualização das configurações de Certificados não encontrado.','Enter a valid email address.'=>'Informe um e-mail válido.','Enter the first and last name.'=>'Informe o nome e o sobrenome.','First and last name.'=>'Nome e sobrenome.','Required certificate tag'=>'Etiqueta obrigatória do certificado','Settings → Certificates'=>'Configurações → Certificados','Warning! These required certificate tags have no field in the form:'=>'Atenção! Estas etiquetas obrigatórias do certificado não têm campo no formulário:','What every certificate form must carry. The certificate HTML editor\'s colour theme is on the General tab, next to Dark Mode.'=>'O que todo formulário de certificado precisa ter. O tema de cores do editor HTML do certificado fica na aba Geral, ao lado do Modo Escuro.','One tag per line (with braces). Every certificate layout must contain them, and every form must have a field for each one the participant fills in; the form editor highlights those fields and does not let them be renamed or removed. {{auth_code}} is always required — certificate verification depends on it — and the plugin generates it, so it needs no field.'=>'Uma etiqueta por linha (com as chaves). Todo layout de certificado precisa contê-las, e todo formulário precisa de um campo para cada uma que o participante preenche; o editor de campos destaca esses campos e não deixa renomeá-los nem removê-los. {{auth_code}} é sempre obrigatória — a verificação do certificado depende dela — e o plugin a gera, então ela não precisa de campo.','the participant\'s full name (required): at least two words and 4 characters, checked in the browser and on the server.'=>'o nome completo do participante (obrigatório): pelo menos duas palavras e 4 caracteres, conferido no navegador e no servidor.','the participant\'s email (required); used to deliver the certificate. An address that is not valid is refused as such, not as a missing one.'=>'o e-mail do participante (obrigatório); usado para entregar o certificado. Um endereço inválido é recusado como inválido, e não como ausente.','A field whose tag is a required certificate tag (Settings → Certificates) is drawn with an amber border and a "Required certificate tag" badge: it is always required, its variable name cannot change and it cannot be removed. Saving a form that has no field for one of those tags shows a warning naming it.'=>'Um campo cuja etiqueta é uma etiqueta obrigatória do certificado (Configurações → Certificados) aparece com borda âmbar e o selo "Etiqueta obrigatória do certificado": ele é sempre obrigatório, o nome da variável não muda e ele não pode ser removido. Salvar um formulário sem campo para uma dessas etiquetas mostra um aviso com o nome dela.','A field named cpf_rf is validated on submit as a Brazilian document: non-digits are stripped and the value must be exactly 11 digits (CPF, check-digit validated) or 7 digits (RF); the browser masks it and blocks the submit while the number is invalid. The RF check digit is enforced only when Settings → General → RF check digit is on (off by default). There is no separate "CPF field type" — the name is what triggers it. In the PDF, the cpf, cpf_rf and rg tokens are formatted with punctuation (e.g. 000.000.000-00 for a CPF, 000.000-0 for an RF), not masked.'=>'Um campo chamado cpf_rf é validado no envio como documento brasileiro: o que não é dígito é removido e o valor precisa ter exatamente 11 dígitos (CPF, com dígito verificador conferido) ou 7 dígitos (RF); o navegador aplica a máscara e bloqueia o envio enquanto o número for inválido. O dígito verificador do RF só é exigido quando Configurações → Geral → Dígito verificador do RF está ligado (desligado por padrão). Não existe um "tipo de campo CPF" — é o nome que ativa a validação. No PDF, as variáveis cpf, cpf_rf e rg são formatadas com pontuação (por exemplo, 000.000.000-00 para CPF e 000.000-0 para RF), sem mascaramento.','The form editor refuses to save a certificate layout that lacks a required tag — by default {{auth_code}}, {{name}} and {{cpf_rf}}, configurable under Settings → Certificates → Required Certificate Tags; the form editor also requires a field for each tag the participant fills in, and locks it. Once an Event Schedule is filled on the Time tab, {{schedule}} becomes required too.'=>'O editor de formulários recusa salvar um layout de certificado sem uma etiqueta obrigatória — por padrão {{auth_code}}, {{name}} e {{cpf_rf}}, configuráveis em Configurações → Certificados → Etiquetas de Certificado Obrigatórias; o editor também exige um campo para cada etiqueta que o participante preenche, e o trava. Quando um Horário do evento é preenchido na aba Horário, {{schedule}} também passa a ser obrigatória.']];
\ No newline at end of file
+Obrigado!','Hello,'=>'Olá,','Help text (optional)'=>'Texto de ajuda (opcional)','Hidden'=>'Escondido','Hidden Field'=>'Campo Oculto','Hide'=>'Ocultar','Hide completely'=>'Esconder completamente','Hide form completely'=>'Ocultar formulário completamente','Hide the "Protected by ALTCHA" footer'=>'Ocultar o rodapé "Protegido pelo ALTCHA"','Hide the ALTCHA logo'=>'Ocultar o logotipo do ALTCHA','hide the logo and/or the "Protected by ALTCHA" footer.'=>'oculte o logotipo e/ou o rodapé "Protegido pelo ALTCHA".','Hides the certificate admin and stops public form submissions. While off, the daily expired-ticket cleanup is paused (unredeemed ticket codes of ended forms are not purged until it is re-enabled).'=>'Oculta a administração de certificados e interrompe o envio de formulários públicos. Enquanto estiver desativado, a limpeza diária de tickets expirados é pausada (códigos de ticket não resgatados de formulários encerrados não são removidos até que a função seja reativada).','High (30% correction)'=>'Alto (correção de 30%)','High (30%)'=>'Alto (30%)','high entropy; hard to coincide between different physical devices and resistant to incognito. The strong-signal minimum is counted from these.'=>'alta entropia; difícil de fazer coincidir entre diferentes dispositivos físicos e resistente à navegação anônima. O mínimo de sinal forte é calculado a partir desses elementos.','Higher costs an attacker more per attempt, and costs an honest visitor more waiting. The range is bounded on both sides on purpose: too low and the proof means nothing, too high and a slow phone grinds until the widget gives up after 90 seconds.'=>'Valores mais altos aumentam o custo de cada tentativa para o atacante e exigem mais tempo de espera do visitante legítimo. Essa faixa é delimitada intencionalmente em ambos os extremos: um valor muito baixo torna a prova irrelevante, enquanto um valor muito alto faz com que um celular lento trave até que o widget desista, após 90 segundos.','Hired'=>'Contratado','Hired and not_shown classifications stay permanently frozen — they cannot be reopened later.'=>'As classificações "contratado" e "não exibido" permanecem congeladas permanentemente — não podem ser reabertas posteriormente.','History'=>'Histórico','Holiday'=>'Feriado','Holiday added successfully.'=>'Feriado adicionado com sucesso.','Holiday deleted successfully.'=>'Feriado excluído com sucesso.','Holidays / Closed Dates'=>'Feriados / Datas Fechadas','Holidays added here will block bookings across all calendars in both scheduling systems. Use per-calendar blocked dates for calendar-specific closures.'=>'Feriados adicionados aqui bloquearão reservas em todos os calendários de ambos os sistemas de agendamento. Use datas bloqueadas por calendário para fechamentos específicos.','Home Phone'=>'Telefone Residencial','Honeypot & CAPTCHA:'=>'Honeypot e CAPTCHA:','Hooks, REST & Forms API'=>'Hooks, REST e API de Formulários','Hours'=>'Horas','hours'=>'horas','hours before'=>'horas antes','hours before appointment'=>'horas antes do agendamento','Hover a role to see what it grants. Assigning a role applies immediately and affects only this user; it does not send an e-mail.'=>'Passe o cursor sobre uma função para ver o que ela concede. A atribuição de uma função é imediata e afeta apenas este usuário; não envia um e-mail.','How far in advance can users book?'=>'Com quanta antecedência os usuários podem agendar?','How Geolocation Works'=>'Como funciona a geolocalização','How it behaves'=>'Como ele se comporta','How it works'=>'Como funciona','How It Works:'=>'Como Funciona:','How long a challenge stays valid after it is issued. Long enough to fill in the form without rushing; short enough that a solved challenge is not worth stockpiling.'=>'Por quanto tempo um desafio permanece válido após ser emitido. Tempo suficiente para preencher o formulário sem pressa, mas curto o bastante para que não valha a pena acumular desafios resolvidos.','how long an issued challenge stays valid. Long enough to fill in the form without rushing, short enough that a solved challenge is not worth stockpiling.'=>'por quanto tempo um desafio emitido permanece válido. Tempo suficiente para preencher o formulário sem pressa, mas curto o bastante para que não valha a pena acumular desafios resolvidos.','How long the browser remembers a GPS fix (60–3600s, default 600).'=>'Por quanto tempo o navegador retém uma localização GPS (60–3600 s; padrão: 600).','How long to cache GPS location in browser. Range: 60-3600 seconds (1 min - 1 hour). Default: 600 (10 min).'=>'Tempo de armazenamento em cache da localização GPS no navegador. Intervalo: 60 a 3600 segundos (1 minuto a 1 hora). Padrão: 600 segundos (10 minutos).','How long to cache IP location data. Range: 300-3600 seconds (5 min - 1 hour).'=>'Tempo de armazenamento em cache dos dados de localização IP. Intervalo: 300 a 3600 segundos (5 minutos a 1 hora).','How long we keep your data'=>'Por quanto tempo mantemos seus dados','How many bookings a single slot accepts (default 1). An optional daily cap limits bookings per day. Custom-mode blocks carry their own per-block capacity.'=>'Define quantas reservas um único espaço aceita (padrão: 1). Um limite diário opcional restringe o número de reservas por dia. Blocos em modo personalizado possuem sua própria capacidade individual.','How many non-cookie signals (strong + weak) must match to consider it the same device. Lower = more aggressive (more false positives). Higher = harder to bypass but easier to evade. The default is 7 of 13.'=>'Quantos sinais que não sejam cookies (fortes + fracos) precisam coincidir para que o dispositivo seja considerado o mesmo? Um valor mais baixo é mais agressivo (gera mais falsos positivos). Um valor mais alto torna a detecção mais difícil de burlar, porém mais fácil de evitar. O padrão é 7 de 13.','how many of those must be strong signals (default 2); 0 disables the strong tier.'=>'quantos deles devem ser sinais fortes (padrão: 2); 0 desativa o nível de sinal forte.','how many signals must match (default 7).'=>'quantos sinais devem corresponder (padrão: 7).','How many STRONG signals (canvas, WebGL, audio, fonts, plugins, permissions) must match in addition to the threshold. Higher = fewer false positives but easier to evade; 0 disables the strong tier. Leave empty to inherit the global default — currently %s.'=>'Quantos sinais FORTES (canvas, WebGL, áudio, fontes, plugins, permissões) devem coincidir, além de atender ao limite. Valores mais altos resultam em menos falsos positivos, mas facilitam a evasão; 0 desativa o nível forte. Deixe em branco para herdar o padrão global — atualmente %s.','How many times should I run it?'=>'Quantas vezes devo executar o teste?','How much computation the visitor\'s browser spends proving it is not a script. The browser searches for a secret number up to this value, so it does about half this many hash operations. Allowed range: %1$s to %2$s.'=>'A quantidade de processamento que o navegador do visitante utiliza para provar que não é um script. O navegador busca um número secreto até esse valor, realizando, portanto, cerca de metade dessa quantidade de operações de hash. Intervalo permitido: %1$s a %2$s.','How the proof-of-work challenge behaves and how hard it is. Applies to the two modes that show the widget.'=>'Como o desafio de *proof-of-work* se comporta e qual é o seu nível de dificuldade. Aplica-se aos dois modos que exibem o widget.','How this very request would be resolved. IPs are masked unless you are a full administrator.'=>'Como essa solicitação específica seria resolvida. Os endereços IP são mascarados, a menos que você seja um administrador pleno.','How to display the form after the end date / end time.'=>'Como exibir o formulário após a data / hora de término?','How to display the form before the start date / start time. "Hide form completely" makes the page render as if the form did not exist yet.'=>'Como exibir o formulário antes da data / hora de início. "Ocultar formulário completamente" faz com que a página seja renderizada como se o formulário ainda não existisse.','How to display the form when the campaign is in its date range but the current time is outside today\'s daily slot (only used in Time Behavior = "applies to each day individually").'=>'Como exibir o formulário quando a campanha estiver dentro do seu intervalo de datas, mas a hora atual estiver fora do intervalo diário de hoje (usado apenas em Comportamento de Tempo = "aplica-se a cada dia individualmente").','How to display the form when user is outside allowed areas.'=>'Como exibir o formulário quando o usuário está fora das áreas permitidas.','How to Use / Shortcode'=>'Como Usar / Código Curto','How your data is stored'=>'Como seus dados são armazenados','HTML & Styling'=>'HTML e Estilização','HTML field not found.'=>'Campo HTML não encontrado.','HTML imported successfully!'=>'HTML importado com sucesso!','https://github.com/rpgmem'=>'https://github.com/rpgmem','https://github.com/rpgmem/ffcertificate'=>'https://github.com/rpgmem/ffcertificate','Hybrid — allow only when the user denied or the browser lacks support'=>'Híbrido — permitir somente quando o usuário negar ou o navegador não for compatível.','I agree to the collection and processing of my personal data in accordance with the Privacy Policy (LGPD).'=>'Concordo com a coleta e processamento dos meus dados pessoais de acordo com a Política de Privacidade (LGPD).','I am aware of the conflicts and want to proceed.'=>'Estou ciente dos conflitos e desejo prosseguir.','I am not a robot'=>'Eu não sou um robô','I do not hold'=>'Eu não tenho','I have read and agree to the %s and authorize the storage of my personal data for certificate issuance.'=>'Li e concordo com os %s e autorizo o armazenamento dos meus dados pessoais para a emissão do certificado.','I hold'=>'Eu tenho','ID'=>'ID','ID/CPF/RF entered by user'=>'ID/CPF/RF inserido pelo usuário','If the primary provider fails, try the other one.'=>'Se o provedor principal falhar, tente o outro.','If this option is disabled, debug logging will also be disabled.'=>'Se esta opção estiver desativada, o registro de depuração também será desativado.','If unchecked, the WordPress admin bar will be hidden for blocked roles.'=>'Se desmarcado, a barra de administração do WordPress será ocultada para funções bloqueadas.','If you use APO or a Cache Rule'=>'Se você utilizar APO ou uma regra de cache','If your site uses page caching (Cloudflare, W3 Total Cache, etc.), some visitors may see the old "not yet started" state until the cache refreshes. Ask them to reload if needed.'=>'Se o seu site utiliza cache de páginas (Cloudflare, W3 Total Cache, etc.), alguns visitantes podem ver o estado antigo de "ainda não iniciado" até que o cache seja atualizado. Peça que recarreguem a página, se necessário.','Ignore conflicts from other calendars'=>'Ignorar conflitos de outros calendários','ignores it'=>'ignora isso','Image Attributes:'=>'Atributos da Imagem:','Image inserted into the layout.'=>'Imagem inserida no layout.','Image not showing in PDF'=>'A imagem não aparece no PDF.','Image Reference Rewrite Errors'=>'Erros de Reescrita de Imagem','Images (logos, signatures, decorations)'=>'Imagens (logotipos, assinaturas, decorações)','Import'=>'Importar','Import & call-ups'=>'Importações e convocações','Import & Export'=>'Importar e Exportar','Import / export'=>'Importação / exportação','Import audience groups from a CSV file. Parent groups are created first, then children.'=>'Importar grupos de público-alvo de um arquivo CSV. Grupos mãe são criados primeiro, depois os filhos.','Import Audiences'=>'Importar Público-alvo','Import audiences'=>'Importar público-alvo','Import candidates (CSV)'=>'Candidatos a importar (CSV)','import candidates / record call-ups.'=>'importar candidatos / registrar convocações.','Import certificate layouts left in the plugin\'s html/ drop-folder into the reusable template pool (Certificate → Templates). Non-destructive and idempotent: shipped defaults are skipped and each file is imported once.'=>'Importe os layouts de certificado presentes na pasta `html/` do plugin para o repositório de modelos reutilizáveis (Certificado → Modelos). O processo é não destrutivo e idempotente: os modelos padrão fornecidos são ignorados e cada arquivo é importado apenas uma vez.','Import completed. %1$d imported, %2$d skipped.'=>'Importação concluída. %1$d importado, %2$d ignorado.','Import HTML'=>'Importar HTML','Import is disabled for notices in `definitive` or `closed` status. Move the notice back to `preliminary` (allowed only when zero calls have been issued) to re-import.'=>'A importação está desativada para editais com status "definitivo" ou "fechado". Mova o edital de volta para o status "preliminar" (permitido somente quando nenhum pedido de informação tiver sido feito) para reimportá-lo.','Import Legacy Certificate Templates'=>'Importar Modelos de Certificado Legados','Import Members'=>'Importar Membros','Import recruitment CSV'=>'Importar CSV de recrutamento','Import users as members of audience groups. Users will be created if they do not exist.'=>'Importar usuários como membros de grupos de público-alvo. Os usuários serão criados se não existirem.','import, export, delete.'=>'importar, exportar, excluir.','Important:'=>'Importante:','Imported %d legacy certificate template(s)'=>'%d modelo(s) de certificado legado(s) importado(s)','In Progress'=>'Em Andamento','In span mode, the end datetime must be after the start datetime.'=>'No modo de intervalo (span), a data e hora de término devem ser posteriores à data e hora de início.','In the fallback mode, a submission that arrives without a proof of work is recorded in the Activity Log with a hashed, truncated IP — so you can tell whether anyone still needs the fallback before switching it off.'=>'No modo de contingência (*fallback*), uma submissão que chega sem prova de trabalho é registrada no Log de Atividades com um IP truncado e convertido em hash — permitindo identificar se alguém ainda precisa desse recurso antes de desativá-lo.','In the trash (status = trashed)'=>'Na lixeira (status = lixeira)','In use'=>'Em uso','In wp-config.php, copy your current FFC_ENCRYPTION_KEY line and rename the copy to FFC_ENCRYPTION_KEY_PREVIOUS (keep its value).'=>'No arquivo wp-config.php, copie a linha atual FFC_ENCRYPTION_KEY e renomeie a cópia para FFC_ENCRYPTION_KEY_PREVIOUS (mantendo o valor original).','Inactive'=>'Inativo','Include .ics calendar file in emails'=>'Incluir arquivo .ics de calendário nos e-mails','Include {{receipt_button}} / {{cancel_button}} to show the receipt and cancel buttons (each empty when unavailable). Leave the whole body empty to use the global default from Settings → SMTP → Email texts.'=>'Inclua {{receipt_button}} / {{cancel_button}} para exibir os botões de comprovante e cancelamento (cada um vazio quando indisponível). Deixe o corpo inteiro vazio para usar o padrão global em Configurações → SMTP → Textos dos e-mails.','Includes user ID, IP address, and timestamp for LGPD compliance.'=>'Inclui ID do usuário, endereço IP e timestamp para conformidade com a LGPD.','Including children'=>'Incluindo filhos','Incorrect password.'=>'Senha incorreta.','Individual'=>'Individual','Individual Users'=>'Usuários Individuais','Info'=>'Informações','Info Block'=>'Bloco Informativo','Info block — display-only HTML, collects no value.'=>'Bloco de informações — HTML apenas para exibição; não coleta valores.','Information'=>'Informação','Ingesting…'=>'Injetando…','Inherit from global'=>'Herdar da classe global','Inherit — use Date Format above'=>'Herdar — usar o formato de data acima','Inherit — use Time Format above'=>'Herdar — usar o formato de hora acima','Inherited from %s'=>'Herdado de %s','Inherited from parent audience. Users can join this group from their dashboard.'=>'Herdado do público-alvo principal. Os usuários podem entrar neste grupo a partir do painel de controle.','Insert Image'=>'Inserir Imagem','Insert into layout'=>'Inserir no layout','Inspect the audit trail.'=>'Inspecione o histórico de auditoria.','install the sibling total-mail-queue plugin for queueing, retries and backoff. Because every plugin email goes through wp_mail(), it is captured automatically once activated.'=>'instale o plugin complementar total-mail-queue para gerenciar filas, tentativas de reenvio e a estratégia de *backoff*. Como todos os e-mails dos plugins passam pela função `wp_mail()`, eles são capturados automaticamente assim que o plugin é ativado.','Installed fonts probe'=>'Sonda de fontes instaladas','Institutional address and site name'=>'Endereço institucional e nome do site','Institutional address from Settings > General'=>'Endereço institucional em Configurações > Geral','Institutional Email'=>'E-mail Institucional','Institutional email'=>'E-mail Institucional','Insufficient permissions'=>'Permissões insuficientes','Integrations (read-only REST)'=>'Integrações (REST somente leitura)','Interface'=>'Interface','Invalid access hash.'=>'Hash de acesso inválido.','Invalid action.'=>'Ação inválida.','Invalid appointment ID.'=>'ID de agendamento inválido.','Invalid appointment receipt request.'=>'Solicitação de comprovante de agendamento inválida.','Invalid booking ID.'=>'ID de reserva inválido.','Invalid calendar.'=>'Calendário inválido.','Invalid cancellation link.'=>'Link de cancelamento inválido.','Invalid certificate id'=>'ID de certificado inválido','Invalid cleanup action'=>'Ação de limpeza inválida','Invalid code.'=>'Código inválido.','Invalid CPF'=>'CPF Inválido','Invalid CPF.'=>'CPF inválido.','Invalid CPF. Please check the number and try again.'=>'CPF inválido. Verifique o número e tente novamente.','Invalid data.'=>'Dados inválidos.','Invalid date format.'=>'Formato de data inválido.','Invalid department for the selected division.'=>'Departamento inválido para a divisão selecionada.','Invalid email address'=>'Endereço de e-mail inválido','Invalid email.'=>'E-mail inválido.','Invalid environment.'=>'Ambiente inválido.','Invalid field data format.'=>'Formato de dados do campo inválido.','Invalid field ID.'=>'ID de campo inválido.','Invalid file upload.'=>'Envio de arquivo inválido.','Invalid Form ID.'=>'ID do Formulário Inválido.','Invalid form.'=>'Formulário inválido.','Invalid format.'=>'Formato inválido.','Invalid IP address for geolocation.'=>'Endereço IP inválido para geolocalização.','Invalid migration key'=>'Chave de migração inválida','Invalid or already used ticket.'=>'Bilhete inválido ou já utilizado.','Invalid parameters'=>'Parâmetros inválidos','Invalid parameters.'=>'Parâmetros inválidos.','Invalid permission.'=>'Permissão inválida.','Invalid phone number.'=>'Número de telefone inválido.','Invalid post ID.'=>'ID da postagem inválido.','Invalid post.'=>'Postagem inválida.','Invalid preliminary status.'=>'Status preliminar inválido.','Invalid record.'=>'Registro inválido.','Invalid request type'=>'Tipo de solicitação inválido','Invalid request.'=>'Solicitação inválida.','Invalid response from ip-api.com'=>'Resposta inválida de ip-api.com','Invalid response from ipinfo.io'=>'Resposta inválida de ipinfo.io','Invalid RF'=>'RF Inválido','Invalid RF format.'=>'Formato de RF inválido.','Invalid RF. Must contain only numbers.'=>'Código RF inválido. Deve conter apenas números.','Invalid short URL.'=>'URL curta inválida.','Invalid submission.'=>'Envio inválido.','Invalid time format.'=>'Formato de horário inválido.','Invalid token.'=>'Token inválido.','Invalid URL.'=>'URL Inválida.','Invitation email'=>'E-mail de convite','Invitation, reminder & confirmation'=>'Convite, lembrete e confirmação','IP'=>'IP','IP Address'=>'Endereço IP','IP Address (backend validation)'=>'Endereço IP (validação de backend)','IP blocked.'=>'IP bloqueado.','IP Cache'=>'Cache de IP','IP cache + TTL'=>'Cache de IP + TTL','IP Cache Duration (TTL)'=>'Duração do cache IP (TTL)','IP Diagnostics'=>'Diagnóstico de IP','IP Geolocation'=>'Geolocalização de IP','IP Geolocation API'=>'API de geolocalização de IP','IP geolocation API'=>'API de geolocalização por IP','IP Geolocation API is disabled.'=>'A API de geolocalização por IP está desativada.','IP Geolocation Areas'=>'Áreas de Geolocalização de IP','IP Geolocation Debug'=>'Depuração de Geolocalização de IP','IP geolocation is disabled globally. Enable it in %s to allow IP-based validation here.'=>'A geolocalização por IP está desativada globalmente. Ative-a em %s para permitir a validação baseada em IP aqui.','IP Geolocation is enabled with independent areas but no IP areas are defined.'=>'A geolocalização por IP está ativada com áreas independentes, mas nenhuma área de IP foi definida.','IP Geolocation is enabled with independent areas but no locations are selected.'=>'A geolocalização por IP está ativada com áreas independentes, mas nenhuma localização foi selecionada.','IP geolocation is less precise (1-50km). Use larger radius (in meters).'=>'A geolocalização por IP é menos precisa (1-50 km). Use um raio maior (em metros).','IP Geolocation:'=>'Geolocalização por IP:','IP Locations'=>'Localizações de IP','IP Rate Limit'=>'Taxa Limite de IP','IP resolution settings saved.'=>'Configurações de resolução de IP salvas.','ip-api.com (Free, 45 req/min, no key)'=>'ip-api.com (Gratuito, 45 requisições/min, sem chave)','ip-api.com (free, ~45 requests/min, no key) or ipinfo.io (needs an API key).'=>'ip-api.com (gratuito, ~45 requisições/min, sem chave) ou ipinfo.io (requer uma chave de API).','IP:'=>'IP:','IP: %s'=>'IP: %s','iPhone / iPad: after the PDF opens, tap Share → "Save to Files" to keep it on your device.'=>'iPhone / iPad: depois de abrir o PDF, toque em Compartilhar → "Salvar em Arquivos" para mantê-lo no seu dispositivo.','ipinfo.io (50k/month free, requires key)'=>'ipinfo.io (50 mil/mês grátis, requer chave)','IPInfo.io API Key'=>'Chave da API IPInfo.io','IPs'=>'IPs','IPs listed in the global Whitelist below bypass the read limit'=>'Os endereços IP listados na lista branca global abaixo ignoram o limite de leitura.','Is it safe?'=>'É seguro?','is used in the template as'=>'é usado no modelo como','Isolated Calendar'=>'Calendário Isolado','issue a certificate. The JSON body carries form_id plus the form\'s fields; it reuses the same required-field / CPF-RF / e-mail validation and the same storage as the public form, so the result is byte-for-byte a normal submission. Gated by ffc_manage_certificates (admins pass via manage_options). Returns the submission id, the formatted authentication code and the PDF endpoint URL.'=>'emite um certificado. O corpo JSON contém o `form_id` e os campos do formulário; ele reutiliza a mesma lógica de validação (campos obrigatórios, CPF-RF, e-mail) e o mesmo sistema de armazenamento do formulário público, de modo que o resultado é, byte a byte, uma submissão padrão. A operação é restrita à permissão `ffc_manage_certificates` (administradores a possuem via `manage_options`). Retorna o ID da submissão, o código de autenticação formatado e a URL do endpoint do PDF.','Issue and cancel convocations.'=>'Emitir e cancelar convocações.','Issue calls'=>'Chamadas de problemas','Issue calls for the selected candidates?'=>'Quais são as exigências para os candidatos selecionados?','Issue certificates from any form'=>'Emita certificados a partir de qualquer formulário','Issue Date'=>'Data de Emissão','Issued on:'=>'Emitido em:','It is much more than certificates: the same foundation powers appointment scheduling, shared-space booking, reregistration campaigns, public-tender candidate queues and a click-tracking URL shortener — all under one roof, one design system and one email pipeline.'=>'É muito mais do que certificados: a mesma base sustenta o agendamento de horários, a reserva de espaços compartilhados, campanhas de recadastramento, filas de candidatos em concursos públicos e um encurtador de URLs com rastreamento de cliques — tudo centralizado, sob um único sistema de design e um único fluxo de e-mails.','It only surfaces the update; it never force-enables background auto-updates. If you want unattended updates, turn on WordPress\'s own per-plugin auto-update toggle.'=>'Isso apenas exibe a atualização; nunca ativa automaticamente as atualizações em segundo plano. Se você deseja atualizações sem intervenção manual, ative a opção de atualização automática por plugin do próprio WordPress.','Italic text:'=>'Texto em itálico:','Item moved to trash.'=>'Item movido para a lixeira.','Item permanently deleted.'=>'Item excluído permanentemente.','Item restored.'=>'Item restaurado.','January'=>'Janeiro','January 4, 2026 (Month Day, Year)'=>'Janeiro 4, 2026 (Mês, Dia, Ano)','JavaScript and HTTPS'=>'JavaScript e HTTPS','Job accumulation status'=>'Status de acumulação de tarefas','Join'=>'Participar','Join Groups'=>'Participar de Grupos','Join waitlist'=>'Entrar na lista de espera','Joined Date'=>'Data de Participação','July'=>'Julho','June'=>'Junho','Just click "Run Migration" once! The process will automatically continue processing batches of 100 records until complete. You can watch the progress bar update in real-time.'=>'Basta clicar em "Executar Migração" uma vez! O processo continuará automaticamente processando lotes de 100 registros até completar. Você pode acompanhar a barra de progresso em tempo real.','Justification for calling out of order (required)'=>'Justificativa para chamar alguém de fora de ordem (obrigatória)','Justification for calling out of order (required):'=>'Justificativa para a chamada fora de ordem (obrigatória):','Key / salt source'=>'Fonte de chave / salt','Key health & rotation is on the Advanced page'=>'As opções principais de saúde e rotação estão na página Avançado.','Kind'=>'Tipo','Label'=>'Rótulo','Label (optional)'=>'Rótulo (opcional)','Last page'=>'Última página','Last updated on %s.'=>'Última atualização em %s.','Last-mile hook on the composed message ( to / subject / body / headers / attachments ) just before send — after the global disable toggle, before the plain-text part is derived.'=>'Ponto de interrupção de última etapa (*hook*) na mensagem composta (destinatário, assunto, corpo, cabeçalhos, anexos) logo antes do envio — após a chave de desativação global e antes da geração da versão em texto simples.','Latitude'=>'Latitude','Latitude / Longitude'=>'Latitude / Longitude','Layout'=>'Layout','Layout broken in PDF'=>'Formatação quebrada no PDF','Learn more about total-mail-queue'=>'Saiba mais sobre a total-mail-queue','Learn more.'=>'Saiba mais','Leave'=>'Deixar','Leave all groups'=>'Sair de todos os grupos','Leave all unchecked to make this reason applicable to every preliminary status.'=>'Deixe todas as opções desmarcadas para que este motivo se aplique a todos os status preliminares.','Leave empty for 24/7 access. Default: 00:00 to 23:59'=>'Deixe vazio para acesso 24h. Padrão: 00:00 a 23:59','Leave empty for no date restriction. Format: YYYY-MM-DD'=>'Deixe em branco se não houver restrição de data.','Leave empty to inherit the global block message — currently %s.'=>'Deixe em branco para herdar a mensagem de bloco global — atualmente %s.','Leave empty to inherit the global default — currently %s (Settings → Advanced → Default Download Limit).'=>'Deixe em branco para herdar o valor padrão global — atualmente %s (Configurações → Avançado → Limite de Download Padrão).','Leave empty to inherit the global default — currently %s (Settings → Rate Limit → Device Fingerprint).'=>'Deixe em branco para herdar o padrão global — atualmente %s (Configurações → Limite de Taxa → Impressão Digital do Dispositivo).','Leave times empty to use default (08:00 - 18:00).'=>'Deixe os horários vazios para usar o padrão (08:00 - 18:00).','Leave Waitlist'=>'Sair da lista de espera','Left'=>'Esquerda','Legacy (current behaviour, spoofable) — the effective default until you switch'=>'Legado (comportamento atual, sujeito a falsificação) — o padrão vigente até que você faça a alteração.','Legacy Columns Dropped'=>'Colunas Legadas Removidas','Legacy →'=>'Legado →','Legally separated'=>'Separados legalmente','Length of the random code in short URLs (4-10 characters). Default: 6.'=>'Comprimento do código aleatório em URLs curtas (4 a 10 caracteres). Padrão: 6.','Lets a trusted operator without a WordPress login interact with this form via the [ffc_csv_download] shortcode. Three sub-features ride on the same hash credential: downloading the submissions CSV, opening the form ahead of its scheduled start (Start Form Early), and pushing the close time later (Postpone Close). Formerly named "Public CSV Download".'=>'Permite que um operador confiável, sem login no WordPress, interaja com o formulário através do shortcode [ffc_csv_download]. Três subfuncionalidades utilizam a mesma credencial hash: baixar o CSV das submissões, abrir o formulário antes do horário de início programado (Início Antecipado) e adiar o horário de fechamento (Adiar Fechamento).','Lets an authenticated operator override the Event Schedule for a single submission via the public CSV-download panel.'=>'Permite que um operador autenticado substitua a programação de eventos para um único envio por meio do painel público de download de CSV.','Level'=>'Nível','LGPD Consent Status'=>'Status de Consentimento da LGPD','Light'=>'Claro','Light on the network.'=>'Leve para a rede.','Lightweight read-only form metadata (id, title, fields).'=>'Metadados de formulário leves e somente leitura (ID, título, campos).','Limit form access to users within specific geographic areas.'=>'Limitar o acesso ao formulário a usuários dentro de áreas geográficas específicas.','Limit of %d entries reached — older entries roll off.'=>'Limite de %d entradas atingido — entradas mais antigas serão removidas.','Limit reached. Please wait {time}.'=>'Limite atingido. Aguarde {time}.','Limit submissions per physical device (cookie + browser fingerprint).'=>'Limitar envios por dispositivo físico (cookie + impressão digital do navegador).','Line %1$d: %2$s'=>'Linha %1$d: %2$s','Line break'=>'Quebra de linha','Link'=>'Vínculo','Link color'=>'Cor do link','Link manually to WP user'=>'Vinculo manual para usuário do WP','Link to /valid, custom text'=>'Link para /valid, texto personalizado','Link to /valid, text /valid'=>'Link para /valid, texto /valid','Link to /valid, text magic'=>'Link para /valid, texto magic link','Link to magic, custom text'=>'Link magico, texto personalizado','Link to magic, text /valid'=>'Link magico, texto /valid','Link to magic, text magic'=>'Link magico, texto link mágico','Link to page with certificate validation'=>'Link para a página com a validação do certificado.','Linked Emails:'=>'E-mails Vinculados:','Linked to a deleted user'=>'Vinculado a um usuário excluído','Linked User'=>'Usuário Vinculado','Linked WP user'=>'Usuário do WP vinculado','Linked WP user: @%s (preserved untouched on delete).'=>'Usuário do WordPress vinculado: @%s (preservado intacto após a exclusão).','List'=>'Lista','Lists (bullet or numbered)'=>'Listas (com marcadores ou numeradas)','Lists the user\'s previous certificate emissions.'=>'Lista as emissões de certificados anteriores do usuário.','Live Preview'=>'Visualização em Tempo Real','Load'=>'Carregar','Load "%s"? This will replace your current certificate HTML.'=>'Carregar "%s"? Isso substituirá o HTML atual do seu certificado.','Loading appointments...'=>'Carregando agendamentos...','Loading available slots...'=>'Carregando horários disponíveis...','Loading bookings...'=>'Carregando reservas...','Loading calendar...'=>'Carregando calendário...','Loading certificates...'=>'Carregando certificados...','Loading form...'=>'Carregando formulário...','Loading preview…'=>'Carregando pré-visualização…','Loading profile...'=>'Carregando perfil...','Loading reregistrations...'=>'Carregando recadastramentos...','Loading scheduled activities...'=>'Carregando atividades agendadas...','Loading template...'=>'Carregando modelo...','Loading...'=>'Carregando...','Loading…'=>'Carregando…','Location access was denied. On Safari/iOS, go to Settings > Privacy & Security > Location Services and ensure it is enabled for your browser.'=>'O acesso à localização foi negado. No Safari/iOS, acesse Ajustes > Privacidade e Segurança > Serviços de Localização e verifique se está ativado para o seu navegador.','Location blocked'=>'Localização bloqueada','Location information is unavailable.'=>'Informações de localização não estão disponíveis.','Location name'=>'Nome do local','Location name is required.'=>'É necessário nomear o local.','Location not found.'=>'Localização não encontrada.','Location permission denied. Please enable location services.'=>'Permissão de localização negada. Por favor, ative os serviços de localização.','Location request timed out.'=>'O tempo limite da solicitação de localização expirou.','Location request timed out. On Safari/iOS, ensure Location Services is enabled in Settings > Privacy & Security > Location Services.'=>'O tempo limite da solicitação de localização expirou. No Safari/iOS, verifique se os Serviços de Localização estão ativados em Ajustes > Privacidade e Segurança > Serviços de Localização.','Location unavailable (GPS off, no signal)'=>'Localização indisponível (GPS desligado, sem sinal)','Location verification failed.'=>'A verificação de localização falhou.','Log'=>'Registro','Log (with a hashed IP) when legacy and secure would disagree — measure the impact before switching.'=>'Registre (com IP hasheado) os casos de divergência entre o sistema legado e o seguro — avalie o impacto antes de realizar a mudança.','Log allowed requests'=>'Registrar solicitações permitidas','Log blocked requests'=>'Registrar solicitações bloqueadas','Log blocks'=>'Blocos de registro','Log categories'=>'Categorias de registro','Log Out'=>'Sair','Log Retention (days)'=>'Tempo de retenção de logs (dias)','Log, interface & statistics'=>'Registro, interface e estatísticas','Logged-in (own data).'=>'Conectado (dados próprios).','Logged-in administrators can access forms regardless of date/time configuration. A visual message will appear indicating bypass is active.'=>'Administradores com sessão iniciada podem acessar os formulários independentemente da configuração de data/hora. Uma mensagem visual será exibida indicando que a opção de ignorar está ativa.','Logged-in administrators can access forms regardless of GPS/IP geolocation configuration. A visual message will appear indicating bypass is active.'=>'Administradores com sessão iniciada podem acessar os formulários independentemente da configuração de geolocalização GPS/IP. Uma mensagem visual será exibida indicando que o recurso de bypass está ativo.','Logged-in users will be able to view all certificates generated for their own CPF/RF (Brazilian tax identification number).'=>'Usuários logados poderão visualizar todos os certificados gerados para seu próprio CPF/RF (número de identificação fiscal brasileiro).','Login'=>'Login','Login as User'=>'Entrar como Usuário','Logo image'=>'Imagem do Logotipo','Logo max width (px)'=>'Largura máxima do logotipo (px)','Logo with fixed width'=>'Logotipo com largura fixa','Logs'=>'Registros','Logs `[ffc_form]`, `[ffc_verification]`, and `[ffc_magic_link]` shortcode renders + the public verification flow.'=>'Os registros dos shortcodes `[ffc_form]`, `[ffc_verification]` e `[ffc_magic_link]` mostram o fluxo de verificação pública.','Logs activity log operations and database queries.'=>'Registra operações do registro de atividades e consultas ao banco de dados.','Logs admin submission edits, CPT handlers, and admin-side actions.'=>'Registra edições de envios administrativos, manipuladores de CPT e ações do lado do administrador.','Logs appointment booking, cancellation, cleanup, CSV export, and admin/CPT operations.'=>'Registra agendamentos, cancelamentos, limpeza de dados, exportação para CSV e operações administrativas/CPT.','Logs audience admin actions and user-audience join/leave operations.'=>'Registra as ações administrativas do público-alvo e as operações de entrada/saída de usuários do público-alvo.','Logs date/time restrictions, GPS validation, IP geolocation, and access denied events to the PHP error log, and emits geofence diagnostics to the browser console (F12) on the frontend.'=>'Registra restrições de data/hora, validação de GPS, geolocalização de IP e eventos de acesso negado no log de erros do PHP e emite diagnósticos de geocerca para o console do navegador (F12) no frontend.','Logs email preparation, SMTP connection, and sending status.'=>'Registra a preparação do e-mail, a conexão SMTP e o status do envio.','Logs encryption/decryption operations and key management.'=>'Registra operações de criptografia/descriptografia e gerenciamento de chaves.','Logs form data validation, processing steps, and submission creation.'=>'Registra validação de dados, etapas de processamento e criação de submissões.','Logs JSON data parsing, placeholder replacements, and PDF data preparation.'=>'Registra a análise de dados JSON, a substituição de marcadores de posição e a preparação de dados em PDF.','Logs migration execution, user linking, and data transformation operations.'=>'Execução de migração de logs, vinculação de usuários e operações de transformação de dados.','Logs REST API requests, responses, and errors.'=>'Registra solicitações, respostas e erros da API REST.','Logs service worker registrations + clipboard write permission to the visitor browser console. Useful for triaging cookie / nonce / Copy-button issues from a console screenshot. Off by default.'=>'Grava os registros do service worker e permissões de gravação no console do navegador do visitante. Útil para identificar problemas com cookies/nonce/botões de copiar a partir de uma captura de tela do console. Desativado por padrão.','Logs submission creation, data access, settings changes, and security events.'=>'Criação de registros de envio, acesso a dados, alterações de configurações e eventos de segurança.','Logs user creation failures, decryption errors, and critical user management operations.'=>'Registra falhas na criação de usuários, erros de descriptografia e operações críticas de gerenciamento de usuários.','Longitude'=>'Longitude','Look up candidates by CPF/RF, import them (CSV), and record call-ups and outcomes.'=>'Pesquise candidatos por CPF/RF, importe-os (CSV) e registre convocações e resultados.','Low (7% correction)'=>'Baixa (correção de 7%)','Low (7%)'=>'Baixo (7%)','low entropy; commonly identical across many devices of the same model/OS/browser, so matching these alone does not indicate the same device.'=>'baixa entropia; geralmente idêntica em muitos dispositivos do mesmo modelo/sistema operacional/navegador, de modo que a correspondência apenas desses elementos não indica que se trata do mesmo dispositivo.','Lower = more aggressive. Leave empty to inherit the global default — currently %s.'=>'Menor valor = mais agressivo. Deixe em branco para herdar o padrão global — atualmente %s.','Lunch In'=>'Refeição em','Lunch Out'=>'Retorno refeição','Magic (download) link with custom text and color — custom text may contain spaces'=>'Link "mágico" (para download) com texto e cor personalizados — o texto personalizado pode conter espaços.','Magic download link'=>'Link de download mágico','Magic Link Token'=>'Token de Link Mágico','Magic link vs. validation page.'=>'Link mágico vs. página de validação.','Main Address'=>'Endereço Principal','Main institutional address. Available as {{main_address}} placeholder in certificate and appointment templates.'=>'Endereço institucional principal. Disponível como marcador {{main_address}} em modelos de certificados e agendamentos.','Maintenance tool not available.'=>'Ferramenta de manutenção não disponível.','Maintenance Tools'=>'Ferramentas de Manutenção','Male'=>'Masculino','Manage'=>'Gerenciar','Manage adjutancies — the named units (with a color) attached to a notice to organize and filter its candidates.'=>'Gerenciar adjutâncias — as unidades nomeadas (com uma cor) associadas a um edital para organizar e filtrar seus candidatos.','Manage all templates'=>'Gerenciar todos os modelos','Manage Appointments'=>'Gerenciar Agendamentos','Manage Calendars'=>'Gerenciar Calendários','Manage calendars'=>'Gerenciar calendários','Manage certificate templates'=>'Gerenciar modelos de certificado','Manage certificates'=>'Gerenciar certificados','Manage database structure migrations to improve performance and data organization. These migrations move data from JSON storage to dedicated database columns for faster queries and better reliability.'=>'Gerencie migrações da estrutura do banco de dados para melhorar o desempenho e a organização dos dados. Essas migrações movem dados do armazenamento JSON para colunas dedicadas do banco de dados, proporcionando consultas mais rápidas e maior confiabilidade.','Manage email templates'=>'Gerenciar modelos de e-mail','Manage record templates'=>'Gerenciar modelos de ficha','Manage forms'=>'Gerenciar formulários','Manage named geofence locations. These locations can be assigned to forms for geolocation restrictions.'=>'Gerencie locais de geocerca nomeados. Esses locais podem ser atribuídos a formulários para restrições de geolocalização.','Manage reasons'=>'Gerenciar motivos','Manage receipt templates'=>'Gerenciar modelos de comprovante','Manage recruitment (umbrella)'=>'Gerenciar recrutamento (guarda-chuva)','Manage reregistration campaigns'=>'Gerenciar campanhas de recadastramento','Manage settings'=>'Gerenciar configurações','Manage short URLs'=>'Gerenciar URLs curtas','Manage SMTP / email settings'=>'Gerenciar configurações de SMTP / e-mail','Manage the reusable reason labels for the preliminary list (e.g. granted / denied / appeal), and which preliminary statuses each applies to.'=>'Gerencie os rótulos de motivo reutilizáveis para a lista preliminar (por exemplo: deferido / indeferido / recurso) e a quais status preliminares cada um se aplica.','Manage user custom fields'=>'Gerenciar campos personalizados do usuário','Manage which FFC features this user can access. These are granted per user, on top of the role permissions.'=>'Gerencie quais recursos do FFC este usuário pode acessar. Essas permissões são concedidas por usuário, além das permissões da função.','Manage which users have access to this calendar and what they can do. For private calendars, only listed users can see and book. For public calendars, these permissions control who can book and cancel.'=>'Gerencie quais usuários têm acesso a este calendário e o que eles podem fazer. Para calendários privados, somente os usuários listados podem visualizar e reservar. Para calendários públicos, essas permissões controlam quem pode reservar e cancelar.','Manager bypass'=>'Burlar do gerente','Managing Locations:'=>'Gerenciamento de Locais:','mandatory'=>'obrigatório','Mandatory Tags:'=>'Etiquetas Obrigatórias:','Manual — let the operator type both ends'=>'Manual — operador digita ambos os horários','Manually'=>'Manualmente','Manually-created links can be edited (destination URL + title) from the list. Links created for a post/page are not editable — their destination automatically follows the page: if you change the post slug (or the site permalink structure), the short URL keeps redirecting to the current permalink.'=>'Links criados manualmente podem ser editados (URL de destino + título) a partir da lista. Links criados para um post ou página não são editáveis — o destino deles acompanha automaticamente a página: se você alterar o *slug* do post (ou a estrutura de *permalinks* do site), a URL curta continuará redirecionando para o *permalink* atual.','March'=>'Março','Margins/padding'=>'Margens/preenchimento','Marital Status'=>'Estado Civil','Marital status'=>'Estado civil','Mark accepted'=>'Marcar como aceito','Mark hired'=>'Marcar como contratado','Mark not_shown'=>'Marcar como não compareceu','Mark withdrew'=>'Marcar desistiu','Married'=>'Casado(a)','Mask (cpf, phone, cep…)'=>'Máscara (CPF, telefone, CEP…)','master switch.'=>'interruptor geral.','Master toggle. When off, the form is always open (subject to other restrictions).'=>'Interruptor principal. Quando desativado, o formulário permanece sempre aberto (sujeito a outras restrições).','Match threshold'=>'Limite de correspondência','Match threshold (3-12)'=>'Limiar de correspondência (3-12)','Match threshold (N of 13)'=>'Limiar de correspondência (N de 13)','Math challenge only'=>'Apenas desafio de matemática','Math precision probes (CPU/SO-specific IEEE-754 quirks)'=>'Sondas de precisão matemática (peculiaridades IEEE-754 específicas da CPU/SO)','Max Attempts'=>'Tentativas Máximas','Max Bookings Per Slot'=>'Máximo de Agendamentos por Vaga','Max logs'=>'Máximo de Registros','Max per day'=>'Máximo por dia','Max per form'=>'Máximo por formulário','Max per hour'=>'Máximo por hora','Max per minute'=>'Máximo por minuto','Max per month'=>'Máximo por mês','Max per week'=>'Máximo por semana','Max per year'=>'Máximo por ano','Max retries per CPF/RF. 0 = unlimited.'=>'Máximo de tentativas por CPF/RF. 0 = ilimitado.','Max submissions per device'=>'Número máximo de envios por dispositivo','Max submissions per device/form'=>'Número máximo de envios por dispositivo/formulário','Max width (px)'=>'Largura máxima (px)','Maximum Advance Booking'=>'Antecedência Máxima de Agendamento','Maximum appointments per day (0 = unlimited)'=>'Máximo de agendamentos por dia (0 = ilimitado)','Maximum attempts'=>'Tentativas máximas','Maximum days in advance that non-admin users can book. Leave empty for no limit.'=>'Máximo de dias de antecedência que usuários não-admin podem reservar. Deixe vazio para sem limite.','Maximum number of blocks a single user may book in this custom calendar (0 = no limit). Waitlisted bookings count toward the limit.'=>'Número máximo de blocos que um único usuário pode reservar neste calendário personalizado (0 = sem limite). Reservas na lista de espera contam para o limite.','Maximum number of CSV downloads allowed via the public page. Current usage: %1$d of %2$d.'=>'Número máximo de downloads de CSV permitidos através da página pública. Uso atual: %1$d de %2$d.','Maximum number of people per time slot (1 = exclusive)'=>'Número máximo de pessoas por vaga (1 = exclusivo)','Maximum number of people who can wait per slot (0 = unlimited).'=>'Número máximo de pessoas que podem aguardar por horário (0 = ilimitado).','Maximum quiz attempts reached for this CPF/RF.'=>'Número máximo de tentativas do quiz atingido para este CPF/RF.','Maximum rows allowed for the synchronous (no-JS) public CSV download. Exports above this limit must use the JavaScript batched flow.'=>'Número máximo de linhas permitido para o download público síncrono (sem JavaScript) de CSV. Exportações acima desse limite devem usar o fluxo em lote com JavaScript.','May'=>'Maio','Meaning'=>'Significado','Media queries (color scheme, reduced motion, …)'=>'Consultas de mídia (esquema de cores, movimento reduzido, …)','Media URL (YouTube, Vimeo, image, or audio):'=>'URL da Mídia (YouTube, Vimeo, imagem ou áudio):','Medium (15% - recommended)'=>'Médio (15% - recomendado)','Medium (15% correction) - Recommended'=>'Médio (correção de 15%) - Recomendado','Member removed successfully.'=>'Membro removido com sucesso.','Member Since'=>'Membro Desde','Member Since:'=>'Membro Desde:','member(s) have overlapping bookings.'=>'Os membros têm reservas sobrepostas.','Members'=>'Membros','Members of %s'=>'Membros de %s','Members see a banner on their dashboard and fill in the form there.'=>'Os membros veem um banner em seu painel e preenchem o formulário ali mesmo.','Message'=>'Mensagem','Message shown to users after being redirected (appears on the dashboard page).'=>'Mensagem exibida aos usuários após o redirecionamento (aparece na página do painel de controle).','Message shown when form is accessed outside allowed date/time.'=>'Mensagem exibida quando o formulário é acessado fora da data/hora permitida.','Message shown when location detection fails (GPS denied, etc).'=>'Mensagem exibida quando a detecção de localização falha (GPS negado, etc).','Message shown when user is outside allowed geographic areas.'=>'Mensagem exibida quando o usuário está fora das áreas geográficas permitidas.','Messages shown when a calendar has business hours restrictions enabled (configured per calendar).'=>'Mensagens exibidas quando um calendário tem restrições de horário comercial ativadas (configuradas para cada calendário).','Migrated'=>'Migrado','Migration'=>'Migração','Migration already completed.'=>'Migração já concluída.','Migration Complete'=>'Migração Concluída','Migration Error: '=>'Erro de Migração:','Migration executed: %d records processed.'=>'Migração executada: %d registros processados.','Migration not found'=>'Migração não encontrada','Migration progress'=>'Progresso da migração','Migration system error:'=>'Erro no sistema de migração:','Migrations'=>'Migrações','Migrations are safe to run multiple times. Each migration processes up to 100 records at a time. Run again if needed until 100% complete.'=>'É seguro executar migrações várias vezes. Cada migração processa até 100 registros por vez. Execute novamente, se necessário, até que esteja 100% concluída.','Migrations cannot be undone, but they don\'t delete any data. If you experience issues, your original data remains in the JSON column and can be accessed.'=>'As migrações não podem ser desfeitas, mas não excluem nenhum dado. Se você tiver algum problema, seus dados originais permanecem na coluna JSON e podem ser acessados.','Migrations improve database performance by moving frequently queried data from JSON format to dedicated database columns. This makes searches and filtering much faster.'=>'As migrações melhoram o desempenho do banco de dados, movendo os dados consultados com frequência do formato JSON para colunas dedicadas. Isso torna as buscas e filtragens muito mais rápidas.','Migrations view file not found.'=>'Arquivo de visualização de migrações não encontrado.','Minimal fields (Tag):'=>'Campos mínimos (Tag):','Minimum Advance Booking'=>'Antecedência Mínima de Agendamento','Minimum Interval Between Bookings'=>'Intervalo Mínimo Entre Agendamentos','Minimum level'=>'Nível mínimo','Minimum log level'=>'Nível mínimo de registro','Minimum notice (hours) and how far ahead bookings are allowed (default 30 days).'=>'Antecedência mínima (em horas) e prazo máximo de antecedência para reservas (padrão: 30 dias).','Minimum notice required to cancel (e.g., 24 hours)'=>'Aviso mínimo necessário para cancelar (ex: 24 horas)','Minimum passing score'=>'Nota mínima para aprovação','Minimum percentage to pass. Set 0 for no minimum.'=>'Porcentagem mínima para aprovação. Defina 0 para sem mínimo.','Minimum strong signals (0-6)'=>'Sinais fortes mínimos (0-6)','Minimum time in advance required to book (0 = same day allowed)'=>'Tempo mínimo de antecedência para agendar (0 = mesmo dia permitido)','minus'=>'menos','minutes'=>'minutos','Missing form id.'=>'ID do formulário ausente.','Missing html/ file "%1$s" (%2$s)'=>'Arquivo html/ ausente "%1$s" (%2$s)','Missing keys'=>'Chaves perdidas','Missing location id.'=>'Identificação de localização ausente.','Missing migration key.'=>'Chave de migração ausente.','Missing required field: %s'=>'Campo obrigatório ausente: %s','Missing required fields.'=>'Campos obrigatórios ausentes.','Missing required parameters.'=>'Parâmetros obrigatórios faltando.','Missing setting key.'=>'Chave de configuração ausente.','Missing toggle key.'=>'Tecla de alternância ausente.','Mobile phone'=>'Celular','Mode'=>'Modo','Module'=>'Módulo','Module-wide options: convocation email, public-queue tuning, status colors, and the PII-reveal audit toggle.'=>'Opções de âmbito do módulo: e-mail de convocação, ajuste de fila pública, cores de status e a opção de auditoria para exibição de PII.','Modules'=>'Módulos','Modules settings view file not found.'=>'Arquivo de visualização das configurações dos módulos não encontrado.','Mon'=>'Seg','Monday'=>'Segunda-feira','Monospace'=>'Monoespaçado','Most recent first. Pulled from the activity log for events referencing this candidate or any of its classifications.'=>'Do mais recente para o mais antigo. Extraído do registro de atividades para eventos que fazem referência a este candidato ou a qualquer uma de suas classificações.','Move failed: source or target form is missing or invalid.'=>'Falha na movimentação: o formulário de origem ou de destino está ausente ou é inválido.','Move failed: the selected target form does not exist.'=>'Falha na movimentação: o formulário de destino selecionado não existe.','Move images referenced from the legacy html/ folder into the Media Library and update stored certificate layouts, backgrounds and template-pool bodies to point at the new attachments. Idempotent; missing files are reported as errors.'=>'Mova as imagens referenciadas na pasta legada `html/` para a Biblioteca de Mídia e atualize os layouts de certificado, planos de fundo e corpos de modelos armazenados para apontar para os novos anexos. Operação idempotente; arquivos ausentes são relatados como erros.','Move notice back to draft?'=>'Mudar o aviso de volta para rascunho?','Move submissions'=>'Mover submissões','Move submissions to another form'=>'Mova as submissões para outro formulário.','Move the form\'s close time later within the same day. One-shot per form.'=>'Alterar o horário de encerramento do formulário para mais tarde no mesmo dia. Uma única alteração por formulário.','Move to draft'=>'Mover para rascunho','Move to form…'=>'Mova para o formulário…','Move to preliminary'=>'Mova para a fase preliminar','Move to Trash'=>'Mover para a Lixeira','moves the start time to "now" so the form opens ahead of schedule (same day only).'=>'altera o horário de início para "agora", de modo que o formulário seja aberto antes do previsto (apenas no mesmo dia).','Multi-day'=>'Vários dias','Multi-line text input'=>'Entrada de texto em várias linhas','Multipart:'=>'Multiparte:','Multiple audiences'=>'Vários públicos-alvo','Multiple days'=>'Múltiplos Dias','Multiple submissions detected from this device. Please contact the organizer.'=>'Foram detectadas várias submissões a partir deste dispositivo. Por favor, entre em contato com o organizador.','Must be logged in:'=>'É necessário estar logado:','My Calls'=>'Minhas Convocações','My template'=>'Meu modelo','N/A'=>'N/D','Name'=>'Nome','Name (substring)'=>'Nome (substring)','Name for this template:'=>'Nome para este modelo:','Name of the scheduling calendar'=>'Nome do calendário de agendamento','Name only'=>'Somente o nome','Name to display as sender'=>'Nome a ser exibido como remetente','Name:'=>'Nome:','Named-location registry'=>'Registro de locais nomeados','name…'=>'nome…','Need Help?'=>'Precisar de ajuda?','Need More Help?'=>'Precisa de mais ajuda?','Need to cancel?'=>'Precisa cancelar?','Neighborhood'=>'Bairro','neither capability: the surface is hidden.'=>'nenhuma das duas capacidades: a superfície está oculta.','Network error'=>'Erro de rede','Network error. Check your connection.'=>'Erro de rede. Verifique sua conexão.','Network error. Please check your connection and try again.'=>'Erro de rede. Por favor, verifique sua conexão e tente novamente.','Network error:'=>'Erro de rede:','Never clicked'=>'Nunca clicado','Never clicked and created more than'=>'Nunca clicado e criado a mais de','Never enables actual data logging, only operation status.'=>'Nunca ativa o registro de dados reais, apenas o status de operação.','Never — do not send automatically'=>'Nunca — não enviar automaticamente','New adjutancy is the same as the current one.'=>'A nova matéria é a mesma que a atual.','New appointment booking'=>'Novo agendamento','New Appointment: %s'=>'Novo Agendamento: %s','New audience booking'=>'Agendamento de nova audiência','New Audience Calendar'=>'Novo Calendário de Público-alvo','New Booking'=>'Nova Reserva','New close time:'=>'Novo horário de encerramento:','New cpf/rf columns not found. Please re-activate the plugin to create them.'=>'Novas colunas cpf/rf não encontradas. Por favor, reative o plugin para criá-las.','New end:'=>'Nova saída:','New Form'=>'Novo Formulário','New form submission'=>'Novo envio de formulário','New install (no data yet): generate fresh secret keys and paste them into wp-config.php.'=>'Nova instalação (sem dados ainda): gere novas chaves secretas e cole-as no wp-config.php.','New Issuance: %s'=>'Nova Emissão: %s','New Password'=>'Nova Senha','New Personal Calendar'=>'Novo Calendário Pessoal','New Reregistration'=>'Novo Recadastramento','New scheduled activity'=>'Nova atividade agendada','New scheduled activity and activity-cancelled notices'=>'Novos avisos de atividade agendada e de cancelamento de atividade','New scheduled activity: {{schedule_name}}'=>'Nova atividade agendada: {{schedule_name}}','New start will be:'=>'O novo início será:','New start:'=>'Nova entrada:','New Template'=>'Novo Modelo','New-appointment admin notification'=>'Notificação ao administrador de novo agendamento','New-submission admin notification'=>'Notificação ao admin de novo envio','Next'=>'Próximo','Next Appointment'=>'Próximo agendamento','Next month'=>'Próximo mês','Next page'=>'Próxima página','nine'=>'nove','No'=>'Não','No %s found.'=>'Nenhum %s encontrado.','No access'=>'Sem acesso','No active bookings for this day.'=>'Nenhuma reserva ativa para este dia.','No activity logs found.'=>'Nenhum registro de atividades encontrado.','No adjutancies attached yet.'=>'Ainda não foram atribuídos a nenhuma matéria.','No appointments found'=>'Nenhum agendamento encontrado','No appointments to clean up.'=>'Nenhum agendamento para limpar.','No audience specified. Provide audience_id parameter or include audience_id/audience_name column in CSV.'=>'Nenhum público-alvo especificado. Forneça o parâmetro audience_id ou inclua a coluna audience_id/audience_name no CSV.','No audiences defined yet.'=>'Ainda não há público-alvo definido.','No audiences found.'=>'Nenhum público-alvo encontrado.','No available slots for this date'=>'Nenhum horário disponível para esta data','No bookings for this day.'=>'Nenhuma reserva para este dia.','No bookings found.'=>'Nenhuma reserva encontrada.','No calendars found.'=>'Nenhum calendário encontrado.','No candidates classified yet.'=>'Nenhum candidato classificado ainda.','No CDN was detected. Cloudflare is optional — the Auto/Direct mode plus device fingerprinting already protects you — but it gives an unspoofable client IP for free.'=>'Nenhuma CDN foi detectada. O Cloudflare é opcional — o modo Auto/Direct combinado com a identificação de dispositivo (*device fingerprinting*) já oferece proteção —, mas ele fornece gratuitamente um IP de cliente que não pode ser falsificado.','No certificates found'=>'Nenhum certificado encontrado','No classification visible at the moment.'=>'Sem classificação visível no momento.','No conflicts found. You may proceed.'=>'Nenhum conflito encontrado. Você pode prosseguir.','No consent recorded'=>'Nenhum consentimento registrado','No consent recorded:'=>'Nenhum consentimento registrado:','no CPF check.'=>'sem verificação de CPF.','No data is lost — you can publish again later.'=>'Nenhum dado será perdido — você poderá publicar novamente mais tarde.','No data provided in request body'=>'Nenhum dado fornecido no corpo da requisição','No definitive list exists yet. Choose how to populate it:'=>'Ainda não existe uma lista definitiva. Escolha como preenchê-la:','No download attempts have been logged yet.'=>'Nenhuma tentativa de download foi registrada ainda.','No events this month.'=>'Não há eventos neste mês.','No expired forms still have Public Operator Access enabled. Nothing to do.'=>'Nenhum formulário expirado ainda possui o Acesso Público de Operador ativado. Nada a fazer.','No extra registration is needed — the value the participant submits is substituted automatically. See'=>'Não é necessário nenhum cadastro adicional — o valor enviado pelo participante é substituído automaticamente. Veja','No FFC roles are registered.'=>'Não há funções do FFC registradas.','No FFC roles available.'=>'Não há funções disponíveis para o FFC.','No format validation'=>'Sem validação de formato','No forms found in Trash.'=>'Nenhum formulário encontrado na Lixeira.','No forms found.'=>'Nenhum formulário encontrado.','No forms scheduled for this day.'=>'Não há formulários agendados para esse dia.','No global holidays configured.'=>'Nenhum feriado global configurado.','No holidays defined yet.'=>'Nenhum feriado definido ainda.','No link problems found. Submissions and users look consistent.'=>'Nenhum problema com os links foi encontrado. Os envios e os usuários parecem consistentes.','No locations registered yet.'=>'Ainda não há locais cadastrados.','No magic token'=>'Sem ficha mágica','No matches for the current search.'=>'Nenhum resultado encontrado na pesquisa atual.','No matching short URLs found. Nothing to clean up.'=>'Nenhuma URL curta correspondente encontrada. Nada para limpar.','No members yet.'=>'Nenhum membro ainda.','No migration, fully backward compatible.'=>'Sem migração, totalmente compatível com versões anteriores.','No migrations available at this time.'=>'Nenhuma migração disponível no momento.','No new calls, status changes or cancellations can happen while closed.'=>'Não é possível realizar novas chamadas, alterações de status ou cancelamentos enquanto o serviço estiver fechado.','No notices in `draft` or `preliminary` status are available for CSV import. Create a notice (Notices tab) or move an existing one back to `preliminary` (allowed only when zero calls have been issued).'=>'Não há editais com status "rascunho" ou "preliminar" disponíveis para importação em CSV. Crie um edital (aba Editais) ou mova um existente de volta para o status "preliminar" (permitido somente quando nenhuma chamada tiver sido emitida).','No notices yet. The typical path to your first call is:'=>'Ainda não há editais. O caminho típico para sua primeira chamada é:','No obsolete shortcodes found. Nothing to clean up.'=>'Nenhum código curto obsoleto encontrado. Nada a limpar.','No personal calendars found in Trash.'=>'Nenhum calendário pessoal encontrado na Lixeira.','No personal calendars found.'=>'Nenhum calendário pessoal encontrado.','No pre-flight or rate-limit friction recorded in the last 30 days. Nice.'=>'Nenhum atrito pré-voo ou de limite de taxa registrada nos últimos 30 dias. Ótimo.','No profile data provided'=>'Nenhum dado de perfil fornecido.','No records available for export.'=>'Não há registros disponíveis para exportação.','No records found to export.'=>'Nenhum registro encontrado para exportar.','No reregistrations found.'=>'Nenhuma novo recadastramento encontrado.','No results found.'=>'Nenhum resultado encontrado.','No scheduled activities found'=>'Nenhuma atividade agendada encontrada','No short URLs found.'=>'Não foram encontradas URLs curtas.','No Show'=>'Não Compareceu','No strategy found for migration: %s'=>'Nenhuma estratégia encontrada para a migração: %s','No submission found for this user.'=>'Nenhuma submissão encontrada para este usuário.','No submission found.'=>'Nenhuma submissão encontrada.','No submission with this CPF was found for this form.'=>'Não foi encontrada nenhuma submissão com este CPF para este formulário.','No submissions found.'=>'Nenhuma submissão encontrada.','No submissions matched the selection.'=>'Nenhuma das candidaturas selecionadas correspondeu aos critérios.','No submissions selected.'=>'Nenhuma inscrição selecionada.','No templates found.'=>'Nenhum modelo encontrado.','no title'=>'sem título','No token'=>'Sem token','No token or licence key.'=>'Sem token ou chave de licença.','No transitions available from this state.'=>'Não há transições disponíveis a partir deste estado.','NO UNION'=>'SEM SINDICATO','No user linked to this submission.'=>'Nenhum usuário está vinculado a esta submissão.','No users found.'=>'Nenhum usuário encontrado.','No users have been granted access yet.'=>'Nenhum usuário recebeu acesso ainda.','No value to reveal.'=>'Nenhum valor a revelar.','No WP user found for that lookup. Try the numeric ID, exact login, or full email.'=>'Nenhum usuário do WordPress encontrado para essa pesquisa. Tente o ID numérico, o login exato ou o e-mail completo.','No writable fields were supplied for this candidate update.'=>'Não foram fornecidos campos editáveis para esta atualização de candidato.','No — only Form ID + Hash'=>'Não — apenas o ID do formulário + Hash','None'=>'Nenhum','none'=>'nenhum','None (no default)'=>'Nenhum (sem valor padrão)','None (not recommended)'=>'Nenhum (não recomendado)','None (top-level audience)'=>'Nenhum (público-alvo de nível superior)','None scheduled'=>'Nada agendado','Not detected'=>'Não detectado','Not found'=>'Não encontrado','Not passed. You can try again (%d attempts remaining).'=>'Não aprovado. Você pode tentar novamente (%d tentativas restantes).','Not passed. You can try again.'=>'Não aprovado. Você pode tentar novamente.','Not receiving email?'=>'Não está recebendo e-mails?','Note: If no restriction is selected, form is Open (no restrictions).'=>'Nota: Se nenhuma restrição for selecionada, o formulário ficará Aberto (sem restrições).','Note: if none of the three is selected, the public page renders the access screen but exposes no actions.'=>'Observação: se nenhuma das três opções for selecionada, a página pública exibirá a tela de acesso, mas não apresentará nenhuma ação.','Note: TLS-fingerprint (JA3/JA4) headers are Enterprise-only and out of scope for shared hosting.'=>'Nota: Os cabeçalhos de impressão digital TLS (JA3/JA4) estão disponíveis apenas para planos Enterprise e não se aplicam à hospedagem compartilhada.','Note: When this option is enabled, the email will only be sent when the user submits the form. This will add them to a waiting list and emails will be sent progressively.'=>'Observação: Quando esta opção estiver ativada, o e-mail será enviado somente quando o usuário enviar o formulário. Isso o adicionará a uma lista de espera e os e-mails serão enviados progressivamente.','Notes'=>'Notas','Notes (optional)'=>'Notas (opcional)','Notes:'=>'Notas:','Nothing'=>'Nada','Nothing leaves this server. The widget file is served from this site rather than a content delivery network, the challenge is issued by this WordPress installation, the computation happens in the visitor\'s browser, and the answer is checked here. Two privacy-relevant widget features are switched off and deliberately not offered as settings: the behavioural signature (pointer and keyboard timings) and the widget\'s own cookie. The proof of work already carries the anti-automation load, and turning either back on would change what the site has to disclose.'=>'Nada sai deste servidor. O arquivo do widget é servido a partir deste site, e não de uma rede de entrega de conteúdo (CDN); o desafio é emitido por esta instalação do WordPress, o processamento ocorre no navegador do visitante e a resposta é verificada aqui. Dois recursos do widget relevantes para a privacidade estão desativados e, deliberadamente, não são oferecidos como opções de configuração: a assinatura comportamental (intervalos de tempo do ponteiro e do teclado) e o cookie próprio do widget. A prova de trabalho já incorpora o mecanismo de defesa contra a automação, e reativar qualquer um desses recursos alteraria as informações que o site precisa divulgar.','Notice'=>'Edital','notice'=>'edital' . "\0" . 'editais','Notice closed.'=>'Edital encerrado.','Notice HTML (supports basic formatting and links)'=>'Aviso HTML (suporta formatação básica e links)','Notice lifecycle'=>'Ciclo de vida do edital','Notice not found.'=>'Edital não encontrado.','Notice status changed.'=>'O status do edital foi alterado.','Notice status — badge colors'=>'Status do aviso — cores do emblema','Notice update failed.'=>'A atualização do edital falhou.','Notices'=>'Editais','Notices using'=>'Editais usando','Notification Preferences'=>'Preferências de Notificação','Notifications'=>'Notificações','Notifies booked users when an admin deletes a calendar — text edited globally in the hub above.'=>'Notifica os usuários agendados quando um administrador exclui um calendário — texto editado globalmente no hub acima.','Notify Admin on Submission?'=>'Notificar o administrador da submissão?','Notify the candidate by email about this call'=>'Notifique o candidato por e-mail sobre esta chamada.','Notify, opt-in.'=>'Notificar, obter consentimento.','November'=>'Novembro','now'=>'agora','Now — pre-fill end time with the current moment'=>'Agora — preencher o horário de saída com o momento atual','NULL the plaintext context column on activity log rows that already store the JSON in context_encrypted.'=>'Defina como NULL a coluna de contexto em texto simples nas linhas do registro de atividades que já armazenam o JSON em context_encrypted.','Number'=>'Número','Numeric input'=>'Entrada numérica','Numeric submission ID'=>'ID de envio numérico','Object Cache (Redis)'=>'Cache de Objetos (Redis)','Object cache (Redis):'=>'Cache de objetos (Redis):','Obsolete Shortcode Cleanup'=>'Limpeza de códigos curtos obsoletos','Occupancy'=>'Ocupação','October'=>'Outubro','Off'=>'Desligado','OFF by default (same as WooCommerce, EDD, Yoast). With the toggle OFF, deleting the plugin from the Plugins page preserves every form, calendar, submission, audit log and configuration — so re-installing keeps the site exactly as it was. Turn ON only when you really want a clean removal.'=>'Desativado por padrão (assim como WooCommerce, EDD e Yoast). Com a opção DESATIVADA, excluir o plugin da página de Plugins preserva todos os formulários, calendários, envios, registros de auditoria e configurações — portanto, reinstalar mantém o site exatamente como estava. Ative somente quando realmente desejar uma remoção completa.','Off by default. One-shot — see Schedule.'=>'Desativado por padrão. Execução única — consulte Agendamento.','Off by default. When on, the public CSV-download panel shows an "Entry/exit exception" button to authenticated operators.'=>'Desligado por padrão. Quando ligado, o painel público de download de CSV mostra um botão "Entrada/saída diferenciada" para operadores autenticados.','Off: form is open on the start date only, between the start and end times. On: enables the end date and the per-day "Time Behavior" controls below.'=>'Desativado: o formulário fica aberto somente na data de início, entre os horários de início e término. Ativado: habilita a data de término e os controles de "Comportamento Temporal" diários abaixo.','Off: the form is open only on the start date, between the two times. On: it spans start → end date.'=>'Desativado: o formulário fica aberto apenas na data de início, entre os dois horários. Ativado: abrange o período da data de início até a data de término.','off; 100/minute, 1000/hour when on'=>'desligado; 100/minuto, 1000/hora quando ligado','off; 5/month, 50/year when on'=>'desativado; 5/mês, 50/ano quando ativado','Official Cloudflare setup guide'=>'Guia oficial de configuração da Cloudflare','OK'=>'OK','ok / weak / placeholder / missing, taken across the secrets that actually feed the key + salt.'=>'ok / fraco / espaço reservado / ausente, aplicado aos segredos que efetivamente alimentam a chave + salt.','Old Submissions Cleaned Up'=>'Submissões Antigas Limpas','Older signal rows are purged by the daily cleanup cron.'=>'As linhas de sinal mais antigas são eliminadas pelo cron de limpeza diária.','Older submissions do not have explicit consent flag but may have been collected under privacy policy.'=>'Os envios mais antigos não possuem um indicador de consentimento explícito, mas podem ter sido coletados de acordo com a política de privacidade.','on'=>'ativado','On (always dark)'=>'Ligado (sempre escuro)','on activation, on focus, on page load or on submit. Verifying on load spends the work before anyone decides to submit, and a challenge started too early can expire while the form is still being filled in.'=>'na ativação, no foco, no carregamento da página ou no envio. A verificação durante o carregamento consome processamento antes mesmo de alguém decidir enviar o formulário, e um desafio iniciado cedo demais pode expirar enquanto o formulário ainda está sendo preenchido.','On Android Chrome: Settings → Site Settings → Cookies → Allow.'=>'No Android Chrome: Configurações → Configurações do site → Cookies → Permitir.','On Android Chrome: tap the padlock in the address bar → Permissions → Location → Allow.'=>'No Android Chrome: toque no cadeado na barra de endereço → Permissões → Localização → Permitir.','On by default, but only unlocks after the form\'s end date has passed and while download quota remains.'=>'Ativado por padrão, mas só é desbloqueado após a data de término do formulário e enquanto houver cota de download disponível.','On custom calendars, the maximum number of distinct blocks one user may hold (max_blocks_per_user). Counts their active and waitlisted bookings; 0 = no limit. A read-only Occupancy Report meta box shows each block\'s live booked / capacity, occupancy % and waitlist length.'=>'Em calendários personalizados, define-se o número máximo de blocos distintos que um usuário pode manter (max_blocks_per_user). O cálculo inclui reservas ativas e na lista de espera; 0 = sem limite. Uma meta-caixa de Relatório de Ocupação (somente leitura) exibe, para cada bloco: reservas confirmadas/capacidade, percentual de ocupação e tamanho da lista de espera.','On desktop: click the padlock in the address bar → Site Settings → Location → Allow.'=>'No desktop: clique no cadeado da barra de endereço → Configurações do site → Localização → Permitir.','On desktop: open Settings → Privacy → Cookies and allow first-party cookies for this site.'=>'No desktop: abra Configurações → Privacidade → Cookies e permita cookies primários para este site.','On iOS: Settings → Safari → turn OFF "Block All Cookies".'=>'No iOS: Ajustes → Safari → desligue "Bloquear todos os cookies".','On iOS: tap the "AA" button in the address bar → Website Settings → Location → Allow.'=>'No iOS: toque no botão "AA" na barra de endereço → Configurações do Site → Localização → Permitir.','On waitlist'=>'Na lista de espera','On/off only'=>'Apenas ativar/desativar','one'=>'um','One CIDR or IP per line. Used only with the Custom mode above.'=>'Um CIDR ou IP por linha. Utilizado apenas com o modo Personalizado acima.','One configurable "Email Model" wraps every message, sent through a single SMTP-aware pipeline with a global kill-switch and multipart delivery.'=>'Um "Modelo de E-mail" configurável envolve todas as mensagens, que são enviadas por meio de um pipeline único compatível com SMTP, contando com um mecanismo global de interrupção de emergência (*kill-switch*) e entrega *multipart*.','One CPF per line. Only used when the mode above is set to "Whitelist". Formatting is ignored — only digits matter.'=>'Um CPF por linha. Usado somente quando o modo acima estiver definido como "Lista de permissões". A formatação é ignorada — apenas os dígitos importam.','One email at a time'=>'Um e-mail de cada vez','one form\'s metadata.'=>'os metadados de um formulário.','One or more selected rows would skip a higher-ranked candidate (out of order).'=>'Uma ou mais linhas selecionadas ignoram um candidato de classificação superior (fora de ordem).','One per line'=>'Um por linha','One per line...'=>'Um por linha...','One pool, several document kinds'=>'Um pool, vários tipos de documentos','One SHA-256 hex digest per line. Submissions whose ffc_device_id cookie hash matches one of these are exempt from the device limit.'=>'Um resumo hexadecimal SHA-256 por linha. Os envios cujo hash do cookie ffc_device_id corresponda a um destes estão isentos do limite de dispositivos.','One shared password everyone must type to submit.'=>'Uma senha compartilhada que todos devem digitar para enviar.','one {{tag}} per line; the form editor refuses to save a certificate layout that is missing any of them. {{auth_code}} is always required (and injected if absent) so every certificate stays verifiable.'=>'uma {{tag}} por linha; o editor de formulários não salva o layout do certificado se alguma delas estiver faltando. O {{auth_code}} é sempre obrigatório (e inserido automaticamente, caso ausente), garantindo que todo certificado permaneça verificável.','One-way — plan before you edit.'=>'Via de mão única — planeje antes de editar.','Only .csv files are accepted.'=>'Apenas arquivos .csv são aceitos.','Only approved CPF/RF can submit'=>'Somente CPF/RF aprovados podem enviar.','Only calls in `called` or `accepted` state can be cancelled.'=>'Somente chamadas nos estados `chamada` ou `aceita` podem ser canceladas.','Only candidates that are hired, withdrawn, or marked as no-show can be reset to waiting.'=>'Somente os candidatos contratados, desistentes ou marcados como ausentes podem ser redefinidos para a lista de espera.','Only enable in development or when troubleshooting issues.'=>'Ative somente durante o desenvolvimento ou ao solucionar problemas.','Only mandatory fields'=>'Somente campos obrigatórios','Only the listed CPF/RF numbers may submit (one per line; masked or unmasked both work).'=>'Apenas os números de CPF/RF listados podem realizar o envio (um por linha; aceitam-se formatos com ou sem máscara).','Open and save the submission edit screen.'=>'Abra e salve a tela de edição da submissão.','Open form'=>'Acesse formulário','Open in browser'=>'Abrir no navegador','Open participant form'=>'Abrir formulário do participante','Open profile'=>'Abrir perfil','Open the Activity Log filtered by cookie-wall hits'=>'Abra o registro de atividades filtrado por acessos de barreira de cookies.','Open the Activity Log filtered by GPS-denied hits'=>'Abra o registro de atividades filtrado por ocorrências de GPS negado.','Open the Activity Log filtered by GPS-prompt explainer renders'=>'Abra o Registro de Atividades filtrado por instruções de GPS.','Open the Audiences screen →'=>'Abra a tela Públicos-alvo →','Open the dashboard from another user\'s perspective.'=>'Abra o painel de controle a partir da perspectiva de outro usuário.','Open the new notice and attach the relevant adjutancies + import the candidate CSV.'=>'Abra o novo edital e anexe as matérias relevantes + importe o arquivo CSV de candidatos.','Open →'=>'Abrir →','Opening the participant form in a new tab…'=>'Abrindo o formulário de participante em uma nova aba…','Opens PDF in new tab'=>'Abre o PDF em uma nova aba','Operational / admin-side logging. Lower volume than the server group; safer to leave on for short periods to diagnose admin issues.'=>'Registro de atividades operacionais/administrativas. Volume de dados menor que o do grupo de servidores; mais seguro deixá-lo ativado por curtos períodos para diagnosticar problemas administrativos.','Operator'=>'Operador','Operator (masked)'=>'Operador (mascarado)','Operator API (authenticated issuance)'=>'API do Operador (emissão autenticada)','Operator Certificate Issued'=>'Certificado de Operador Emitido','Operator features'=>'Recursos do operador','Operator IP Bypass'=>'Bypass de IP pelo operador','Operator — Application Password + ffc_manage_certificates (the PDF route: that capability OR ownership of the certificate).'=>'Operador — Senha de Aplicativo + ffc_manage_certificates (o caminho do PDF: essa permissão OU a propriedade do certificado).','Opt in (off by default) to log where the legacy and secure IP strategies diverge, to validate a switch before flipping.'=>'Opte por ativar (desativado por padrão) o registro de onde as estratégias de IP legadas e seguras divergem, para validar uma mudança antes de efetivá-la.','Optional attribute:'=>'Atributo opcional:','Optional attributes:'=>'Atributos opcionais:','Optional hardening: your keys are healthy, but FFC derives its encryption key from the shared WordPress salts. Defining %s in wp-config.php decouples FFC so a future WordPress salt rotation cannot silently make your encrypted data unreadable. Advanced / optional — no action required.'=>'Reforço opcional: suas chaves estão em ordem, mas o FFC deriva sua chave de criptografia dos *salts* compartilhados do WordPress. Definir %s no wp-config.php desvincula o FFC, evitando que uma futura rotação dos *salts* do WordPress torne seus dados criptografados ilegíveis sem que você perceba. Recurso avançado/opcional — nenhuma ação é necessária.','Optional override for the PDF generator. "Inherit" reuses the Date Format above.'=>'Opção para sobrescrever o gerador de PDF. "Herdar" reutiliza o formato de data acima.','Optional override for the PDF generator. "Inherit" reuses the Time Format above.'=>'Opção para sobrescrever o gerador de PDF. "Herdar" reutiliza o formato de hora acima.','Optional. If the form requires a CPF, enter it here. If filled, it will be recorded (encrypted at rest) in the form\'s audit log even when the form does not require it.'=>'Opcional. Se um CPF for preenchido ele será registrado (criptografado) para auditoria do formulário.','Optional: put Cloudflare in front of this site'=>'Opcional: coloque o Cloudflare na frente deste site.','Optionally let administrators ignore the date/time restriction and/or the geolocation restriction, so they can test forms from anywhere at any time.'=>'Opcionalmente, permita que os administradores ignorem a restrição de data/hora e/ou a restrição de geolocalização, para que possam testar formulários de qualquer lugar e a qualquer momento.','Optionally notify one or more admin addresses on each submission (comma-separated; blank falls back to the site admin email).'=>'Opcionalmente, notifique um ou mais endereços de administrador a cada envio (separados por vírgula; se deixado em branco, utiliza-se o e-mail do administrador do site).','Options'=>'Opções','Options (one per line)'=>'Opções (uma por linha)','Options:'=>'Opções:','or'=>'ou','OR - Allow if GPS OR IP is valid (recommended)'=>'"OU" - Permitir se o GPS OU o IP for válido (recomendado)','Or inline style:'=>'Ou estilo embutido:','Or try manual verification'=>'Ou tente a verificação manual','Organization'=>'Organização','Organization logo URL from Settings > General > Branding (falls back to a shipped placeholder). Use inside an define( \'DISABLE_WP_CRON\', true ); to wp-config.php so page visits stop triggering WP-Cron.'=>'Recomendado: instale a linha do servidor abaixo e depois adicione define( \'DISABLE_WP_CRON\', true ); ao wp-config.php, para que as visitas deixem de disparar o WP-Cron.','Method'=>'Método','WP-CLI runs on the server itself and needs WP-CLI installed. The HTTP methods call the site over the network and work on any host.'=>'O WP-CLI roda no próprio servidor e precisa do WP-CLI instalado. Os métodos HTTP chamam o site pela rede e funcionam em qualquer hospedagem.','Every'=>'A cada','%d minutes'=>'%d minutos','Line to install'=>'Linha a instalar','Add it with "crontab -e" as the user that owns the WordPress files, or paste it into your hosting panel\'s cron section.'=>'Adicione com "crontab -e" como o usuário dono dos arquivos do WordPress, ou cole na seção de cron do painel da sua hospedagem.','Birthday'=>'Aniversário','Birthday message (default for new rules)'=>'Mensagem de aniversário (padrão para novas regras)','Choose a range of 1 to %d days, starting on or before its end.'=>'Escolha um intervalo de 1 a %d dias, com início igual ou anterior ao fim.','Could not record the run.'=>'Não foi possível registrar a execução.','Date Messages'=>'Mensagens por Data','Date messages'=>'Mensagens por data','Date messages (birthdays and other dates)'=>'Mensagens por data (aniversários e outras datas)','Date messages (such as birthday greetings)'=>'Mensagens por data (como felicitações de aniversário)','Date messages batch (one per batch)'=>'Lote de mensagens por data (um por lote)','Done. You will no longer receive date messages. You can turn them back on in your dashboard profile.'=>'Pronto. Você não receberá mais mensagens por data. É possível reativá-las no perfil do seu painel.','E-mails sent on a date in each person\'s profile, such as a birthday.'=>'E-mails enviados em uma data do perfil de cada pessoa, como o aniversário.','Everyone at %s wishes you a very happy birthday and a wonderful year ahead.'=>'Todos em %s desejam a você um feliz aniversário e um ano maravilhoso pela frente.','Give the rule a name.'=>'Dê um nome à regra.','Happy birthday!'=>'Feliz aniversário!','Happy birthday, {{first_name}}!'=>'Feliz aniversário, {{first_name}}!','Lists people by name with their birthday (day and month) in the recipient preview and the upcoming-dates panel.'=>'Lista as pessoas por nome com o aniversário (dia e mês) na prévia de destinatários e no painel de próximas datas.','Manage date messages'=>'Gerenciar mensagens por data','Maria'=>'Maria','Maria da Silva'=>'Maria da Silva','Prefer not to receive these messages? Unsubscribe.'=>'Prefere não receber estas mensagens? Cancelar inscrição.','Read-only access to the date-message rules, their send history and recipient totals.'=>'Acesso somente leitura às regras de mensagens por data, ao histórico de envios e aos totais de destinatários.','See who receives date messages'=>'Ver quem recebe mensagens por data','Stop receiving date messages, such as birthday greetings, at this account?'=>'Deixar de receber mensagens por data, como felicitações de aniversário, nesta conta?','The e-mail needs a subject and a body.'=>'O e-mail precisa de assunto e corpo.','The number of days must be a whole number between -%1$d and %1$d.'=>'O número de dias deve ser um inteiro entre -%1$d e %1$d.','This page expired. Open the link in the message again.'=>'Esta página expirou. Abra o link da mensagem novamente.','This unsubscribe link is not valid.'=>'Este link de cancelamento de inscrição não é válido.','Unknown date source.'=>'Fonte de data desconhecida.','Unknown digest mode.'=>'Modo de resumo desconhecido.','Unsubscribe'=>'Cancelar inscrição','View date messages'=>'Ver mensagens por data','"Sent" counts messages handed to wp_mail(); with a mail queue active, delivery happens afterwards from the queue.'=>'"Enviados" conta as mensagens entregues ao wp_mail(); com uma fila de e-mail ativa, a entrega acontece depois, a partir da fila.','(deleted rule)'=>'(regra excluída)','Activate'=>'Ativar','Active (the daily run sends it)'=>'Ativa (o envio diário a envia)','Active, not sending to people'=>'Ativa, sem envio às pessoas','Add rule'=>'Adicionar regra','Already sent'=>'Já enviado','Check before saving'=>'Confira antes de salvar','Choose a rule.'=>'Escolha uma regra.','Daily send time'=>'Horário do envio diário','Dates'=>'Datas','Dates in the profile'=>'Datas no perfil','Days from the date'=>'Dias em relação à data','Delete this rule? What it already sent stays in the history.'=>'Excluir esta regra? O que ela já enviou continua no histórico.','E-mail each person on their date'=>'Enviar e-mail a cada pessoa na sua data','Each rule sends its own message on a date in each person\'s profile, or a number of days before it. The daily run sends every active rule; the Send now tab sends one rule over dates you choose.'=>'Cada regra envia sua própria mensagem em uma data do perfil de cada pessoa, ou alguns dias antes dela. O envio diário envia todas as regras ativas; a aba Enviar agora envia uma regra para as datas que você escolher.','Edit rule'=>'Editar regra','Enter both dates.'=>'Informe as duas datas.','Everyone'=>'Todos','Failed'=>'Falharam','Finished'=>'Concluído','In the site timezone (%s), set in Settings → General.'=>'No fuso horário do site (%s), definido em Configurações → Geral.','Manual'=>'Manual','New rule'=>'Nova regra','Next daily run: %s.'=>'Próximo envio diário: %s.','No mail queue is active, so a large range is handed to wp_mail() as fast as PHP runs. Installing a mail queue plugin paces the sending.'=>'Nenhuma fila de e-mail está ativa, então um intervalo grande é entregue ao wp_mail() tão rápido quanto o PHP executa. Instalar um plugin de fila de e-mail dosa o envio.','No rules yet.'=>'Nenhuma regra ainda.','No valid e-mail'=>'Sem e-mail válido','Nobody falls on these dates.'=>'Ninguém tem data neste intervalo.','Nothing has been sent yet.'=>'Nada foi enviado ainda.','On the day'=>'No dia','Only the first rows are listed; the totals count everyone.'=>'Apenas as primeiras linhas são listadas; os totais contam todos.','Opted out'=>'Descadastrado','Placeholders:'=>'Marcadores:','Preview recipients'=>'Prévia dos destinatários','Replace the current message with the default text? Your changes will be lost.'=>'Substituir a mensagem atual pelo texto padrão? Suas alterações serão perdidas.','Restore default text'=>'Restaurar texto padrão','Rule'=>'Regra','Rule activated.'=>'Regra ativada.','Rule copied. The copy starts inactive.'=>'Regra copiada. A cópia começa inativa.','Rule deactivated.'=>'Regra desativada.','Rule deleted. Its history stays.'=>'Regra excluída. O histórico dela permanece.','Rule saved.'=>'Regra salva.','Rules'=>'Regras','Save rule'=>'Salvar regra','Send now'=>'Enviar agora','Send test to me'=>'Enviar teste para mim','Send these messages now?'=>'Enviar estas mensagens agora?','Sending'=>'Envio','Sending started. The first batch went out now; the rest continues in the background. Follow it in History.'=>'Envio iniciado. O primeiro lote saiu agora; o restante continua em segundo plano. Acompanhe em Histórico.','Sends one rule to everyone whose date falls in a range of up to %d days. People already sent this rule for that date are skipped, so running a range twice sends nothing new.'=>'Envia uma regra a todos cuja data cai em um intervalo de até %d dias. Quem já recebeu esta regra para aquela data é pulado, então repetir um intervalo não envia nada novo.','Sent'=>'Enviados','Started'=>'Início','Test message sent to %s.'=>'Mensagem de teste enviada para %s.','That rule no longer exists.'=>'Essa regra não existe mais.','The dates are the dates in the profile (such as birthdays), not the day the message goes out.'=>'As datas são as do perfil (como aniversários), não o dia em que a mensagem sai.','The header and footer come from the Email Model in Settings → SMTP. A message that does not place {{unsubscribe_url}} gets an unsubscribe line added at the end.'=>'O cabeçalho e o rodapé vêm do Modelo de E-mail em Configurações → SMTP. Uma mensagem sem {{unsubscribe_url}} recebe uma linha de descadastro no final.','The request failed. Reload the page and try again.'=>'A requisição falhou. Recarregue a página e tente novamente.','The rule could not be copied.'=>'Não foi possível copiar a regra.','The rule could not be deleted.'=>'Não foi possível excluir a regra.','The rule could not be saved.'=>'Não foi possível salvar a regra.','The test message was not sent. Check whether e-mails are disabled in the settings.'=>'A mensagem de teste não foi enviada. Verifique se os e-mails estão desativados nas configurações.','Trigger'=>'Origem','Uses the values on this form, saved or not. Nothing is sent and nothing is recorded.'=>'Usa os valores deste formulário, salvos ou não. Nada é enviado e nada é registrado.','Will receive'=>'Vai receber','You do not have permission to do this.'=>'Você não tem permissão para fazer isto.','You do not have permission to view this page.'=>'Você não tem permissão para ver esta página.','Your account has no valid e-mail address.'=>'Sua conta não tem um endereço de e-mail válido.','[TEST] %s'=>'[TESTE] %s','%d day after'=>'%d dia depois' . "\0" . '%d dias depois','%d day before'=>'%d dia antes' . "\0" . '%d dias antes','Birthdays in the period, by day and month; the year of birth is never shown.'=>'Aniversários no período, por dia e mês; o ano de nascimento nunca é exibido.','Counts and the names of who received it'=>'Totais e os nomes de quem recebeu','Counts only'=>'Apenas totais','Date messages manager summary (one per run)'=>'Resumo de mensagens por data para gestores (um por execução)','E-mail a summary of each run, 24 hours after it starts'=>'Enviar por e-mail um resumo de cada execução, 24 horas após o início','In'=>'Em','Manager summary'=>'Resumo para gestores','Names go only to recipients allowed to see who receives date messages; the others get the counts. A run that reached nobody sends no summary.'=>'Os nomes vão apenas para quem pode ver quem recebe mensagens por data; os demais recebem os totais. Uma execução que não alcançou ninguém não envia resumo.','Next 30 days'=>'Próximos 30 dias','Next 7 days'=>'Próximos 7 dias','No account can receive the summary: it goes to administrators and to accounts holding a date-messages permission.'=>'Nenhuma conta pode receber o resumo: ele vai para administradores e contas com permissão de mensagens por data.','Only the first names are listed; the counts above include everyone.'=>'Apenas os primeiros nomes são listados; os totais acima incluem todos.','Received the message'=>'Receberam a mensagem','Send the summary to'=>'Enviar o resumo para','Summary of the %1$s for the dates %2$s.'=>'Resumo do %1$s para as datas %2$s.','Upcoming dates'=>'Próximas datas','daily run'=>'envio diário','manual send'=>'envio manual','%d day'=>'%d dia' . "\0" . '%d dias','day and month, without the yearF j'=>'j \\d\\e F','Change it in Scheduled Tasks'=>'Alterar em Tarefas Agendadas','Every daily task of the plugin has its time chosen on that one screen, which also shows the server line that keeps scheduled tasks running.'=>'Todas as tarefas diárias do plugin têm o horário escolhido nessa única tela, que também mostra a linha do servidor que mantém as tarefas agendadas rodando.','Save times'=>'Salvar horários','The daily run is not scheduled.'=>'O envio diário não está agendado.','Time of day'=>'Horário','Times are in the site timezone (%s). Leave a time empty to keep the task where it is. A task becomes due at its time and runs when WP-Cron next fires, so with the server line below it runs within that line\'s interval.'=>'Os horários estão no fuso do site (%s). Deixe um horário vazio para manter a tarefa onde está. Uma tarefa fica devida no seu horário e roda quando o WP-Cron disparar em seguida; com a linha do servidor abaixo, ela roda dentro do intervalo dessa linha.','Times saved, except the ones that were not a valid time of day.'=>'Horários salvos, exceto os que não eram um horário válido.','Times saved. Changed tasks were moved to their new time.'=>'Horários salvos. As tarefas alteradas foram movidas para o novo horário.','Form cache warming (when "Pre-load cache daily" is on)'=>'Pré-carregamento do cache de formulários (quando "Pré-carregar cache diariamente" está ligado)','These fields arrived empty or with an invalid choice and kept their previous value: %s'=>'Estes campos chegaram vazios ou com uma opção inválida e mantiveram o valor anterior: %s','The birth-date migration has %d account left to examine. Until it runs, a birth date given before the profile field existed is not on the profile, so that person does not appear in previews or upcoming dates and receives no messages.'=>'A migração da data de nascimento ainda tem %d conta para examinar. Até ela rodar, uma data de nascimento informada antes de o campo existir no perfil não está no perfil, então essa pessoa não aparece nas prévias nem nas próximas datas e não recebe mensagens.' . "\0" . 'A migração da data de nascimento ainda tem %d contas para examinar. Até ela rodar, uma data de nascimento informada antes de o campo existir no perfil não está no perfil, então essas pessoas não aparecem nas prévias nem nas próximas datas e não recebem mensagens.','Write the display name, first name and last name of every account that has none of them, from the name its own candidacy or submission already carries. A promotion used to create the account without passing the person\'s name, so WordPress fell back to storing the login — which is what the user list, the dashboard greeting and every e-mail then showed them. Only an account whose display name is still its login and whose first name is empty is touched, because those two are written together and an account with one but not the other was changed by something else. Completion here means every such account was EXAMINED: one whose records name nobody is read, left alone, and counted as done.'=>'Grava o nome de exibição, o primeiro nome e o sobrenome de toda conta que não tem nenhum deles, a partir do nome que a própria candidatura ou submission dela já carrega. A promoção criava a conta sem passar o nome da pessoa, então o WordPress gravava o login no lugar — e era isso que a lista de usuários, a saudação do painel e todo e-mail mostravam a ela. Só é tocada a conta cujo nome de exibição ainda é o login e cujo primeiro nome está vazio, porque esses dois são gravados juntos e uma conta com um e sem o outro foi alterada por outra coisa. Aqui, concluído significa que toda conta dessas foi EXAMINADA: uma cujos registros não nomeiam ninguém é lida, deixada como está, e contada como feita.','Fill WordPress\'s first and last name from the full name the plugin stores — first word, then the rest — on accounts where the whole name sits in the first name, or neither is filled. Account creation used to store the whole name as the first name. Parts somebody filled in by hand are not touched. Completion here means every such account was EXAMINED: a one-word name is read, left as it is, and counted as done.'=>'Preenche o primeiro nome e o sobrenome do WordPress a partir do nome completo que o plugin guarda — a primeira palavra e depois o restante — nas contas em que o nome inteiro está no primeiro nome, ou nenhum dos dois está preenchido. A criação de contas gravava o nome inteiro como primeiro nome. Partes que alguém preencheu à mão não são tocadas. Aqui, concluído significa que toda conta dessas foi EXAMINADA: um nome de uma só palavra é lido, deixado como está, e contado como feito.','Split Full Names into First and Last Name'=>'Dividir nomes completos em primeiro nome e sobrenome','Every account whose name was stored whole has been examined.'=>'Toda conta cujo nome foi gravado inteiro já foi examinada.','Examined %1$d accounts and split the name of %2$d; the rest have a one-word name or none.'=>'%1$d contas examinadas e o nome de %2$d dividido; as demais têm um nome de uma só palavra ou nenhum.','da Silva'=>'da Silva','A designed code is drawn as SVG. Certificates embed it directly; short URL PNG downloads are rasterised by your browser so they match the preview.'=>'Um código com design é desenhado em SVG. Os certificados o incorporam diretamente; os downloads PNG das URLs curtas são rasterizados pelo seu navegador para ficarem iguais à prévia.','Apply the design to'=>'Aplicar o design em','Background colour'=>'Cor de fundo','Blend the modules diagonally into a second colour'=>'Mesclar os módulos na diagonal com uma segunda cor','Circle'=>'Círculo','Corner centre'=>'Centro dos cantos','Corner centre colour'=>'Cor do centro dos cantos','Corner frame'=>'Moldura dos cantos','Corner frame colour'=>'Cor da moldura dos cantos','Diamond'=>'Losango','Dots'=>'Pontos','Draw the short URL QR codes (preview and downloads) with this design'=>'Desenhar os QR Codes das URLs curtas (prévia e downloads) com este design','Draw the {{qr_code}} placeholder with this design'=>'Desenhar o placeholder {{qr_code}} com este design','Fluid'=>'Fluido','Gradient end colour'=>'Cor final do degradê','Leaf'=>'Folha','Low contrast (%s:1). Phones may fail to read this code; aim for 4:1 or more.'=>'Contraste baixo (%s:1). Celulares podem não ler este código; busque 4:1 ou mais.','Module colour'=>'Cor dos módulos','QR Code Design'=>'Design do QR Code','QR Code settings view file not found.'=>'Arquivo de visualização das configurações de QR Code não encontrado.','Readable: contrast and colours are fine.'=>'Legível: contraste e cores adequados.','Rounded'=>'Arredondado','Shapes and colours of the QR codes the plugin draws. Applies only where it is switched on below; elsewhere the plain black-and-white code is kept.'=>'Formas e cores dos QR Codes que o plugin desenha. Vale apenas onde estiver ativado abaixo; nos demais lugares o código simples em preto e branco é mantido.','Square'=>'Quadrado','The modules are lighter than the background. Most readers cannot scan an inverted code.'=>'Os módulos estão mais claros que o fundo. A maioria dos leitores não consegue ler um código invertido.','The preview could not be drawn.'=>'Não foi possível desenhar a prévia.','Settings → QR Code also sets the shape of the modules and of the three corner markers, their colours and an optional gradient, with a live preview that warns about low contrast and inverted colours. The design is applied only where it is switched on: the {{qr_code}} placeholder of certificates, and the QR codes of short URLs. Elsewhere the plain black-and-white code is kept.'=>'Configurações → QR Code também define o formato dos módulos e dos três marcadores de canto, suas cores e um degradê opcional, com uma prévia ao vivo que avisa sobre contraste baixo e cores invertidas. O design só é aplicado onde estiver ativado: no placeholder {{qr_code}} dos certificados e nos QR Codes das URLs curtas. Nos demais lugares o código simples em preto e branco é mantido.','Badge with caption above'=>'Selo com legenda acima','Banner below'=>'Faixa abaixo','Frame'=>'Moldura','Frame caption'=>'Legenda da moldura','Frame colour'=>'Cor da moldura','Logo'=>'Logotipo','PNG, JPEG, WebP or GIF up to 512 KB, drawn in the centre. A logo raises error correction to H so the covered modules can be rebuilt.'=>'PNG, JPEG, WebP ou GIF de até 512 KB, desenhado no centro. Um logotipo eleva a correção de erros para H, para que os módulos cobertos possam ser reconstruídos.','Speech bubble above'=>'Balão de fala acima','Up to 24 characters, e.g. "Scan to verify". The caption colour is picked to stay readable on the frame.'=>'Até 24 caracteres, por exemplo "Escaneie para verificar". A cor da legenda é escolhida para continuar legível sobre a moldura.','Could not create the short URL.'=>'Não foi possível criar a URL curta.','Dense code (version %d): print it at least 3 cm wide, or shorten the content.'=>'Código denso (versão %d): imprima com pelo menos 3 cm de largura ou encurte o conteúdo.','Design'=>'Design','Enter a valid e-mail address.'=>'Informe um endereço de e-mail válido.','Enter a valid phone number.'=>'Informe um número de telefone válido.','Enter the network name.'=>'Informe o nome da rede.','Enter the network password, or choose an open network.'=>'Informe a senha da rede ou escolha uma rede aberta.','Enter the text to encode.'=>'Informe o texto a codificar.','Error correction'=>'Correção de erros','Hidden network'=>'Rede oculta','Margin (modules)'=>'Margem (módulos)','Network name (SSID)'=>'Nome da rede (SSID)','Open network (no password)'=>'Rede aberta (sem senha)','Phone call'=>'Ligação telefônica','QR Code Generator'=>'Gerador de QR Code','SMS'=>'SMS','The QR code could not be drawn.'=>'Não foi possível desenhar o QR Code.','The network does not broadcast its name'=>'A rede não divulga o próprio nome','Type of content'=>'Tipo de conteúdo','Unknown QR code type.'=>'Tipo de QR Code desconhecido.','WPA / WPA2 / WPA3'=>'WPA / WPA2 / WPA3','Website'=>'Site','WhatsApp'=>'WhatsApp','Wi-Fi'=>'Wi-Fi','With the country code, so it works from anywhere.'=>'Com o código do país, para funcionar de qualquer lugar.','A calendar file (.ics) for any calendar app'=>'Um arquivo de agenda (.ics) para qualquer app de calendário','Choose a social network.'=>'Escolha uma rede social.','Contact card (vCard)'=>'Cartão de contato (vCard)','Country'=>'País','Enter a name or an organisation.'=>'Informe um nome ou uma organização.','Enter a valid date.'=>'Informe uma data válida.','Enter the event title.'=>'Informe o título do evento.','Enter the start and end times.'=>'Informe os horários de início e de fim.','Enter the user name (letters, digits, dots, dashes and underscores).'=>'Informe o nome de usuário (letras, números, pontos, hífens e sublinhados).','First name'=>'Nome','Google Calendar, already filled in'=>'O Google Agenda, já preenchido','In the site\'s time zone, on one day.'=>'No fuso horário do site, em um único dia.','Job title'=>'Cargo','Last name'=>'Sobrenome','Location'=>'Local','Mobile'=>'Celular','Network'=>'Rede','Note'=>'Observação','Organisation'=>'Organização','Scanning opens'=>'Ao escanear, abre','Social profile'=>'Perfil em rede social','The event itself (the phone offers to add it to its calendar)'=>'O próprio evento (o celular oferece adicioná-lo à agenda)','The event must end after it starts.'=>'O evento precisa terminar depois de começar.','The whole card travels inside the code: it works offline and nothing about the person is stored. Every field you fill makes the code denser.'=>'O cartão inteiro vai dentro do código: funciona offline e nada sobre a pessoa é armazenado. Cada campo preenchido deixa o código mais denso.','This event link is not valid.'=>'Este link de evento não é válido.','User name'=>'Nome de usuário','Work phone'=>'Telefone comercial','Enter a valid date for the link expiry.'=>'Informe uma data válida para a expiração do link.','The link cannot expire before the event.'=>'O link não pode expirar antes do evento.','This event link has expired.'=>'Este link de evento expirou.','Link valid until'=>'Link válido até','Calendar file only. Leave empty for a link that never expires -- a printed code keeps working. After this date the link answers that it has expired.'=>'Somente para o arquivo de calendário. Deixe vazio para um link que nunca expira — um código impresso continua funcionando. Depois desta data, o link responde que expirou.','Reset to default'=>'Restaurar padrão','Design reset to the global default.'=>'Design restaurado para o padrão global.','Pattern'=>'Padrão','The shape of the modules that carry the data.'=>'O formato dos módulos que levam os dados.','Corners'=>'Cantos','The three corner markers a reader locks onto first.'=>'Os três marcadores de canto que o leitor localiza primeiro.','Colours'=>'Cores','Module and background colours, and an optional gradient.'=>'Cores dos módulos e do fundo, e um degradê opcional.','An image in the centre of the code.'=>'Uma imagem no centro do código.','A printed frame with a short call to action.'=>'Uma moldura para impressão com uma chamada curta.','Quiet zone and error correction.'=>'Margem e correção de erros.','Format'=>'Formato','Size'=>'Tamanho','Download'=>'Baixar','The generator remembers your design when you download a code; "Reset to default" goes back to the global design from Settings → QR Code.'=>'O gerador lembra o seu design quando você baixa um código; "Restaurar padrão" volta ao design global de Configurações → QR Code.','Bands above and below'=>'Faixas em cima e embaixo','Circle with curved caption'=>'Círculo com legenda em arco','Corner brackets'=>'Cantoneiras','Cross'=>'Cruz','Cut corners'=>'Cantos chanfrados','Dotted'=>'Pontilhado','Draw no background, for placing the code on a coloured surface'=>'Não desenhar fundo, para aplicar o código sobre uma superfície colorida','Flower'=>'Flor','Globe'=>'Globo','Heart'=>'Coração','Icon (pill and outline frames)'=>'Ícone (molduras pílula e contorno)','One rounded corner'=>'Um canto arredondado','Outline with pointer and icon'=>'Contorno com seta e ícone','Pill with icon below'=>'Pílula com ícone embaixo','Scan'=>'Escanear','Star'=>'Estrela','The frame caption is hard to read on this background; pick a darker frame colour.'=>'A legenda da moldura fica difícil de ler neste fundo; escolha uma cor de moldura mais escura.','Transparent background'=>'Fundo transparente','Transparent background: contrast cannot be checked. Test the code on the surface it will be printed on; a dark one makes it unreadable.'=>'Fundo transparente: não é possível verificar o contraste. Teste o código na superfície onde ele será impresso; uma superfície escura o torna ilegível.','X'=>'X','Send date-based messages'=>'Envie mensagens por data','E-mail people on a date in their profile, such as a birthday, through the same e-mail pipeline, with one-click unsubscribe.'=>'Envie e-mails às pessoas em uma data do perfil delas, como o aniversário, pelo mesmo fluxo de e-mail, com cancelamento de inscrição em um clique.','or jump to any area (Scheduling, Reregistration, Recruitment, Short URLs, Date Messages, Developer).'=>'ou vá direto a qualquer área (Agendamento, Recadastramento, Recrutamento, URLs Curtas, Mensagens por Data, Desenvolvedor).','Colours of the certificate HTML editor on the form screen: Auto (follows Dark Mode), Light or Dark. New installs default to Dark.'=>'Cores do editor HTML do certificado na tela do formulário: Automático (segue o Modo Escuro), Claro ou Escuro. Instalações novas usam Escuro por padrão.','Off by default. When switched on, the daily cleanup permanently deletes published submissions older than the "Delete after (days)" window (default 365).'=>'Desativado por padrão. Quando ativado, a limpeza diária exclui permanentemente os envios publicados mais antigos que a janela "Excluir após (dias)" (padrão 365).','Off by default. When on, forms and the recruitment CSV import reject an RF whose check digit does not match. Before turning it on, run the identity audit on the Data Migrations tab to see how many stored RFs would fail.'=>'Desativado por padrão. Quando ativado, os formulários e a importação CSV do recrutamento recusam um RF cujo dígito verificador não confere. Antes de ativá-lo, execute a auditoria de identidades na aba Migrações de Dados para ver quantos RFs armazenados seriam recusados.','Branding logos'=>'Logotipos de branding','A government / institution logo and an organization logo, picked from the Media Library. They fill the {{logo_gov}} and {{logo_org}} placeholders in the default Record and appointment-receipt templates; a generic placeholder is used when empty.'=>'Um logotipo de governo/instituição e um logotipo da organização, escolhidos na Biblioteca de Mídia. Eles preenchem os marcadores {{logo_gov}} e {{logo_org}} nos modelos padrão de Ficha e de comprovante de agendamento; quando vazios, é usado um marcador genérico.','Hides the Date Messages menu and stops date-based e-mails such as birthdays. While it is on, nothing is sent until an administrator creates and activates a rule.'=>'Oculta o menu Mensagens por Data e interrompe os e-mails por data, como os de aniversário. Enquanto estiver ativado, nada é enviado até que um administrador crie e ative uma regra.','See Date Messages.'=>'Veja Mensagens por Data.','How many ALTCHA challenges one IP address may request per window is set on the Rate Limit tab, in the IP group (default 60 per 10 minutes; 0 removes the cap, which suits sites where many people share one address).'=>'Quantos desafios ALTCHA um endereço IP pode solicitar por janela é definido na aba Taxa Limite, no grupo IP (padrão 60 a cada 10 minutos; 0 remove o limite, o que convém a sites em que muitas pessoas compartilham um mesmo endereço).','See Rate Limit.'=>'Veja Taxa Limite.','Cloudflare:'=>'Cloudflare:','when Cloudflare is in front of the site, a Cloudflare Page Cache card reads the edge cache status of the front page. Cloudflare\'s default (static assets only) is safe; with "Cache Everything", APO or a Cache Rule that caches HTML, add a bypass for the form and dashboard URLs or for the wordpress_logged_in cookie.'=>'quando a Cloudflare está na frente do site, um cartão Cache de páginas da Cloudflare lê o status do cache de borda da página inicial. O padrão da Cloudflare (apenas arquivos estáticos) é seguro; com "Cache Everything", APO ou uma Cache Rule que armazene HTML, adicione uma exceção para as URLs dos formulários e do painel ou para o cookie wordpress_logged_in.','narrow the table by level and by action, or search the entries by text.'=>'filtre a tabela por nível e por ação, ou pesquise os registros por texto.','an activity summary for the last 30 days: the total, the counts by level and the most frequent actions.'=>'um resumo das atividades dos últimos 30 dias: o total, as contagens por nível e as ações mais frequentes.','The most rows the synchronous (no-JavaScript) public CSV download may return (default 2000). Larger exports must use the JavaScript batched flow, which runs in steps and survives shared-hosting timeouts.'=>'O número máximo de linhas que o download síncrono (sem JavaScript) do CSV público pode retornar (padrão 2000). Exportações maiores precisam usar o fluxo em lotes com JavaScript, que roda em etapas e resiste aos tempos limite de hospedagens compartilhadas.','Certificate editor'=>'Editor de certificado','The colour theme of the certificate HTML editor is on the General tab, next to Dark Mode.'=>'O tema de cores do editor HTML do certificado fica na aba Geral, ao lado do Modo Escuro.','See General.'=>'Veja Geral.','Defining a constant is effectively one-way: new writes use the new key the moment it is defined. On a site that already stores data, adopt the constants and then run the Encryption Key Rotation (Settings → Data Migrations) to re-encrypt existing records. Removing or blindly changing a constant on a live site makes existing records unreadable until the exact value is restored — it is never a blind edit.'=>'Definir uma constante é, na prática, um caminho sem volta: novas gravações usam a nova chave assim que ela é definida. Em um site que já armazena dados, adote as constantes e então execute a Rotação de Chaves de Criptografia (Configurações → Migrações de Dados) para recriptografar os registros existentes. Remover ou alterar uma constante às cegas em um site em produção torna os registros existentes ilegíveis até que o valor exato seja restaurado — nunca é uma edição às cegas.','ALTCHA challenges per IP:'=>'Desafios ALTCHA por IP:','the IP group also caps how many captcha challenges one address may request per window (default 60 per 600 seconds). 0 removes the cap — the honest choice where many people share one address, since any per-address number would cap the whole building.'=>'o grupo IP também limita quantos desafios de captcha um endereço pode solicitar por janela (padrão 60 a cada 600 segundos). 0 remove o limite — a escolha honesta quando muitas pessoas compartilham um mesmo endereço, já que qualquer número por endereço limitaria o prédio inteiro.','See Captcha.'=>'Veja Captcha.','Report-only scan (never changes data) of how people are linked to WordPress users. Over certificate submissions: a link to a deleted user, one user bound to multiple CPF/RF identities, an unlinked submission whose CPF matches a linked one, and a single CPF shared across users. Across submissions, appointments, recruitment candidacies and the identity index: one identifier held by two accounts, one account holding two identifiers, and identifiers the index does not carry yet. It also flags a stored CPF or RF whose own check digit does not match. Findings can be exported as CSV and are worked on the Identity Resolution screen.'=>'Varredura somente de relatório (nunca altera dados) de como as pessoas estão vinculadas a usuários do WordPress. Nos envios de certificado: vínculo com um usuário excluído, um usuário ligado a várias identidades CPF/RF, um envio sem vínculo cujo CPF coincide com um vinculado e um mesmo CPF compartilhado entre usuários. Entre envios, agendamentos, candidaturas de recrutamento e o índice de identidades: um identificador em duas contas, uma conta com dois identificadores e identificadores que o índice ainda não contém. Também aponta um CPF ou RF armazenado cujo próprio dígito verificador não confere. Os achados podem ser exportados em CSV e são tratados na tela Resolução de identidade.','Always run the preview first. Deletions (short URLs) are permanent; disabling Public Operator Access is reversible (re-enable on the form editor); the link audit only reports — resolve each finding on the Identity Resolution screen or by hand.'=>'Sempre execute a pré-visualização primeiro. Exclusões (URLs curtas) são permanentes; desativar o Acesso Público do Operador é reversível (reative no editor do formulário); a auditoria de vínculos só relata — resolva cada achado na tela Resolução de identidade ou manualmente.','See Identity Resolution.'=>'Veja Resolução de identidade.','See Data Migrations.'=>'Veja Migrações de Dados.','Check the form\'s Date & Time Restrictions (the "Time" tab of its restrictions) — the form may be outside its open/close window'=>'Verifique as Restrições de Data e Horário do formulário (a aba "Horário" das restrições) — o formulário pode estar fora da sua janela de abertura/encerramento','Reminders, cleanups or date messages run late or not at all'=>'Lembretes, limpezas ou mensagens por data atrasam ou não rodam','Open Settings → Scheduled Tasks and look for tasks marked late'=>'Abra Configurações → Tarefas Agendadas e procure tarefas marcadas como atrasadas','WP-Cron only runs when the site gets visits — install the server cron line that tab generates'=>'O WP-Cron só roda quando o site recebe visitas — instale a linha de cron do servidor que essa aba gera','Upgrade notice.'=>'Aviso de atualização.','View details.'=>'Ver detalhes.','The "View details" modal shows the plugin\'s banner and the tabs a WordPress.org plugin has: description, installation, FAQ, changelog and screenshots, taken from the offered release\'s readme. The screenshots load from GitHub when the modal opens; ratings and active installs are not shown, because only WordPress.org has them.'=>'A janela "Ver detalhes" mostra o banner do plugin e as abas que um plugin do WordPress.org tem: descrição, instalação, perguntas frequentes, registro de alterações e telas, tiradas do readme da versão oferecida. As telas são carregadas do GitHub quando a janela abre; avaliações e instalações ativas não aparecem, porque só o WordPress.org as tem.','Settings → Scheduled Tasks lists the background tasks the plugin runs through WP-Cron — cleanups, reminders, cache warming, date messages and the like — and helps you keep them running on time.'=>'Configurações → Tarefas Agendadas lista as tarefas em segundo plano que o plugin executa pelo WP-Cron — limpezas, lembretes, aquecimento de cache, mensagens por data e afins — e ajuda a mantê-las rodando no horário.','The task table'=>'A tabela de tarefas','Frequency, next run and last run'=>'Frequência, próxima execução e última execução','WordPress only records when a task is due, so the plugin records the last real run itself; it appears after a task first runs.'=>'O WordPress registra apenas quando uma tarefa vence, por isso o próprio plugin registra a última execução real; ela aparece depois que a tarefa roda pela primeira vez.','a recurring task whose last run is older than its interval allows is marked late, and a warning tops the page. A task whose module is turned off on the Modules tab still fires but does nothing.'=>'uma tarefa recorrente cuja última execução é mais antiga do que seu intervalo permite é marcada como atrasada, e um aviso aparece no topo da página. Uma tarefa cujo módulo está desativado na aba Módulos continua disparando, mas não faz nada.','each daily task can be given a time, in the site timezone. Leave it empty to keep the task where it is. Saving times needs the settings-management capability.'=>'cada tarefa diária pode receber um horário, no fuso horário do site. Deixe em branco para manter a tarefa onde está. Salvar horários exige a capacidade de gerenciar configurações.','tasks created per piece of work (one per submission, per reminder batch, per date-messages batch) and removed once they run. A number that keeps growing means WP-Cron is not running.'=>'tarefas criadas por unidade de trabalho (uma por envio, por lote de lembretes, por lote de mensagens por data) e removidas assim que rodam. Um número que só cresce indica que o WP-Cron não está rodando.','By default WP-Cron runs only when someone visits the site, so on a quiet site a daily task can run hours late. The tab generates a crontab line — WP-CLI (recommended, needs WP-CLI on the server), or HTTP with wget or curl (works on any host) — at an interval you pick. Add it with "crontab -e" as the user that owns the WordPress files, or paste it into your hosting panel.'=>'Por padrão, o WP-Cron só roda quando alguém visita o site, então em um site com pouco movimento uma tarefa diária pode atrasar horas. A aba gera uma linha de crontab — WP-CLI (recomendado, exige WP-CLI no servidor) ou HTTP com wget ou curl (funciona em qualquer hospedagem) — no intervalo que você escolher. Adicione-a com "crontab -e" como o usuário dono dos arquivos do WordPress, ou cole-a no painel da sua hospedagem.','The line does not decide when tasks run.'=>'A linha não decide quando as tarefas rodam.','WordPress keeps each task\'s schedule; the server line only makes sure due tasks run promptly, so a short interval is right. Once the line is installed you can add DISABLE_WP_CRON to wp-config.php so visits stop triggering WP-Cron — but with that constant set and no server line, no task runs at all.'=>'O WordPress mantém a agenda de cada tarefa; a linha do servidor só garante que as tarefas vencidas rodem prontamente, por isso um intervalo curto é o adequado. Depois de instalar a linha, você pode adicionar DISABLE_WP_CRON ao wp-config.php para que as visitas deixem de acionar o WP-Cron — mas com essa constante definida e sem a linha do servidor, nenhuma tarefa roda.','Settings → User Access keeps people who only need their own certificates, appointments and profile out of the WordPress admin, sending them to the front-end dashboard instead.'=>'Configurações → Acesso do Usuário mantém fora do painel administrativo do WordPress quem só precisa dos próprios certificados, agendamentos e perfil, levando essas pessoas ao painel do usuário no site.','See User Dashboard & Access.'=>'Veja Painel do Usuário e Acesso.','Off by default. When on, users of the blocked roles who open wp-admin are redirected. Front-end AJAX requests are never blocked, so forms and the dashboard keep working.'=>'Desativado por padrão. Quando ativado, usuários das funções bloqueadas que abrirem o wp-admin são redirecionados. Requisições AJAX do site nunca são bloqueadas, então os formulários e o painel continuam funcionando.','The roles to keep out; the FFC End User role is selected by default. A user is blocked only when every role they hold is in the list, so someone who is also an editor keeps wp-admin access.'=>'As funções a manter fora; a função FFC Usuário Final vem selecionada por padrão. Um usuário só é bloqueado quando todas as funções que ele tem estão na lista, então quem também é editor mantém o acesso ao wp-admin.','On by default: an administrator is never redirected, even when holding a blocked role.'=>'Ativado por padrão: um administrador nunca é redirecionado, mesmo tendo uma função bloqueada.','Where blocked users land — by default the site\'s /dashboard page.'=>'Para onde os usuários bloqueados vão — por padrão, a página /dashboard do site.','The notice shown on the dashboard page after a redirect.'=>'O aviso exibido na página do painel após um redirecionamento.','Off by default, which hides the WordPress admin bar on the front end for users whose roles are all blocked.'=>'Desativado por padrão, o que oculta a barra de administração do WordPress no site para usuários cujas funções estão todas bloqueadas.','The "FFC End User" role is assigned automatically to people who submit forms with a CPF or RF.'=>'A função "FFC Usuário Final" é atribuída automaticamente a quem envia formulários com CPF ou RF.','Settings → IP Diagnostics decides how the plugin works out a visitor\'s IP address. That one choice governs every IP read in the plugin: the activity log, IP geolocation, rate limiting, the geofence and the public listing throttle.'=>'Configurações → Diagnóstico de IP define como o plugin descobre o endereço IP de um visitante. Essa única escolha rege toda leitura de IP no plugin: o registro de atividades, a geolocalização por IP, a limitação de taxa, a cerca geográfica e o controle da listagem pública.','Legacy'=>'Legado','the effective default. It trusts client-supplied headers such as X-Forwarded-For, so a forged header can spoof the address.'=>'o padrão em vigor. Confia em cabeçalhos enviados pelo cliente, como X-Forwarded-For, então um cabeçalho forjado pode falsificar o endereço.','Secure (recommended)'=>'Segura (recomendada)','a trusted-proxy model: a forwarded header is honoured only when the request really comes from Cloudflare or a proxy you trust, so the real client is found and cannot be forged.'=>'um modelo de proxy confiável: um cabeçalho encaminhado só é aceito quando a requisição vem de fato da Cloudflare ou de um proxy em que você confia, de modo que o cliente real é encontrado e não pode ser forjado.','With the secure strategy, the trusted-proxy mode says whom to believe: Auto (detect Cloudflare or a known proxy, else use the direct connection — recommended), Cloudflare, Custom (your own proxy CIDRs, one per line — never Cloudflare\'s, which are kept up to date automatically) or Direct (ignore every forwarded header).'=>'Com a estratégia segura, o modo de proxy confiável diz em quem acreditar: Automático (detecta a Cloudflare ou um proxy conhecido, senão usa a conexão direta — recomendado), Cloudflare, Personalizado (os CIDRs do seu próprio proxy, um por linha — nunca os da Cloudflare, que são mantidos atualizados automaticamente) ou Direto (ignora todo cabeçalho encaminhado).','What the tab shows'=>'O que a aba mostra','how your own request would be resolved, the headers received, and what each strategy would do with a forged X-Forwarded-For. IPs are masked unless you are a full administrator.'=>'como a sua própria requisição seria resolvida, os cabeçalhos recebidos e o que cada estratégia faria com um X-Forwarded-For forjado. Os IPs ficam mascarados, a menos que você seja administrador completo.','Cloudflare ranges'=>'Intervalos da Cloudflare','the official Cloudflare IP lists, refreshed daily (a bundled list is used until the first refresh), with a button to refresh them now.'=>'as listas oficiais de IPs da Cloudflare, atualizadas diariamente (uma lista embutida é usada até a primeira atualização), com um botão para atualizá-las agora.','off by default. When on, it logs (with a hashed IP) every request where the two strategies would disagree, so you can measure the impact before switching.'=>'desativado por padrão. Quando ativado, registra (com IP em hash) cada requisição em que as duas estratégias divergiriam, para que você meça o impacto antes de trocar.','Why Legacy is still the default:'=>'Por que Legado ainda é o padrão:','switching changes which address rate limits and the geofence see, which can matter on shared hosting. The tab recommends Secure, and putting Cloudflare (free plan) in front of the site for an address that cannot be forged.'=>'trocar muda o endereço que a limitação de taxa e a cerca geográfica enxergam, o que pode pesar em hospedagens compartilhadas. A aba recomenda Segura e colocar a Cloudflare (plano gratuito) na frente do site, para ter um endereço que não pode ser forjado.','Settings → Data Migrations brings stored data in line with what newer versions of the plugin expect. Each migration is a card showing how many records are migrated and how many are still pending. Click "Run Migration" once: it keeps processing batches until the card reaches 100%, with a live progress bar. Running a migration needs the Danger Zone capability.'=>'Configurações → Migrações de Dados adequa os dados armazenados ao que as versões mais novas do plugin esperam. Cada migração é um cartão que mostra quantos registros já foram migrados e quantos ainda estão pendentes. Clique em "Executar Migração" uma vez: ela continua processando lotes até o cartão chegar a 100%, com uma barra de progresso ao vivo. Executar uma migração exige a capacidade da Zona de Perigo.','What the cards do'=>'O que os cartões fazem','Identifiers and search hashes'=>'Identificadores e hashes de busca','split the old combined CPF/RF column into separate CPF and RF columns, rewrite stored CPF, RF and e-mail values into one canonical form, rebuild the e-mail lookup hashes, and copy the CPF/RF hashes already linked to a user into the identity index.'=>'separam a antiga coluna combinada CPF/RF em colunas distintas de CPF e RF, reescrevem os valores armazenados de CPF, RF e e-mail em uma forma canônica única, recalculam os hashes de busca de e-mail e copiam para o índice de identidades os hashes de CPF/RF já vinculados a um usuário.','See Advanced → Encryption Key Health.'=>'Veja Avançado → Integridade da Chave de Criptografia.','Accounts and profiles'=>'Contas e perfis','grant the certificate capabilities to accounts that own a certificate but cannot open it, name accounts created without a name, split full names into WordPress\'s first and last name, and copy birth dates already given in reregistrations to the profile.'=>'concedem as capacidades de certificado às contas que possuem um certificado mas não conseguem abri-lo, dão nome às contas criadas sem nome, dividem o nome completo em nome e sobrenome do WordPress e copiam para o perfil as datas de nascimento já informadas em recadastramentos.','Legacy certificate templates'=>'Modelos de certificado legados','import layouts left in the old html/ drop-folder into the template pool and move the images they reference into the Media Library. These cards appear only while that folder exists.'=>'importam os layouts deixados na antiga pasta html/ para o acervo de modelos e movem as imagens que eles referenciam para a Biblioteca de Mídia. Esses cartões só aparecem enquanto essa pasta existir.','Safe to repeat, not to undo.'=>'Pode repetir, não pode desfazer.','A migration can be run again safely, and a finished one simply has nothing left to do. It cannot be undone, so take a database backup first and run the encryption cards during low traffic.'=>'Uma migração pode ser executada de novo com segurança, e uma já concluída simplesmente não tem mais nada a fazer. Ela não pode ser desfeita, então faça antes um backup do banco de dados e execute os cartões de criptografia em horário de pouco movimento.','The same tab hosts the maintenance tools and the identity audit.'=>'A mesma aba abriga as ferramentas de manutenção e a auditoria de identidades.','See Maintenance Tools.'=>'Veja Ferramentas de Manutenção.','Certificate → Identities lists accounts and stored CPF/RF numbers that do not agree with each other — the findings of the identity audit on the Data Migrations tab — sorted by how much of the answer is already known. Check digits can say a number is wrong, never what the right one is, so confirm corrections with HR. Identifiers are shown as a hash; a stored number is never displayed.'=>'Certificado → Identidades lista contas e números de CPF/RF armazenados que não concordam entre si — os achados da auditoria de identidades da aba Migrações de Dados — ordenados por quanto da resposta já se sabe. O dígito verificador pode dizer que um número está errado, nunca qual é o certo, por isso confirme as correções com o RH. Os identificadores aparecem como hash; um número armazenado nunca é exibido.','The panels'=>'Os painéis','a stored CPF or RF that fails its own check digit. Work these first: a number that cannot be anyone\'s is not evidence that two accounts are one person, so a merge or move that depends on it is refused.'=>'um CPF ou RF armazenado que não passa no próprio dígito verificador. Trate estes primeiro: um número que não pode ser de ninguém não prova que duas contas são a mesma pessoa, por isso uma mesclagem ou movimentação que dependa dele é recusada.','an account holding two values where the check digits show which one is wrong, so no value has to be asked for.'=>'uma conta com dois valores em que os dígitos verificadores mostram qual está errado, então não é preciso pedir nenhum valor.','one number stored against more than one account: either a duplicate login to merge, or one login carrying someone else\'s mistyped number.'=>'um número armazenado em mais de uma conta: ou um login duplicado a mesclar, ou um login com o número digitado errado de outra pessoa.','numbers that share one address without being variants of each other, such as a shared mailbox or an account submitting for other people. Each number shows the names recorded beside it, read from the submissions themselves, so the right person can be found for each one.'=>'números que compartilham um mesmo endereço sem serem variações uns dos outros, como uma caixa de correio compartilhada ou uma conta que envia por outras pessoas. Cada número mostra os nomes registrados junto a ele, lidos das próprias submissões, para que se encontre a pessoa certa de cada um.','the check digits do not single one value out, so HR has to say which number is this person\'s.'=>'os dígitos verificadores não apontam um único valor, então o RH precisa dizer qual número é o desta pessoa.','records carrying an identifier that belongs to no account, usually recruitment candidacies never promoted or records whose account was deleted.'=>'registros com um identificador que não pertence a nenhuma conta, geralmente candidaturas de recrutamento nunca promovidas ou registros cuja conta foi excluída.','replace a wrong stored number with the right one.'=>'substitua um número armazenado errado pelo correto.','Move or link'=>'Mover ou vincular','attach records to the account they belong to. The two sides must already agree on one identifier, and the screen says before you confirm whether the move would be accepted.'=>'associe registros à conta a que pertencem. Os dois lados já precisam concordar em um identificador, e a tela informa, antes da confirmação, se a movimentação seria aceita.','give records an account of their own, which creates a WordPress user.'=>'dê aos registros uma conta própria, o que cria um usuário do WordPress.','consolidate two logins that are one person. It cannot be undone: afterwards nothing can say which record came from which login.'=>'una dois logins que são a mesma pessoa. Não pode ser desfeito: depois, nada consegue dizer de qual login veio cada registro.','when the number was never supplied or HR cannot say whose it is, record that decision. The finding moves to "Accepted — no resolution possible", where it can be put back in the queue; nothing stored changes, and a merge or move blocked by that number stays blocked.'=>'quando o número nunca foi informado ou o RH não sabe dizer de quem é, registre essa decisão. O achado passa para "Aceitos — sem resolução possível", de onde pode ser devolvido à fila; nada armazenado muda, e uma mesclagem ou movimentação bloqueada por esse número continua bloqueada.','Every action runs as a single transaction, rolled back whole if any part refuses. The findings can be exported as CSV.'=>'Cada ação roda como uma única transação, desfeita por inteiro se qualquer parte recusar. Os achados podem ser exportados em CSV.','open the screen, correct numbers and move records. It does not reveal a stored identifier.'=>'abrir a tela, corrigir números e mover registros. Não revela um identificador armazenado.','open a new account from the queue.'=>'abrir uma nova conta a partir da fila.','merge two accounts.'=>'mesclar duas contas.','New wrong RFs keep arriving while the RF check digit setting is off.'=>'Novos RFs errados continuam chegando enquanto a configuração do dígito verificador do RF estiver desativada.','On the Geolocation tab of the form editor\'s "Certificate Form Configuration" box, choose the area source for GPS and IP validation:'=>'Na aba Geolocalização da caixa "Configuração do Formulário de Certificado" do editor de formulários, escolha a origem da área para a validação por GPS e por IP:','Turning a form into a quiz'=>'Transformando um formulário em quiz','minimum percentage to pass (default 70; 0 means no minimum).'=>'percentual mínimo para aprovação (padrão 70; 0 significa sem mínimo).','retries allowed per CPF/RF (0 = unlimited).'=>'tentativas permitidas por CPF/RF (0 = ilimitadas).','An attempt below the passing score is kept as a "Quiz: Retry" submission while attempts remain, and as "Quiz: Failed" once they run out; no certificate is issued for either.'=>'Uma tentativa abaixo da nota de aprovação é mantida como submissão "Quiz: Tentando" enquanto restarem tentativas, e como "Quiz: Reprovado" quando elas se esgotam; nenhum certificado é emitido em nenhum dos dois casos.','Validation page:'=>'Página de validação:','The public /valid page also finds a record by its authentication code or its magic link'=>'A página pública /valid também localiza uma ficha pelo código de autenticação ou pelo link mágico','Account email'=>'E-mail da conta','Authentication code — filled only once the submission is approved'=>'Código de autenticação — preenchido somente depois que a submissão é aprovada','Ready-made "Authentication: …" footer fragment, empty until the submission is approved'=>'Trecho de rodapé pronto "Autenticação: …", vazio até a submissão ser aprovada','Year the campaign started'=>'Ano de início da campanha','Branding logo URLs from Settings > General > Branding'=>'URLs dos logotipos definidas em Configurações > Geral > Identidade Visual','Division / Sector (see the dependent-select note below for each half)'=>'Divisão / Setor (veja a nota sobre seleção dependente abaixo para cada parte)','The certificate PDF a form issues on submission (the default kind). Three ready-made certificate models ship.'=>'O PDF do certificado que um formulário emite no envio (o tipo padrão). Três modelos de certificado prontos acompanham o plugin.','A read-only "Current assignments" overview on the Document Templates tab shows which pool template the appointment receipts (Regular and Custom) and the reregistration record are using right now, with a "Change →" link into that feature\'s own settings. Each row appears only to users who can view that feature, and certificates have no row because each form chooses its own. The overview is display-only — the selection controls (and their capabilities) stay per-feature.'=>'Uma visão geral somente leitura, "Atribuições atuais", na aba Modelos de documento, mostra qual modelo do acervo os comprovantes de agendamento (Regular e Personalizado) e a ficha de recadastramento estão usando no momento, com um link "Alterar →" para as configurações do próprio recurso. Cada linha aparece apenas para usuários que podem visualizar aquele recurso, e os certificados não têm linha porque cada formulário escolhe o seu. A visão geral é apenas informativa — os controles de seleção (e suas permissões) continuam em cada recurso.','A form\'s input fields are defined on the Fields tab ("Form Builder (Fields)") of the form editor\'s "Certificate Form Configuration" box — a sortable list of fields. Each field has a Variable Name (Tag); that tag is the machine key that becomes a {{token}} on the certificate PDF and in emails.'=>'Os campos de entrada de um formulário são definidos na aba Campos ("Construtor de Formulários (Campos)") da caixa "Configuração do Formulário de Certificado" do editor de formulários — uma lista ordenável de campos. Cada campo tem um Nome da variável (etiqueta); essa etiqueta é a chave interna que se torna um {{token}} no PDF do certificado e nos e-mails.','Name fields (keys such as name, nome, nome_completo, full_name or participante) are normalized on submit to proper capitalization, keeping Portuguese connectives such as "da" and "de" in lowercase.'=>'Campos de nome (chaves como name, nome, nome_completo, full_name ou participante) são normalizados no envio para a capitalização correta, mantendo em minúsculas conectivos como "da" e "de".','Each form has its own Email tab ("Email Configuration") in the form editor\'s "Certificate Form Configuration" box, controlling the message sent to the participant on submission, plus an optional admin notification.'=>'Cada formulário tem sua própria aba E-mail ("Configuração de E-mail") na caixa "Configuração do Formulário de Certificado" do editor de formulários, que controla a mensagem enviada ao participante no envio, além de uma notificação opcional ao administrador.','the subject is a plain text field and the body is edited in a visual editor. "Restore Default Text" restores the current global default, and an empty body also falls back to the default when the email is sent.'=>'o assunto é um campo de texto simples e o corpo é editado em um editor visual. "Restaurar Texto Padrão" restaura o padrão global atual, e um corpo vazio também volta ao padrão quando o e-mail é enviado.','Geofencing restricts where a form may be submitted. It is configured on the Geolocation tab of the form editor\'s "Certificate Form Configuration" box, and can validate by GPS position, by IP geolocation, or both.'=>'O georreferenciamento restringe os locais onde um formulário pode ser enviado. Ele é configurado na aba Geolocalização da caixa "Configuração do Formulário de Certificado" do editor de formulários e pode validar pela posição GPS, pela geolocalização por IP ou por ambos.','When both are enabled you choose whether the visitor must pass GPS AND IP, or either one (OR, the default). Blocked visitors see a configurable message, the title + description + message, or the form is hidden. A separate Error Message is shown when the location cannot be determined (e.g. GPS permission denied).'=>'Quando ambos estão habilitados, você escolhe se o visitante deve passar pela verificação de GPS E IP, ou por apenas um deles (OU, o padrão). Visitantes bloqueados veem uma mensagem configurável, o título + descrição + mensagem, ou têm o formulário ocultado. Uma Mensagem de Erro separada é exibida quando não é possível determinar a localização (ex.: permissão de GPS negada).','You pick where the allowed GPS area comes from; IP validation reuses the GPS areas unless "Use different areas for IP validation" is checked, in which case IP gets its own source:'=>'Você escolhe de onde vem a área permitida para o GPS; a validação por IP reutiliza as áreas do GPS, a menos que "Utilize áreas diferentes para validação por IP." esteja marcado, caso em que o IP tem sua própria origem:','Public Operator Access (formerly "Public CSV Download") lets a trusted operator who does NOT have a WordPress login interact with a single form through a secret, per-form link. It is enabled on the Operator tab ("Public Operator Access") of the form editor\'s "Certificate Form Configuration" box.'=>'O Acesso Público de Operador (anteriormente "Download de CSV Público") permite que um operador de confiança, que NÃO possui login no WordPress, interaja com um formulário específico por meio de um link secreto exclusivo para aquele formulário. O recurso é ativado na aba Operador ("Acesso Público de Operador") da caixa "Configuração do Formulário de Certificado" do editor de formulários.','The hash is the only credential — treat the link as a password. Set the base page under Settings → General ("CSV Download Page URL") so the editor shows the full link instead of just the query string. The hash is regenerated on demand ("Regenerate hash on save") and is deliberately NOT copied when a form is duplicated. A separate option resets the download counter to zero on save.'=>'O hash é a única credencial — trate o link como uma senha. Defina a página base em Configurações → Geral ("URL da página de download do arquivo CSV") para que o editor exiba o link completo, em vez de apenas a query string. O hash é regenerado sob demanda ("Regenerar hash ao salvar") e, deliberadamente, não é copiado quando um formulário é duplicado. Uma opção separada zera o contador de downloads ao salvar.','The CPF gate is checked again when the operator uses Start Form Early or Postpone Close.'=>'A exigência de CPF é verificada novamente quando o operador usa Início Antecipado ou Adiar Fechamento.','With "Enable Schedule Exception" switched on in the form\'s Time tab, the operator page shows an "Entry/exit exception" button. It records an individual entry/exit time for one participant, which replaces {{schedule}} on that participant\'s certificate. The "Default Modal Mode" setting chooses whether the dialog opens with the end time pre-filled with the current moment (Now) or lets the operator type both ends (Manual).'=>'Com "Habilitar exceção de horário" ativado na aba Horário do formulário, a página do operador exibe o botão "Entrada/saída diferenciada". Ele registra um horário de entrada/saída individual para um participante, que substitui {{schedule}} no certificado desse participante. A configuração "Modo padrão do modal" define se a janela abre com o horário de término preenchido com o momento atual (Agora) ou deixa o operador digitar os dois horários (Manual).','A form can accept submissions only inside a date/time window. The window is configured on the Time tab of the form editor\'s "Certificate Form Configuration" box. Outside the window the form is blocked with a configurable message (or hidden entirely). Administrators can be set to bypass date/time restrictions under Settings → Geolocation.'=>'Um formulário pode aceitar submissões apenas dentro de uma janela de data/horário. A janela é configurada na aba Horário da caixa "Configuração do Formulário de Certificado" do editor de formulários. Fora da janela, o formulário é bloqueado com uma mensagem configurável (ou totalmente ocultado). Os administradores podem ser configurados para ignorar as restrições de data/hora em Configurações → Geolocalização.','Before / during / after the window you can independently show a message, show the title + description + message, or hide the form. The "during" setting applies only in daily mode, outside that day\'s hours.'=>'Antes, durante ou após a janela, você pode, de forma independente, exibir uma mensagem, exibir título + descrição + mensagem, ou ocultar o formulário. A opção "durante" só se aplica ao modo diário, fora do horário do dia.','The "Event Schedule (Reference)" times on the same tab are printed on the certificate via the {{schedule}} and {{schedule_total}} tokens — they do not open or close the form. Once they are filled, the certificate layout must contain {{schedule}}. The tokens use a per-participant exception first, then the Event Schedule, then the window\'s start/end time. See'=>'Os horários do "Cronograma do Evento (Referência)" na mesma aba são impressos no certificado pelos tokens {{schedule}} e {{schedule_total}} — eles não abrem nem fecham o formulário. Depois de preenchidos, o layout do certificado precisa conter {{schedule}}. Os tokens usam primeiro uma exceção individual do participante, depois o Cronograma do Evento e, por fim, o horário de início/término da janela. Veja','moves the close time later on the scheduled close day, after the form has opened; the new time must stay within the same day.'=>'adia o horário de fechamento no dia previsto para o encerramento, depois que o formulário já abriu; o novo horário deve permanecer no mesmo dia.','The /valid page (the [ffc_verification] shortcode) also offers a manual lookup: anyone can type a certificate\'s authentication code to confirm it is genuine and view its status. The same lookup and the magic link also verify appointment receipts and reregistration records by their own codes and links. This path is protected by a nonce, a honeypot + the configured captcha, and IP rate-limiting.'=>'A página /valid (shortcode [ffc_verification]) também oferece uma consulta manual: qualquer pessoa pode digitar o código de autenticação de um certificado para confirmar que ele é autêntico e ver seu status. A mesma consulta e o link mágico também verificam comprovantes de agendamento e fichas de recadastramento pelos seus próprios códigos e links. Esse caminho é protegido por nonce, honeypot + o captcha configurado e limitação de taxa por IP.','The table shows the id, form, email, a short preview of non-sensitive fields, status and date. You can filter by one or more forms and switch between Published, Trash, and the quiz states (Retry, Failed). The search box matches a submission id, an auth code, or an exact email, CPF or RF. Personal columns are decrypted only for the row display; the preview never includes email, CPF/RF or the auth code.'=>'A tabela exibe o ID, o formulário, o e-mail, uma breve prévia de campos não sensíveis, o status e a data. É possível filtrar por um ou mais formulários e alternar entre Publicado, Lixeira e os estados do quiz (Tentando, Reprovado). A caixa de busca encontra um ID de submissão, um código de autenticação ou um e-mail, CPF ou RF exato. Colunas com dados pessoais são descriptografadas apenas para a exibição na linha; a prévia nunca inclui e-mail, CPF/RF ou código de autenticação.','The edit screen lets you correct the participant email and the form\'s custom-field values, and link, unlink or re-link the WordPress user. The LGPD consent status is shown for reference only. Identity and integrity fields are read-only: submission id, date, status, magic-link token, IP, CPF/RF and the auth code (so a certificate can never be silently re-pointed).'=>'A tela de edição permite corrigir o e-mail do participante e os valores dos campos personalizados do formulário, além de vincular, desvincular ou trocar o usuário do WordPress. O status de consentimento da LGPD é exibido apenas para consulta. Os campos de identidade e integridade são somente leitura: ID da submissão, data, status, token de link mágico, IP, CPF/RF e código de autenticação (garantindo que um certificado nunca possa ser redirecionado silenciosamente).','Export the current (filtered) submissions to CSV in the background. The export contains decrypted personal data (email, IP, CPF/RF), the magic-link token and the consent record, so it is gated by its own capability.'=>'Exporte as submissões atuais (filtradas) para CSV em segundo plano. A exportação contém dados pessoais descriptografados (e-mail, IP, CPF/RF), o token de link mágico e o registro de consentimento, por isso é controlada por uma permissão própria.','Trash / restore and bulk actions, including "Move to form…" (offered when the list is filtered to a single form).'=>'Enviar para a lixeira / restaurar e ações em massa, incluindo "Mova para o formulário…" (oferecida quando a lista está filtrada por um único formulário).','Reveal the decrypted CPF / RF / email on demand instead of the masked values; every reveal is audited. Without it the list and the edit screen stay masked, whatever else the operator holds. The certificate PDF is not masked: it prints CPF/RF formatted with punctuation.'=>'Revelar sob demanda o CPF / RF / e-mail descriptografados em vez dos valores mascarados; cada revelação é auditada. Sem ela, a lista e a tela de edição permanecem mascaradas, independentemente de outras permissões do operador. O PDF do certificado não é mascarado: ele imprime o CPF/RF formatado com pontuação.','Minimum interval between bookings'=>'Intervalo mínimo entre agendamentos','Stops a user from booking again within this many hours of their last booking (default 24; 0 disables it).'=>'Impede que um usuário agende novamente dentro desse número de horas após o seu último agendamento (padrão 24; 0 desativa).','Business-hours restrictions'=>'Restrições ao horário de funcionamento','Optionally limit viewing the calendar, or only booking on it, to the configured working hours.'=>'Opcionalmente, limita a visualização do calendário, ou apenas os agendamentos nele, ao horário de funcionamento configurado.','Admin bypass'=>'Bypass de administrador','Per calendar: whether holders of manage_options or ffc_bypass_appointments may book outside the advance window, on blocked dates, outside working hours and past the daily/interval limits. Turn it off to apply every rule to administrators too.'=>'Por calendário: define se quem possui manage_options ou ffc_bypass_appointments pode agendar fora da janela de antecedência, em datas bloqueadas, fora do horário de funcionamento e além dos limites diário e de intervalo. Desative para aplicar todas as regras também aos administradores.','Active, Inactive (no new bookings) or Archived.'=>'Ativo, Inativo (sem novos agendamentos) ou Arquivado.','Each calendar independently enables: user confirmation, admin notification, approval notice, cancellation notice and a reminder (default 24h before). When the waitlist is on, an "added to waitlist" notice and a "spot opened up" promotion notice are sent too. The user-facing ones are token-based and editable once in Settings → Email texts (the confirmation can also be overridden per calendar); the admin notification has a fixed body. Every one is wrapped in the shared Email Model chrome. A user who turns off "Appointment reminder" in their dashboard notification preferences does not receive the reminder.'=>'Cada calendário ativa de forma independente: confirmação ao usuário, notificação ao administrador, aviso de aprovação, aviso de cancelamento e um lembrete (padrão: 24h antes). Com a lista de espera ativa, também são enviados o aviso de "adicionado à lista de espera" e o aviso de promoção "vaga liberada". Os e-mails destinados ao usuário usam tokens e são editados uma única vez em Configurações → Textos dos e-mails (a confirmação também pode ser personalizada por calendário); a notificação ao administrador tem corpo fixo. Todos são envolvidos pelo layout compartilhado do Modelo de e-mail. Um usuário que desativa "Lembrete de agendamento" nas preferências de notificação do seu painel não recebe o lembrete.','view the calendars read-only, or create, edit, publish and delete them (structure, working hours and options).'=>'ver os calendários somente para leitura, ou criá-los, editá-los, publicá-los e excluí-los (estrutura, horário de funcionamento e opções).','view or manage the appointments booked on those calendars.'=>'ver ou gerenciar os agendamentos feitos nesses calendários.','Go to Scheduling → Audiences, edit an audience, and use its Reregistration Fields section'=>'Acesse Agendamento → Públicos-alvo, edite um público-alvo e use a seção Campos de Recadastramento','Viewing the field definitions needs ffc_view_custom_fields and editing them needs ffc_manage_custom_fields; without either, the section is hidden.'=>'Ver as definições dos campos exige ffc_view_custom_fields e editá-las exige ffc_manage_custom_fields; sem nenhuma das duas, a seção fica oculta.','Field definitions are stored in the ffc_custom_fields table. User data is stored as JSON in wp_usermeta under the key ffc_custom_fields_data; fields mapped to a profile key (such as CPF, RF, RG or birth date) are also written, encrypted, to the plugin user profile.'=>'As definições dos campos são armazenadas na tabela ffc_custom_fields. Os dados do usuário são armazenados como JSON em wp_usermeta, na chave ffc_custom_fields_data; os campos mapeados para uma chave de perfil (como CPF, RF, RG ou data de nascimento) também são gravados, criptografados, no perfil de usuário do plugin.','An audience is a named group of members, with a color, an active/inactive status and an optional 3-level parent hierarchy. Members are imported or self-join (when allowed): an audience can let users join or leave its child groups from their dashboard, with a cap on how many child groups one user may join, and its descendants inherit the setting. Audiences also carry the custom fields used by reregistration.'=>'Um público-alvo é um grupo nomeado de membros, com uma cor, um status ativo/inativo e uma hierarquia opcional de até 3 níveis. Os membros são importados ou entram por conta própria (quando permitido): um público-alvo pode permitir que os usuários entrem ou saiam dos seus grupos filhos pelo painel, com um limite de quantos grupos filhos um mesmo usuário pode integrar, e os seus descendentes herdam essa configuração. Os públicos-alvo também carregam os campos personalizados usados no recadastramento.','Admin pages'=>'Páginas administrativas','Besides the calendars, environments and audiences, the Scheduling menu has a Dashboard and an Audience Bookings list of every booking (exportable as CSV with ffc_export_audiences). Global holidays, set on the Scheduling → Settings → General tab, block bookings on those dates.'=>'Além dos calendários, ambientes e públicos-alvo, o menu Agendamento tem um Painel e a lista Agendamentos de Público-alvo, com todos os agendamentos (exportável em CSV com ffc_export_audiences). Os feriados globais, definidos na aba Agendamento → Configurações → Geral, bloqueiam agendamentos nessas datas.','The Scheduling → Settings → Import & Export tab imports and exports audiences (name, color, parent) and members (email, name, audience) as CSV, optionally creating WordPress users for imported members.'=>'A aba Agendamento → Configurações → Importar e Exportar importa e exporta públicos-alvo (nome, cor, pai) e membros (e-mail, nome, público-alvo) em CSV, criando opcionalmente usuários do WordPress para os membros importados.','A campaign shows the union of the custom fields of its linked audiences (standard identity/contact fields plus any custom ones). Each submission can be exported as a Record PDF. The standard birth-date field reads and writes the single encrypted birth date on the user profile, which Date Messages uses.'=>'Uma campanha exibe a união dos campos personalizados dos públicos-alvo vinculados (os campos padrão de identidade/contato e os personalizados). Cada envio pode ser exportado como PDF da Ficha. O campo padrão de data de nascimento lê e grava a data de nascimento única e criptografada do perfil do usuário, usada pelas Mensagens por Data.','create/edit campaigns, approve/reject, generate Records. Editing the field definitions needs ffc_manage_custom_fields.'=>'criar/editar campanhas, aprovar/rejeitar, gerar Fichas. Editar as definições dos campos exige ffc_manage_custom_fields.','Candidates are imported from CSV (headers: name, cpf, rf, email, adjutancy, rank, score, pcd, plus optional phone, time_points, hab_emebs) into either the preliminary or the definitive list. Call-ups are recorded per candidate; calling out of rank order requires a reason. Outcomes move a candidate through called → accepted / not_shown / hired / withdrew. Importing a candidate also links or creates their WordPress account (matched by CPF, RF or e-mail), which is what lets them follow their own call-ups.'=>'Os candidatos são importados de CSV (cabeçalhos: name, cpf, rf, email, adjutancy, rank, score, pcd, além dos opcionais phone, time_points, hab_emebs) para a lista preliminar ou para a definitiva. As convocações são registradas por candidato; convocar fora da ordem de classificação exige um motivo. Os resultados levam o candidato por called → accepted / not_shown / hired / withdrew. Importar um candidato também vincula ou cria a sua conta do WordPress (localizada por CPF, RF ou e-mail), o que permite que ele acompanhe as próprias convocações.','A capacity meter and density and contrast warnings help keep the code readable, and the preview panel can also print it. An event code can open the event itself, a pre-filled Google Calendar link, or a signed link to an .ics file; that link may carry an optional "valid until" date, after which it answers that it has expired, while a link without one never expires. The generator reopens with each user\'s last downloaded design (design only, never content), and "Reset to default" restores the global one.'=>'Um medidor de capacidade e avisos de densidade e de contraste ajudam a manter o código legível, e o painel de pré-visualização também permite imprimi-lo. Um código de evento pode abrir o próprio evento, um link pré-preenchido do Google Agenda ou um link assinado para um arquivo .ics; esse link pode ter uma data opcional de "válido até", após a qual informa que expirou, enquanto um link sem essa data nunca expira. O gerador reabre com o último design baixado por cada usuário (apenas o design, nunca o conteúdo), e "Restaurar padrão" volta ao design global.','Enable the shortener (Settings → Modules)'=>'Ativar o encurtador (Configurações → Módulos)','Their audience bookings, and the Recruitment tab with their call-ups, when they belong to an audience or are linked to a candidate'=>'Seus agendamentos de público-alvo e a aba Recrutamento com as suas convocações, quando pertence a um público-alvo ou está vinculado a um candidato','A Profile tab, read from the plugin\'s own user profile, where they edit their display name, phone, department, organization, notes and birth date (stored encrypted, and the date Date Messages uses)'=>'Uma aba Perfil, lida do perfil de usuário do próprio plugin, onde edita nome de exibição, telefone, departamento, organização, observações e data de nascimento (armazenada criptografada e usada pelas Mensagens por Data)','Notification Preferences: an "Appointment reminder" toggle and, when the Date Messages module is on, a "Date messages (such as birthday greetings)" toggle that opts them out; both are on until turned off'=>'Preferências de Notificação: uma chave "Lembrete de agendamento" e, quando o módulo Mensagens por Data está ativo, uma chave "Mensagens por data (como felicitações de aniversário)" que permite deixar de recebê-las; ambas ficam ativas até serem desligadas','Change Password, and Privacy & Data (LGPD) buttons to request an export or the deletion of their personal data'=>'Alterar a Senha e os botões de Privacidade e Dados (LGPD) para solicitar a exportação ou a exclusão dos seus dados pessoais','View as user:'=>'Ver como usuário:','holders of ffc_view_as_user can open the dashboard as another user, under a banner, from the users list or the user-edit screen ("Login as User").'=>'quem possui ffc_view_as_user pode abrir o painel como outro usuário, sob um aviso, a partir da lista de usuários ou da tela de edição do usuário ("Entrar como Usuário").','The identity/contact/address/employment fields live on the plugin\'s user profile and are mapped to the reregistration and audience data, so a user\'s details stay consistent across a certificate PDF, a record and their profile. WordPress\'s first and last name follow the plugin\'s full name (first word / the rest), and editing First/Last Name on the user-edit screen updates it back.'=>'Os campos de identidade/contato/endereço/vínculo ficam no perfil de usuário do plugin e são mapeados para os dados de recadastramento e de público-alvo, de modo que os dados do usuário permanecem consistentes entre o PDF do certificado, a ficha e o perfil. O nome e o sobrenome do WordPress acompanham o nome completo do plugin (primeira palavra / o restante), e editar Nome/Sobrenome na tela de edição do usuário atualiza o nome completo de volta.','A read-only index at the bottom of the tab lists the plugin\'s emails, grouped by feature, each with a one-line purpose, a personalisation state (Editable text / On-off only / System default) and an "Open →" deep-link to where it is configured. It is discoverability only — it moves no controls.'=>'Um índice somente leitura no fim da aba lista os e-mails do plugin, agrupados por recurso, cada um com uma linha de finalidade, um estado de personalização (Texto editável / Apenas ativar/desativar / Padrão do sistema) e um link "Abrir →" para onde é configurado. Ele serve apenas para descoberta — não move nenhum controle.','See Date Messages'=>'Ver Mensagens por Data','Birthday message — the default text a new rule starts from'=>'Mensagem de aniversário — o texto padrão com que uma nova regra começa','Date-message e-mails'=>'E-mails das mensagens por data','Each Date Messages rule sends its own subject and body to each person on their date, through the same pipeline and chrome. A body that does not place {{unsubscribe_url}} gets an unsubscribe line appended. A rule can also e-mail chosen managers a summary 24 hours after each run; that summary has a fixed body.'=>'Cada regra de Mensagens por Data envia o seu próprio assunto e corpo a cada pessoa na sua data, pelo mesmo fluxo e com o mesmo layout. Um corpo que não inclui {{unsubscribe_url}} recebe uma linha de cancelamento de inscrição ao final. Uma regra também pode enviar a gestores escolhidos um resumo 24 horas após cada execução; esse resumo tem corpo fixo.','Date-message tokens:'=>'Tokens das mensagens por data:','Date Messages sends an e-mail on a date stored in each person\'s profile — today, their birthday. It has its own top-level "Date Messages" menu with the Rules, Send now, History, Upcoming dates and Schedule tabs.'=>'Mensagens por Data envia um e-mail em uma data armazenada no perfil de cada pessoa — hoje, o aniversário. O módulo tem o seu próprio menu principal "Mensagens por Data", com as abas Regras, Enviar agora, Histórico, Próximas datas e Agendar.','On, but silent until you create a rule.'=>'Ativo, mas sem enviar nada até que você crie uma regra.','The module is enabled by default (Settings → Modules), but no rule ships with the plugin, so nothing is sent until an administrator creates a rule and activates it.'=>'O módulo vem ativado por padrão (Configurações → Módulos), mas o plugin não traz nenhuma regra pronta; portanto, nada é enviado até que um administrador crie uma regra e a ative.','Operator-facing label for the rule.'=>'Rótulo da regra exibido aos operadores.','Which date in the profile the rule follows (the birth date).'=>'Qual data do perfil a regra acompanha (a data de nascimento).','0 sends on the date itself; a negative number sends that many days before it, a positive one after it, up to two months either way.'=>'0 envia na própria data; um número negativo envia essa quantidade de dias antes dela, e um positivo, depois, até dois meses em qualquer direção.','Subject and message'=>'Assunto e mensagem','The e-mail body only; the header and footer come from the Email Model. A new rule starts from the "Birthday message" default in Settings → Email texts, and "Restore default text" brings it back.'=>'Apenas o corpo do e-mail; o cabeçalho e o rodapé vêm do Modelo de e-mail. Uma nova regra começa com o padrão "Mensagem de aniversário" de Configurações → Textos dos e-mails, e "Restaurar texto padrão" o traz de volta.','"E-mail each person on their date" and "Active (the daily run sends it)". A rule can stay active with personal e-mails off and send only the manager summary.'=>'"Enviar e-mail a cada pessoa na sua data" e "Ativa (o envio diário a envia)". Uma regra pode ficar ativa com os e-mails pessoais desligados e enviar apenas o resumo para gestores.','Optionally e-mails chosen managers a summary 24 hours after each run, with counts only or counts and the names of who received it. See below.'=>'Opcionalmente, envia a gestores escolhidos um resumo 24 horas após cada execução, apenas com os totais ou com os totais e os nomes de quem recebeu. Veja abaixo.','Rules can be edited, duplicated, activated or deactivated and deleted from the Rules tab. Deleting a rule keeps what it already sent in the history.'=>'As regras podem ser editadas, duplicadas, ativadas ou desativadas e excluídas na aba Regras. Excluir uma regra mantém no histórico o que ela já enviou.','Who receives a message'=>'Quem recebe uma mensagem','For each person whose date falls on the day, the first matching decision wins: outside the audience, opted out, no valid e-mail, already sent, otherwise will receive. Each person gets a rule\'s message once per occurrence of their date, however often the run repeats. People born on 29 February are reached on 28 February in a common year. The year of birth is never shown; {{age}} is computed from it.'=>'Para cada pessoa cuja data cai no dia, vale a primeira decisão aplicável: fora do público-alvo, cancelou o recebimento, sem e-mail válido, já enviado; caso contrário, receberá. Cada pessoa recebe a mensagem de uma regra uma vez por ocorrência da sua data, por mais que a execução se repita. Quem nasceu em 29 de fevereiro é contemplado em 28 de fevereiro nos anos não bissextos. O ano de nascimento nunca é exibido; {{age}} é calculado a partir dele.','Preview recipients and test send'=>'Prévia dos destinatários e envio de teste','Sends one rule to everyone whose date falls in a chosen range of up to 31 days, in batches handed to wp_mail(). People already sent that rule for that date are skipped, so running the same range twice sends nothing new. With no mail-queue plugin active, a large range is sent as fast as PHP runs.'=>'Envia uma regra a todos cuja data cai em um intervalo escolhido de até 31 dias, em lotes entregues ao wp_mail(). Quem já recebeu essa regra para aquela data é ignorado, então executar o mesmo intervalo duas vezes não envia nada novo. Sem um plugin de fila de e-mails ativo, um intervalo grande é enviado tão rápido quanto o PHP executa.','When enabled on a rule, the chosen managers receive a summary 24 hours after each run starts. Names go only to recipients allowed to see who receives date messages (ffc_view_date_messages_pii, or administrators); everyone else gets the counts. A run that reached nobody sends no summary. Only administrators and accounts holding a date-messages capability can be chosen.'=>'Quando ativado em uma regra, os gestores escolhidos recebem um resumo 24 horas após o início de cada execução. Os nomes vão apenas para os destinatários autorizados a ver quem recebe mensagens por data (ffc_view_date_messages_pii, ou administradores); os demais recebem os totais. Uma execução que não alcançou ninguém não envia resumo. Só podem ser escolhidos administradores e contas que possuam uma permissão de mensagens por data.','Daily schedule'=>'Agendamento diário','Opting out'=>'Cancelar o recebimento','On their dashboard, under Notification Preferences, a person can turn off "Date messages (such as birthday greetings)".'=>'No seu painel, em Preferências de Notificação, a pessoa pode desligar "Mensagens por data (como felicitações de aniversário)".','Every message carries a one-click unsubscribe link; a body that does not place {{unsubscribe_url}} gets an unsubscribe line appended. The link is a signed token that stores nothing; opening it shows a confirmation page, and only confirming turns date messages off, so mail scanners that follow links change nothing.'=>'Toda mensagem traz um link de cancelamento de inscrição com um clique; um corpo que não inclui {{unsubscribe_url}} recebe uma linha de cancelamento ao final. O link é um token assinado que não armazena nada; abri-lo mostra uma página de confirmação, e só a confirmação desliga as mensagens por data, de modo que os verificadores de e-mail que seguem links não alteram nada.','E-mail tokens'=>'Tokens de e-mail','The person\'s e-mail address'=>'O endereço de e-mail da pessoa','The date of this occurrence and the age reached on it'=>'A data desta ocorrência e a idade completada nela','Days between the send and the date'=>'Dias entre o envio e a data','Site name and the link to the user dashboard'=>'Nome do site e o link para o painel do usuário','The one-click unsubscribe link'=>'O link de cancelamento de inscrição com um clique','Messages go through the shared e-mail pipeline and Email Model chrome, and respect the global "Disable all emails" switch.'=>'As mensagens passam pelo fluxo de e-mail compartilhado e pelo layout do Modelo de e-mail, e respeitam a chave global "Desativar todos os e-mails".','read-only access to the rules, their send history and recipient totals.'=>'acesso somente leitura às regras, ao histórico de envios e aos totais de destinatários.','see people by name with their birthday (day and month) in the recipient preview, the upcoming dates and the manager summary.'=>'ver as pessoas pelo nome, com o aniversário (dia e mês), na prévia dos destinatários, nas próximas datas e no resumo para gestores.','Unique authentication code for validation, printed with the certificate prefix "C-"'=>'Código de autenticação único para validação, impresso com o prefixo de certificado "C-"','QR Code image.'=>'Imagem do QR Code.','See QR Code Options & Attributes.'=>'Veja Opções e Atributos do QR Code.','The single-use ticket code the participant entered (forms with the Ticket restriction only).'=>'O código de bilhete de uso único informado pelo participante (apenas em formulários com a restrição Ingresso).','Quiz forms:'=>'Formulários de questionário:','See Quiz / Evaluation.'=>'Veja Questionário / Avaliação.','{{name}} is filled from a form field whose key is "name"; first_name, last_name and full_name are not certificate tokens (they belong to the date-message emails).'=>'{{name}} é preenchido a partir de um campo do formulário cuja chave é "name"; first_name, last_name e full_name não são tokens de certificado (pertencem aos e-mails de mensagens de datas).','Set "notice" to the notice code. The list shows only the columns marked public in the notice editor. Draft notices show a "being prepared" message instead of data; preliminary, definitive and closed notices show the list (a closed notice with a "Notice closed" banner).'=>'Defina "notice" com o código do edital. A lista mostra apenas as colunas marcadas como públicas no editor do edital. Editais em rascunho exibem uma mensagem de "em preparação" no lugar dos dados; editais preliminares, definitivos e encerrados exibem a lista (um edital encerrado com o aviso "Edital encerrado").','Each submitter must present a single-use code from a generated pool. The code is claimed atomically (one use only) and removed from the pool as soon as the restriction check passes, before the submission is saved.'=>'Cada participante deve apresentar um código de uso único de um conjunto gerado. O código é resgatado de forma atômica (apenas uma utilização) e removido do conjunto assim que a verificação de restrições é aprovada, antes de o envio ser salvo.','E-mail, CPF, RF, the client IP and the submission\'s extra form data are stored encrypted with AES-256-CBC using encrypt-then-HMAC; a salted hash backs lookups. Display is masked unless the viewer holds a PII capability.'=>'E-mail, CPF, RF, o IP do cliente e os dados extras do formulário do envio são armazenados criptografados com AES-256-CBC usando encrypt-then-HMAC; um hash com salt sustenta as buscas. A exibição é mascarada, a menos que o usuário tenha uma capacidade de dados pessoais (PII).','Sensitive identifiers — e-mail, CPF and RF — are encrypted (AES-256-CBC with a per-record random IV and an encrypt-then-HMAC integrity check), never stored in the clear. Certificate submissions also encrypt the client IP and the extra form data.'=>'Identificadores sensíveis — e-mail, CPF e RF — são criptografados (AES-256-CBC com um IV aleatório por registro e uma verificação de integridade encrypt-then-HMAC), nunca armazenados em texto puro. Os envios de certificado também criptografam o IP do cliente e os dados extras do formulário.','On screen, CPF/RF and e-mail are masked unless the operator holds the matching PII capability. Revealing recruitment PII writes an activity-log entry (repeat reveals of the same field within a minute are not logged again, and a recruitment setting can switch this audit off).'=>'Na tela, CPF/RF e e-mail são mascarados, a menos que o operador tenha a capacidade de dados pessoais correspondente. Revelar dados pessoais do recrutamento grava uma entrada no registro de atividades (revelações repetidas do mesmo campo dentro de um minuto não são registradas de novo, e uma configuração do recrutamento pode desativar essa auditoria).','A logo from the Media Library can be drawn in the centre (error correction is raised to H automatically), and a frame (banner, badge, bubble, pill, speech, circle, brackets or double) can carry a short caption such as "Scan to verify", optionally with an icon. A frame makes the image taller than wide; certificates keep the width the placeholder asks for and grow in height.'=>'Um logotipo da Biblioteca de Mídia pode ser desenhado no centro (a correção de erros é elevada para H automaticamente), e uma moldura (banner, badge, bubble, pill, speech, circle, brackets ou double) pode trazer uma legenda curta como "Escaneie para verificar", opcionalmente com um ícone. Uma moldura deixa a imagem mais alta do que larga; os certificados mantêm a largura pedida pelo placeholder e crescem em altura.','With the design applied to certificates, the {{qr_code}} placeholder is drawn as an SVG and is not cached; without it, a PNG is generated and may be served from the QR Code cache.'=>'Com o design aplicado aos certificados, o placeholder {{qr_code}} é desenhado como SVG e não é armazenado em cache; sem ele, é gerado um PNG que pode ser servido pelo cache de QR Code.','When the submission has no magic token, "m" falls back to the /valid page. The generated link carries the class ffc-validation-link.'=>'Quando o envio não tem token mágico, "m" volta para a página /valid. O link gerado recebe a classe ffc-validation-link.','Inline styling, a horizontal rule, and legacy font color/size/face'=>'Estilo em linha, uma linha horizontal e cor/tamanho/fonte legados de font','The template is filtered on save.'=>'O modelo é filtrado ao salvar.','Image scaled to exactly these dimensions (it is stretched, not cropped, when the proportions differ)'=>'Imagem redimensionada exatamente para essas dimensões (é esticada, não recortada, quando as proporções diferem)','Helper classes:'=>'Classes auxiliares:','The PDF stylesheet ships alignment helpers for the certificate body:'=>'A folha de estilos do PDF inclui auxiliares de alinhamento para o corpo do certificado:','Use them on a paragraph, div, span, heading, list or table.'=>'Use-as em um parágrafo, div, span, título, lista ou tabela.','Whether validate_rf() also requires the RF check digit, rejecting a mistyped number at the form instead of storing it. Off by default; normally set from Settings → General, and the filter overrides that setting — args ( enforce ).'=>'Define se validate_rf() também exige o dígito verificador do RF, recusando no formulário um número digitado errado em vez de armazená-lo. Desativado por padrão; normalmente definido em Configurações → Geral, e o filtro sobrepõe essa configuração — argumentos ( enforce ).','The token map used to build the certificate HTML — args ( data, submission_id, submission_row ).'=>'O mapa de tokens usado para montar o HTML do certificado — argumentos ( data, submission_id, submission_row ).','The certificate PDF filename — args ( filename, form_title, auth_code, submission_id ).'=>'O nome do arquivo PDF do certificado — argumentos ( filename, form_title, auth_code, submission_id ).','Every plugin PDF filename, before the per-type filters — args ( filename, type, entity_id, auth_code ).'=>'Todo nome de arquivo PDF do plugin, antes dos filtros por tipo — argumentos ( filename, type, entity_id, auth_code ).','The img tag that replaces a certificate {{qr_code}} placeholder — args ( img_html, url, submission_id ).'=>'A tag img que substitui um placeholder {{qr_code}} do certificado — argumentos ( img_html, url, submission_id ).','The appointment receipt template: return HTML to replace it — args ( html, schedule_type ) — or point to another file inside the plugin or theme — args ( file ).'=>'O modelo do comprovante de agendamento: retorne HTML para substituí-lo — argumentos ( html, schedule_type ) — ou aponte para outro arquivo dentro do plugin ou do tema — argumentos ( file ).','The receipt PDF filename — args ( filename, calendar_id, validation_code, appointment ) — and its background image URL — args ( url, appointment, calendar ).'=>'O nome do arquivo PDF do comprovante — argumentos ( filename, calendar_id, validation_code, appointment ) — e a URL da imagem de fundo — argumentos ( url, appointment, calendar ).','When a calendar is deleted: whether its appointments are cancelled — args ( true, calendar_id, post_id ) — and whether each person is notified — args ( true, appointment ).'=>'Quando um calendário é excluído: se seus agendamentos são cancelados — argumentos ( true, calendar_id, post_id ) — e se cada pessoa é notificada — argumentos ( true, appointment ).','The certificate confirmation email — args ( subject, form_title, form_config ), ( to, form_title, submission_data ) and ( body, to, form_title, submission_data ).'=>'O e-mail de confirmação do certificado — argumentos ( subject, form_title, form_config ), ( to, form_title, submission_data ) e ( body, to, form_title, submission_data ).','Who receives the new-submission admin notification — args ( recipients, form_title, data ).'=>'Quem recebe a notificação de novo envio para o administrador — argumentos ( recipients, form_title, data ).','Whether to stamp the mail-queue source headers on an email — args ( emit, source_key ).'=>'Define se os cabeçalhos de origem da fila de e-mails são adicionados a um e-mail — argumentos ( emit, source_key ).','Submissions CSV exports (admin and public): the header row — args ( headers, include_edit_columns, form_ids ) — the filename — args ( filename, form_ids, status ) — and each batch of rows — args ( rows, form_ids, status ).'=>'Exportações CSV de envios (administrativa e pública): a linha de cabeçalho — argumentos ( headers, include_edit_columns, form_ids ) — o nome do arquivo — argumentos ( filename, form_ids, status ) — e cada lote de linhas — argumentos ( rows, form_ids, status ).','The sanitized ffc_settings array before it is written — args ( clean, current ).'=>'O array ffc_settings sanitizado antes de ser gravado — argumentos ( clean, current ).','The capabilities that let a user open the Settings page — args ( caps ).'=>'As capacidades que permitem a um usuário abrir a página de Configurações — argumentos ( caps ).','Add a tab to the Scheduling settings screen — args ( tabs ).'=>'Adiciona uma aba à tela de configurações de Agendamento — argumentos ( tabs ).','The page URL used for a form\'s schedule-exception link — args ( url, form_id ).'=>'A URL da página usada no link de exceção de horário de um formulário — argumentos ( url, form_id ).','Call the IP geolocation API over HTTPS instead of HTTP — args ( false ).'=>'Chama a API de geolocalização por IP via HTTPS em vez de HTTP — argumentos ( false ).','Turn off the GitHub update check — args ( true ) — or point it at another repository — args ( repo ).'=>'Desativa a verificação de atualizações no GitHub — argumentos ( true ) — ou aponta para outro repositório — argumentos ( repo ).','After a submission is edited — args ( submission_id, update_data ) — or deleted — args ( submission_id ).'=>'Depois que um envio é editado — argumentos ( submission_id, update_data ) — ou excluído — argumentos ( submission_id ).','Audience booking lifecycle — args ( booking_id ) on create, ( booking_id, reason ) on cancel.'=>'Ciclo de vida da reserva de público-alvo — argumentos ( booking_id ) na criação, ( booking_id, reason ) no cancelamento.','Before a short-URL redirect is sent — args ( record, target_url, redirect_type ).'=>'Antes de o redirecionamento de uma URL curta ser enviado — argumentos ( record, target_url, redirect_type ).','After a submissions CSV export finishes (admin or public) — args ( job_id, file, rows, job ). The other exports do not fire it. Renamed from ffcertificate_csv_export_completed in 6.17.0.'=>'Depois que uma exportação CSV de envios termina (administrativa ou pública) — argumentos ( job_id, file, rows, job ). As demais exportações não o disparam. Renomeado de ffcertificate_csv_export_completed na versão 6.17.0.','Before a public submission is stored — args ( form_id, submission_data, user_email, form_config ).'=>'Antes de um envio público ser armazenado — argumentos ( form_id, submission_data, user_email, form_config ).','Before a submission is edited — args ( submission_id, email, data ) — or permanently deleted — args ( submission_id ).'=>'Antes de um envio ser editado — argumentos ( submission_id, email, data ) — ou excluído definitivamente — argumentos ( submission_id ).','A submission moved to or restored from the trash — args ( submission_id ).'=>'Um envio movido para a lixeira ou restaurado dela — argumentos ( submission_id ).','After a certificate\'s PDF payload is built — args ( pdf_data, submission_id ).'=>'Depois que os dados do PDF de um certificado são montados — argumentos ( pdf_data, submission_id ).','Before the certificate confirmation email is composed — args ( submission_id, user_email, form_id, form_config ).'=>'Antes de o e-mail de confirmação do certificado ser composto — argumentos ( submission_id, user_email, form_id, form_config ).','Before an audience booking is stored — args ( booking_data ).'=>'Antes de uma reserva de público-alvo ser armazenada — argumentos ( booking_data ).','After an audience (group) is created — args ( audience_id, data ).'=>'Depois que um público-alvo (grupo) é criado — argumentos ( audience_id, data ).','While the Audience module registers its capabilities — no args.'=>'Enquanto o módulo de Público-alvo registra suas capacidades — sem argumentos.','After a form\'s cached data is purged — args ( form_id, reason ).'=>'Depois que os dados em cache de um formulário são limpos — argumentos ( form_id, reason ).','After the ffc_settings option is saved — args ( clean ).'=>'Depois que a opção ffc_settings é salva — argumentos ( clean ).','Before a Danger Zone data deletion runs — args ( target, reset_counter ).'=>'Antes de uma exclusão de dados da Zona de Perigo ser executada — argumentos ( target, reset_counter ).','fires when a submissions export finishes; the other exports do not fire it.'=>'é disparada quando uma exportação de envios termina; as demais exportações não a disparam.','Public — books an appointment.'=>'Público — cria um agendamento.','Read or cancel one appointment — requires access to that appointment.'=>'Lê ou cancela um agendamento — exige acesso a esse agendamento.','Logged-in (acts on the current user).'=>'Conectado (atua sobre o usuário atual).','Public — anonymous callers get bookings of the schedules they may read, without personal details.'=>'Público — chamadas anônimas recebem as reservas das agendas que podem ler, sem dados pessoais.','Logged-in — creating needs ffc_view_own_audience_bookings (or the scheduling bypass); cancelling needs ownership of the booking or the bypass.'=>'Conectado — criar exige ffc_view_own_audience_bookings (ou a permissão de ignorar restrições de agendamento); cancelar exige ser dono da reserva ou essa permissão.','ffc_view_certificates (personal data stays masked without the PII capability).'=>'ffc_view_certificates (os dados pessoais permanecem mascarados sem a capacidade de dados pessoais).','Logged-in — the current candidate\'s own recruitment data.'=>'Conectado — os dados de recrutamento do próprio candidato atual.','The plugin\'s only authenticated write API: a field-operator app issues certificates over WordPress Application Passwords (HTTP Basic auth, so capability checks work with no nonce). Added in 6.18.0.'=>'A única API de escrita autenticada do plugin: um aplicativo de operador de campo emite certificados utilizando Senhas de Aplicativo do WordPress (autenticação HTTP Basic, permitindo que as verificações de capacidade funcionem sem *nonce*). Adicionada na versão 6.18.0.','Activity Log: Encrypt Client IPs'=>'Registro de atividades: Criptografar IPs dos clientes','Encrypt the client IP address of activity log rows written before addresses were stored encrypted, and clear the plaintext copy. An address that cannot be encrypted is cleared all the same.'=>'Criptografa o endereço IP do cliente nas linhas do registro de atividades gravadas antes de os endereços serem armazenados criptografados, e apaga a cópia em texto puro. Um endereço que não puder ser criptografado é apagado do mesmo jeito.','Encrypted the client IP of %d activity log rows.'=>'IP do cliente criptografado em %d linhas do registro de atividades.','Encryption keys are not configured, so the addresses cannot be encrypted.'=>'As chaves de criptografia não estão configuradas, então os endereços não podem ser criptografados.','Activity-log entries store the client IP address encrypted, and an entry whose details carry a sensitive field (such as CPF or an IP address) has those details encrypted too; the log is still personal data. Entries written before 6.34.0 kept the address in clear until the "Activity Log: Encrypt Client IPs" migration runs. The debug logs hash IP addresses instead.'=>'As entradas do registro de atividades armazenam o endereço IP do cliente criptografado, e uma entrada cujos detalhes trazem um campo sensível (como CPF ou um endereço IP) também tem esses detalhes criptografados; o registro continua sendo dado pessoal. Entradas gravadas antes da 6.34.0 mantêm o endereço em texto puro até a migração "Registro de atividades: Criptografar IPs dos clientes" ser executada. Os logs de depuração guardam um hash dos endereços IP.','the Encryption Key Rotation re-encrypts stored personal data under FFC_ENCRYPTION_KEY from wp-config.php, with a second card for the remaining areas (recruitment candidates and reregistration bodies); two more cards clear plaintext left on activity log rows that are already encrypted and encrypt the client IP addresses older activity log rows still hold in clear.'=>'a Rotação de Chaves de Criptografia recriptografa os dados pessoais armazenados com a FFC_ENCRYPTION_KEY do wp-config.php, com um segundo cartão para as áreas restantes (candidatos do recrutamento e conteúdo dos recadastramentos); outros dois cartões apagam o texto puro deixado em linhas do registro de atividades que já estão criptografadas e criptografam os endereços IP de clientes que linhas antigas do registro ainda guardam em texto puro.','%1$s — %2$s (%3$s, score %4$s)'=>'%1$s — %2$s (%3$s, pontuação %4$s)','Classification'=>'Classificação','FFC Recruitment'=>'Recrutamento FFC','FFC Reregistration'=>'Recadastramento FFC','What the eraser keeps.'=>'O que o apagador mantém.','%d recruitment candidacies retained: classification lists of a public tender are kept by legal obligation. Remove the candidate in Recruitment if the obligation no longer applies.'=>'%d candidaturas de recrutamento mantidas: as listas de classificação de um concurso público são guardadas por obrigação legal. Remova o candidato em Recrutamento se a obrigação não se aplicar mais.','%d reregistration submissions retained: they are institutional records kept by legal obligation. Remove them from the campaign if the obligation no longer applies.'=>'%d envios de recadastramento mantidos: são registros institucionais guardados por obrigação legal. Remova-os da campanha se a obrigação não se aplicar mais.','Reregistration submissions and recruitment candidacies are exported but not erased: they are institutional records an organisation is usually required to keep, so the eraser reports them as retained, with a message, and changes nothing. Remove them from the campaign or from Recruitment when the obligation no longer applies. A record linked to a different account is that account\'s, even when it carries the same e-mail address.'=>'Envios de recadastramento e candidaturas de recrutamento são exportados, mas não apagados: são registros institucionais que uma organização normalmente é obrigada a guardar, então o apagador os informa como mantidos, com uma mensagem, e não altera nada. Remova-os da campanha ou do Recrutamento quando a obrigação não se aplicar mais. Um registro vinculado a outra conta pertence a essa conta, mesmo que tenha o mesmo endereço de e-mail.','Under Tools → Export Personal Data and Tools → Erase Personal Data, the plugin registers its own handlers. Each one works on the records linked to the WordPress account that has the requested e-mail address and, for records linked to no account, on those whose stored e-mail matches it — so a certificate or appointment made without logging in is found too:'=>'Em Ferramentas → Exportar Dados Pessoais e Ferramentas → Apagar Dados Pessoais, o plugin registra seus próprios manipuladores. Cada um atua sobre os registros vinculados à conta do WordPress que tem o e-mail solicitado e, nos registros sem conta vinculada, sobre aqueles cujo e-mail armazenado corresponde a ele — assim, um certificado ou agendamento feito sem login também é encontrado:','an eraser clears the encrypted personal data (e-mail and its lookup hash, CPF/RF, the client IP, …) from the certificates and appointments and unlinks them from the account, deletes the person\'s audience memberships, booking links, schedule permissions, stored profile and FFC user settings, and unlinks their activity-log entries. Authentication codes and verification tokens may be kept in anonymised form so certificates already issued remain verifiable after the person\'s data is erased.'=>'um apagador remove os dados pessoais criptografados (e-mail e seu hash de busca, CPF/RF, o IP do cliente, …) dos certificados e agendamentos e os desvincula da conta, exclui as participações da pessoa em públicos-alvo, vínculos de reservas, permissões de agenda, perfil armazenado e configurações de usuário FFC, e desvincula suas entradas do registro de atividades. Códigos de autenticação e tokens de verificação podem ser mantidos de forma anonimizada para que certificados já emitidos continuem verificáveis depois que os dados da pessoa forem apagados.','exporters gather the person\'s FFC data: profile, certificates, appointments, audience groups, audience bookings, reregistration submissions (with their answers decrypted), recruitment candidacies and their classifications, and FFC user settings.'=>'exportadores reúnem os dados FFC da pessoa: perfil, certificados, agendamentos, grupos de público-alvo, reservas de público-alvo, envios de recadastramento (com as respostas descriptografadas), candidaturas de recrutamento e suas classificações, e configurações de usuário FFC.','A form with no end date never releases the CSV. Downloads are also capped by a per-form quota (blank inherits the global Default Download Limit under Settings → Advanced). When the CPF gate below is set to anything other than none — or when an operator volunteers a valid CPF — each attempt is written to a per-form audit log of the most recent attempts (timestamp, IP address stored encrypted, mode, result) that admins can export.'=>'Um formulário sem data de término nunca libera o arquivo CSV. Os downloads também estão sujeitos a uma cota por formulário (se o campo estiver em branco, aplica-se o Limite de Download Padrão global, definido em Configurações → Avançado). Quando a exigência de CPF abaixo está em qualquer modo diferente de none — ou quando um operador informa voluntariamente um CPF válido — cada tentativa é registrada em um log de auditoria do formulário com as tentativas mais recentes (data/hora, endereço IP armazenado criptografado, modo e resultado), que os administradores podem exportar.','Value submitted with every entry (the visitor cannot change it):'=>'Valor enviado em todas as respostas (o visitante não pode alterá-lo):','Hidden field — no visible control; every entry submits the fixed value set on the field\'s Value input (the server uses that value, never one sent by the browser).'=>'Campo oculto — sem controle visível; toda resposta envia o valor fixo definido no campo Valor (o servidor usa esse valor, nunca um enviado pelo navegador).','If someone submits again with a CPF/RF that already has a certificate, they are returned their existing certificate instead of generating a new one. This is always on — it is what keeps one person from issuing two certificates. On a form with the Ticket restriction, re-entering a ticket that already issued a certificate returns that certificate the same way; on a quiz form a used ticket is rejected, because there a new submission is a new attempt.'=>'Se alguém enviar novamente com um CPF/RF que já possui certificado, recebe o certificado existente em vez de gerar um novo. Isso está sempre ativo — é o que impede uma pessoa de emitir dois certificados. Em um formulário com a restrição Ingresso, informar de novo um bilhete que já emitiu um certificado devolve esse certificado da mesma forma; em um formulário com quiz, um bilhete já utilizado é recusado, porque ali um novo envio é uma nova tentativa.','(scales a logo down to fit) and'=>'(reduz um logotipo para caber) e','(spans the full width).'=>'(ocupa toda a largura).','Date message (such as a birthday)'=>'Mensagem por data (como aniversário)','Date-message e-mails are listed there too, but each rule\'s subject and body are edited on the rule itself, on the Date Messages screen. The hub\'s "Birthday message (default for new rules)" only sets the text a new rule starts from; existing rules keep their own.'=>'Os e-mails de mensagens por data também aparecem ali, mas o assunto e o corpo de cada regra são editados na própria regra, na tela Mensagens por Data. A "Mensagem de aniversário (padrão para novas regras)" do hub só define o texto com que uma nova regra começa; as regras existentes mantêm o seu.','Images take'=>'Imagens aceitam','Manager digest'=>'Resumo para gestores','Only the tags above survive, each with a fixed set of attributes: style and class work on almost every tag, and style blocks are not allowed — use inline styles. Developers can widen the list with the ffcertificate_allowed_html_tags filter.'=>'Só as tags acima são mantidas, cada uma com um conjunto fixo de atributos: style e class funcionam em quase todas as tags, e blocos style não são permitidos — use estilos inline. Desenvolvedores podem ampliar a lista com o filtro ffcertificate_allowed_html_tags.','Sent to each person on a date in their profile — each rule carries its own subject and body; the hub above holds the text a new rule starts from.'=>'Enviado a cada pessoa em uma data do seu perfil — cada regra tem o próprio assunto e corpo; o hub acima guarda o texto com que uma nova regra começa.','Summary of a run sent to the managers a rule names, 24 hours after it starts; fixed body.'=>'Resumo de uma execução enviado aos gestores indicados na regra, 24 horas depois do início; corpo fixo.','Schedule'=>'Agendamento','WPA2 / WPA3 Enterprise (user name and password)'=>'WPA2 / WPA3 Enterprise (usuário e senha)','EAP method'=>'Método EAP','Phase 2 authentication'=>'Autenticação da fase 2','Anonymous identity'=>'Identidade anônima','Optional. Leave blank unless the network administrator gave you one.'=>'Opcional. Deixe em branco, a menos que o administrador da rede tenha informado uma.','Enter the user name for the Enterprise network.'=>'Informe o usuário da rede Enterprise.','Android saves the network from the code but leaves the CA certificate unset, so it will not connect yet: open the saved network, set CA certificate to "Trust on first use" (or "Do not validate"), then connect. The iPhone camera does not read Enterprise codes; iPhone users type the details in.'=>'O Android salva a rede pelo código, mas deixa o certificado de CA sem seleção, então ela ainda não conecta: abra a rede salva, em Certificado de CA escolha "Confiar no primeiro uso" (ou "Não validar") e conecte. A câmera do iPhone não lê códigos de rede Enterprise; no iPhone os dados são digitados.','%1$d%% full: about %2$d more characters fit at error correction %3$s (an accented letter counts as two).'=>'%1$d%% ocupado: cabem cerca de %2$d caracteres a mais na correção de erros %3$s (uma letra acentuada conta como duas).','%1$d%% full: about %2$d more characters fit at error correction H, which the logo requires (an accented letter counts as two).'=>'%1$d%% ocupado: cabem cerca de %2$d caracteres a mais na correção de erros H, exigida pelo logotipo (uma letra acentuada conta como duas).','This content is about %d characters too long. The logo requires error correction H, which holds the least; remove the logo or shorten the content.'=>'Este conteúdo tem cerca de %d caracteres a mais. O logotipo exige a correção de erros H, a que comporta menos; remova o logotipo ou encurte o conteúdo.','This content is about %1$d characters too long for error correction %2$s. Shorten it, or lower the level.'=>'Este conteúdo tem cerca de %1$d caracteres a mais para a correção de erros %2$s. Encurte-o ou reduza o nível.','(no title)'=>'(sem título)','A short URL already sends to this address. Use it, or confirm that you want another one.'=>'Já existe uma URL curta que leva a este endereço. Use-a ou confirme que deseja criar outra.','A short URL already sends to this address: click "Use this", or tick the box to create another one.'=>'Já existe uma URL curta que leva a este endereço: clique em "Usar esta" ou marque a caixa para criar outra.','Already shortened'=>'Já encurtado','Copied.'=>'Copiado.','Could not copy; select the address and copy it by hand.'=>'Não foi possível copiar; selecione o endereço e copie manualmente.','Create a QR code for any content and download it. The design starts from Settings → QR Code and changes here apply to this code only. Nothing about the content is stored, except a short URL for a website or a social profile when "Create a short URL" is on — it is saved on download or print and listed with the others.'=>'Crie um QR Code para qualquer conteúdo e baixe-o. O design parte de Configurações → QR Code e as alterações feitas aqui valem só para este código. Nada sobre o conteúdo é armazenado, exceto uma URL curta para um site ou perfil de rede social quando "Criar URL curta" está ligado — ela é gravada ao baixar ou imprimir e aparece na lista com as demais.','Create a short URL'=>'Criar URL curta','Enter a title for the short URL before downloading or printing.'=>'Informe um título para a URL curta antes de baixar ou imprimir.','Enter a title for the short URL.'=>'Informe um título para a URL curta.','I know, and I want to create another short URL for this address.'=>'Estou ciente e quero criar outra URL curta para este endereço.','New short URL'=>'Nova URL curta','On: the code carries a short URL that counts the scans and whose destination can be changed later, even after printing. It is saved on download or print. Off: the code carries the address itself, nothing is stored in the database, and it keeps working even if this site goes down.'=>'Ligado: o código leva uma URL curta que conta as leituras e cujo destino pode ser trocado depois, mesmo após a impressão. Ela é gravada ao baixar ou imprimir. Desligado: o código leva o próprio endereço, nada é gravado no banco de dados e ele continua funcionando mesmo se este site sair do ar.','Required: it names the short URL in the list.'=>'Obrigatório: é o nome da URL curta na lista.','Short URL in the code'=>'URL curta no código','This address is already a short URL of this site, so it is used as is: shortening it again would only chain two redirects.'=>'Este endereço já é uma URL curta deste site, então é usado como está: encurtá-lo de novo só encadearia dois redirecionamentos.','This address is already a short URL of this site; it cannot be shortened again.'=>'Este endereço já é uma URL curta deste site; não pode ser encurtado de novo.','This content type cannot have a short URL.'=>'Este tipo de conteúdo não pode ter URL curta.','Use this'=>'Usar esta','created %1$s, %2$d clicks'=>'criada em %1$s, %2$d cliques','in Short URLs → QR Code Generator (the "New short URL" button on the list opens it), on the Website or Social profile type with "Create a short URL" on: enter the destination and a title, and the short URL is created when the code is downloaded or printed. The short code is generated automatically (there is no custom-slug field).'=>'no Gerador de QR Code (URLs curtas → Gerador de QR Code; o botão "Nova URL curta" da lista abre essa tela), nos tipos Site ou Perfil em rede social com "Criar URL curta" ligado: informe o destino e um título, e a URL curta é criada quando o código é baixado ou impresso. O código curto é gerado automaticamente (não há campo de slug personalizado).','Short URLs → QR Code Generator makes a QR code for a website, plain text, a Wi-Fi network (Enterprise networks that sign in with a user name included), an e-mail, a phone call, an SMS, a WhatsApp chat, a contact card (vCard), a social profile or an event, styled from the global design and downloaded as PNG or SVG. For a website or a social profile, "Create a short URL" (on by default) puts a short URL in the code instead of the address: the preview shows an example, and the real one is created on the first download or print, then reused until the destination or the title changes. The title is then required; an address that already has a short URL is flagged, with "Use this" to reuse it, and creating another needs an explicit confirmation; an address that is already a short URL of this site is never shortened again. With the switch off nothing is stored. It needs ffc_manage_url_shortener.'=>'URLs curtas → Gerador de QR Code cria um QR Code para um site, texto simples, uma rede Wi-Fi (inclusive redes Enterprise, que pedem usuário), um e-mail, uma ligação, um SMS, uma conversa no WhatsApp, um cartão de contato (vCard), um perfil em rede social ou um evento, estilizado a partir do design global e baixado em PNG ou SVG. Para um site ou um perfil em rede social, "Criar URL curta" (ligado por padrão) coloca no código uma URL curta em vez do endereço: a prévia mostra um exemplo, e a URL real é criada no primeiro download ou impressão e reaproveitada até que o destino ou o título mude. O título passa a ser obrigatório; um endereço que já tem URL curta é sinalizado, com "Usar esta" para reaproveitá-la, e criar outra exige confirmação explícita; um endereço que já é uma URL curta deste site nunca é encurtado de novo. Com o switch desligado, nada é gravado. Requer ffc_manage_url_shortener.','Open the Short URLs list'=>'Abrir a lista de URLs curtas','"%s" is stored and now counts the scans. Copy the link to share it.'=>'"%s" foi salva e já conta as leituras. Copie o link para compartilhá-lo.','Short URL saved'=>'URL curta salva','Enter a valid address. Without a scheme, https:// is used; http, ftp, ftps, sftp and ssh must be typed in full.'=>'Informe um endereço válido. Sem esquema, usa-se https://; http, ftp, ftps, sftp e ssh devem ser digitados por completo.','Without a scheme, https:// is used (example.com becomes https://example.com). For http, ftp, ftps, sftp or ssh, type the full address.'=>'Sem esquema, usa-se https:// (exemplo.com vira https://exemplo.com). Para http, ftp, ftps, sftp ou ssh, digite o endereço completo.','Only http and https addresses can have a short URL.'=>'Somente endereços http e https podem ter uma URL curta.','A short URL redirects web addresses only (http or https), so this address is used as is.'=>'A URL curta só redireciona endereços web (http ou https), por isso este endereço é usado como está.','This rule is inactive. Activate it before sending, or use "Send test to me" to check it.'=>'Esta regra está inativa. Ative-a antes de enviar, ou use "Enviar teste para mim" para conferi-la.','A form collects the answers a certificate is issued from. Create one, then place its shortcode on a page.'=>'Um formulário coleta as respostas a partir das quais o certificado é emitido. Crie um e depois coloque o shortcode dele em uma página.','Forms moved to the trash appear here until they are restored or deleted permanently.'=>'Os formulários movidos para a lixeira aparecem aqui até serem restaurados ou excluídos permanentemente.','No failed quiz attempts'=>'Nenhuma reprovação no quiz','No form matches the current search or date filter. A number searches by form ID.'=>'Nenhum formulário corresponde à busca ou ao filtro de data atual. Um número busca pelo ID do formulário.','No forms in "%s"'=>'Nenhum formulário em "%s"','No forms match'=>'Nenhum formulário encontrado','No forms yet'=>'Ainda não há formulários','No quiz retries'=>'Nenhuma nova tentativa de quiz','No submissions match'=>'Nenhuma submissão encontrada','No submissions yet'=>'Ainda não há submissões','Nothing in "%s" matches the current search or form filter.'=>'Nada em "%s" corresponde à busca ou ao filtro de formulário atual.','Participants who failed a quiz and may still try again appear here.'=>'Os participantes que foram reprovados no quiz e ainda podem tentar de novo aparecem aqui.','Participants who used every quiz attempt without passing appear here.'=>'Os participantes que usaram todas as tentativas do quiz sem aprovação aparecem aqui.','Submissions appear here once someone fills in one of your forms.'=>'As submissões aparecem aqui assim que alguém preencher um dos seus formulários.','Submissions moved to the trash appear here until they are restored or deleted permanently.'=>'As submissões movidas para a lixeira aparecem aqui até serem restauradas ou excluídas permanentemente.','Trash is empty'=>'A lixeira está vazia','Open Scheduled Tasks'=>'Abrir Tarefas Agendadas','A notice to the site team for every submission.'=>'Um aviso à equipe do site a cada submissão.','Administrator'=>'Administrador','Allowed areas'=>'Áreas permitidas','As last saved. Unsaved changes show on the tab dots.'=>'Conforme o último salvamento. As alterações não salvas aparecem nos pontos das abas.','Date/time window'=>'Janela de data/hora','Download submissions (CSV)'=>'Baixar submissões (CSV)','Email to the participant'=>'E-mail ao participante','Form summary'=>'Resumo do formulário','How a visitor\'s location is checked: GPS in the browser, the IP address, or both.'=>'Como a localização do visitante é verificada: GPS no navegador, endereço IP ou ambos.','Lets an operator change the schedule for one submission.'=>'Permite que um operador altere o horário de uma submissão.','Limit, access link, CPF check and the audit of every attempt.'=>'Limite, link de acesso, verificação de CPF e auditoria de cada tentativa.','No locations are registered yet.'=>'Ainda não há locais cadastrados.','Not set'=>'Não definido','Notify the administrator'=>'Notificar o administrador','On'=>'Ligado','Open to everyone'=>'Aberto a todos','Opening early and closing late'=>'Abertura antecipada e fechamento adiado','Operator access'=>'Acesso do operador','Participant'=>'Participante','Register them in Settings → Geolocation'=>'Cadastre-os em Configurações → Geolocalização','Restrictions'=>'Restrições','The actions the access link exposes.'=>'As ações que o link de acesso oferece.','The message the submitter receives after a successful submission.'=>'A mensagem que quem enviou recebe após uma submissão bem-sucedida.','Ticket'=>'Ticket','Validation methods'=>'Métodos de validação','Visitors outside the area'=>'Visitantes fora da área','What a visitor sees when the location check fails.'=>'O que o visitante vê quando a verificação de localização falha.','When the event takes place, printed as {{schedule}} on the certificate.'=>'Quando o evento acontece, impresso como {{schedule}} no certificado.','When the form accepts submissions, and what visitors see outside that window.'=>'Quando o formulário aceita submissões e o que os visitantes veem fora dessa janela.','Where submissions are accepted, from registered locations or custom coordinates.'=>'Onde as submissões são aceitas, a partir de locais cadastrados ou coordenadas personalizadas.','Whether the operator can use Start Form Early or Postpone Close right now.'=>'Se o operador pode usar Início Antecipado ou Adiar Fechamento agora.','Anyone with this link can download the certificate.'=>'Qualquer pessoa com este link pode baixar o certificado.','Form answers'=>'Respostas do formulário','Magic Link'=>'Link Mágico','Open certificate'=>'Abrir certificado','This submission has no form answers.'=>'Esta submissão não tem respostas de formulário.','Forms in the month shown'=>'Formulários no mês exibido','Submissions today'=>'Submissões hoje','Submissions in the last 7 days'=>'Submissões nos últimos 7 dias','GeoFence windows open now'=>'Janelas de GeoFence abertas agora','Add Block'=>'Adicionar bloco','Administrator recipients'=>'Destinatários administradores','Approval and waitlist'=>'Aprovação e lista de espera','Booking Rules & Restrictions'=>'Regras e Restrições de Agendamento','Booking slots'=>'Horários de atendimento','Booking window'=>'Janela de agendamento','Calendar Configuration'=>'Configuração do Calendário','Confirmation message'=>'Mensagem de confirmação','Each message on its own switch, and when the reminder goes out.'=>'Cada mensagem com seu próprio interruptor, e quando o lembrete é enviado.','How far ahead, and how often, a person may book.'=>'Com quanta antecedência, e com que frequência, uma pessoa pode agendar.','Manual review of each booking, and a queue for full slots.'=>'Revisão manual de cada agendamento, e uma fila para horários lotados.','Messages'=>'Mensagens','Occupancy Report'=>'Relatório de ocupação','The subject and text of the email the person receives.'=>'O assunto e o texto do e-mail que a pessoa recebe.','Visibility of the calendar, and the hours it can be seen or booked in.'=>'Visibilidade do calendário, e os horários em que ele pode ser visto ou agendado.','Weekly hours or exact blocks, and how each slot is sized.'=>'Horários semanais ou blocos exatos, e o tamanho de cada horário.','What the calendar is, and whether it takes bookings.'=>'O que é o calendário, e se ele aceita agendamentos.','Whether administrators are held to the rules above.'=>'Se os administradores seguem as regras acima.','Whether people can cancel their own bookings, and until when.'=>'Se as pessoas podem cancelar os próprios agendamentos, e até quando.','Which emails are sent'=>'Quais e-mails são enviados','Who can see and book'=>'Quem pode ver e agendar','Who receives the new-booking notification.'=>'Quem recebe a notificação de novo agendamento.','Working Hours & Availability'=>'Horários de Funcionamento e Disponibilidade','Total'=>'Total','Recipients'=>'Destinatários','Summary'=>'Resumo','0 sends on the date itself; -7 sends seven days before it, 7 seven days after it.'=>'0 envia na própria data; -7 envia sete dias antes dela, 7, sete dias depois.','A birth date given before the profile field existed reaches the profile through a migration card in Settings → Data Migrations; while it has accounts left, the Date Messages screen shows a warning, because those people are not yet in previews, upcoming dates or sends.'=>'Uma data de nascimento informada antes de o campo de perfil existir chega ao perfil por um cartão de migração em Configurações → Migrações de Dados; enquanto restarem contas, a tela Mensagens por Data exibe um aviso, porque essas pessoas ainda não aparecem nas prévias, nas próximas datas nem nos envios.','Access-granted notice, sent when a user gains plugin capabilities — only while "Access Granted Notification" is on in the SMTP tab, which it is not by default'=>'Aviso de acesso concedido, enviado quando um usuário recebe capacidades do plugin — somente enquanto "Notificação de Acesso Concedido" estiver ativada na aba SMTP, o que não é o padrão','Administrators see and edit the same fields on the user-edit screen, in the "FFC Custom Data" section, grouped by the audiences the user belongs to. They behave as on the reregistration form: CPF, RF, RG and phone fields are masked and validated, dependent selects follow their parent, and a field mapped to the profile is saved there, encrypted when it holds personal data, so the profile, the dashboard and the next reregistration read the same value.'=>'Administradores veem e editam os mesmos campos na tela de edição do usuário, na seção "Dados Personalizados FFC", agrupados pelos públicos-alvo a que o usuário pertence. Eles se comportam como no formulário de recadastramento: os campos de CPF, RF, RG e telefone têm máscara e validação, as listas dependentes acompanham a lista-mãe, e um campo mapeado para o perfil é salvo nele, criptografado quando contém dados pessoais, de modo que o perfil, o painel e o próximo recadastramento leem o mesmo valor.','An account that also holds a non-FFC role — an Editor who was given an FFC role, for example — keeps the whole of wp-admin, and administrators (manage_options) are never scoped. This is a convenience, not the security boundary: every FFC screen and action still checks its capability.'=>'Uma conta que também tem uma função que não é do FFC — um Editor que recebeu uma função FFC, por exemplo — mantém o wp-admin inteiro, e administradores (manage_options) nunca são restringidos. Isso é uma conveniência, não a barreira de segurança: toda tela e toda ação do FFC continuam verificando sua capacidade.','Below it, the SMTP tab has one switch per optional email: the welcome email when a WordPress user is created by a form submission or an appointment (on by default), by a CSV import or a migration (off by default, to avoid bulk mail), and the "Access Granted Notification" (off by default).'=>'Abaixo dele, a aba SMTP tem um interruptor para cada e-mail opcional: o e-mail de boas-vindas quando um usuário do WordPress é criado por um envio de formulário ou um agendamento (ativado por padrão), por uma importação de CSV ou uma migração (desativado por padrão, para evitar envios em massa), e a "Notificação de Acesso Concedido" (desativada por padrão).','Controls the dark mode appearance of the plugin\'s admin screens and of its public pages (forms, user dashboard, shortcodes).'=>'Controla o modo escuro das telas de administração do plugin e das suas páginas públicas (formulários, painel do usuário, shortcodes).','Create and edit rules and send manually. The daily send time belongs to Settings → Scheduled Tasks.'=>'Criar e editar regras e enviar manualmente. O horário do envio diário fica em Configurações → Tarefas Agendadas.','Dashboard → Updates shows a short summary of the release on offer, taken from that release\'s own readme, together with the WordPress and PHP versions it requires and the WordPress version it was tested up to, so you can read what changes before applying it.'=>'Painel → Atualizações mostra um breve resumo da versão oferecida, tirado do readme dessa própria versão, junto com as versões de WordPress e PHP que ela exige e a versão de WordPress com que foi testada, para que você leia o que muda antes de aplicá-la.','Every run, daily or manual, is listed with its rule, dates and counters: sent, opted out, no valid e-mail, outside the audience and failed. "Sent" counts messages handed to wp_mail(); with a mail queue active, delivery happens afterwards from the queue. Above the list, the tab shows when the next daily run is due, with a link to Settings → Scheduled Tasks for those who can open it.'=>'Cada execução, diária ou manual, é listada com a sua regra, as datas e os contadores: enviados, cancelaram o recebimento, sem e-mail válido, fora do público-alvo e com falha. "Enviados" conta as mensagens entregues ao wp_mail(); com uma fila de e-mails ativa, a entrega acontece depois, a partir da fila. Acima da lista, a aba mostra quando será a próxima execução diária, com um link para Configurações → Tarefas Agendadas para quem pode abri-la.','Independently of the settings above, an account whose roles are all FFC operator roles (a module viewer, operator or manager, or FFC Read-Only) sees a scoped wp-admin: the core menus it has no use for (Posts, Comments, Tools, Plugins and the like) are hidden, the admin bar is pruned, and opening an admin page outside its module redirects to the module\'s own screen. Its profile, the dashboard home and the AJAX endpoints stay reachable.'=>'Independentemente das configurações acima, uma conta cujas funções são todas funções de operador do FFC (visualizador, operador ou gestor de um módulo, ou FFC Somente Leitura) vê um wp-admin restrito: os menus do núcleo que não usa (Posts, Comentários, Ferramentas, Plugins e afins) ficam ocultos, a barra de administração é reduzida, e abrir uma página de administração fora do seu módulo redireciona para a tela do próprio módulo. O perfil, a página inicial do painel e os endpoints AJAX continuam acessíveis.','Off, On (always dark), or Auto (follow the operating system). Applies to the plugin\'s admin screens and to what it shows visitors: the public forms, the user dashboard and the scheduling, audience and recruitment shortcodes. Certificates and other PDFs are always light.'=>'Desativado, Ativado (sempre escuro) ou Automático (segue o sistema operacional). Vale para as telas de administração do plugin e para o que ele mostra aos visitantes: os formulários públicos, o painel do usuário e os shortcodes de agendamento, público-alvo e convocação. Certificados e outros PDFs são sempre claros.','Operator roles in wp-admin'=>'Funções de operador no wp-admin','Per role:'=>'Por função:','Per user:'=>'Por usuário:','Register a migration card and its strategy on Settings → Data Migrations — args ( migrations ) / ( strategies ).'=>'Registra um cartão de migração e sua estratégia em Configurações → Migrações de Dados — args ( migrations ) / ( strategies ).','Send now is also how a missed day is recovered: the daily run covers only the current day, so a day the scheduler did not run is not caught up the next day. Only an active rule can be sent; deactivating a rule stops a run still in progress at its next batch.'=>'"Enviar agora" também é como se recupera um dia perdido: a execução diária cobre só o dia corrente, então um dia em que o agendador não rodou não é recuperado no dia seguinte. Só uma regra ativa pode ser enviada; desativar uma regra interrompe uma execução ainda em andamento no lote seguinte.','Settings → Modules lets you turn individual feature modules on or off. Every module ships enabled; disabling one hides its admin screens and stops its runtime (its scheduled tasks still fire on schedule but do nothing), but never deletes its data — re-enable it at any time and everything is back. Each switch saves instantly and takes effect on the next page load.'=>'Em Configurações → Módulos, você pode ativar ou desativar módulos de recursos individuais. Todos os módulos vêm ativados por padrão; desativar um módulo oculta suas telas de administração e interrompe sua execução (suas tarefas agendadas continuam disparando no horário, mas não fazem nada), mas nunca exclui seus dados — basta reativá-lo a qualquer momento para que tudo volte ao normal. Cada alteração é salva instantaneamente e entra em vigor no próximo carregamento da página.','Settings → User Access → "FFC Roles & Capabilities" edits which capabilities each FFC role carries.'=>'Configurações → Acesso do Usuário → "Funções e Capacidades do FFC" define quais capacidades cada função FFC tem.','The All Forms list has a Features column with three switches per form — CSV (the public operator download), Quiz and Device limit. Each saves as soon as it is flipped, writes the same setting as the form editor, and is read-only for someone who cannot edit that form.'=>'A lista Todos os Formulários tem uma coluna Recursos com três interruptores por formulário — CSV (o download público do operador), Quiz e Limite do dispositivo. Cada um salva assim que é acionado, grava a mesma configuração que o editor do formulário e fica somente leitura para quem não pode editar aquele formulário.','The daily run sends every active rule once a day, for that day\'s dates only, at 08:00 in the site timezone by default. The Schedule tab shows the current time and the next run; the time itself is changed on Settings → Scheduled Tasks, which needs the settings-management capability (ffc_manage_settings) and also shows the server line that keeps scheduled tasks running on a quiet site.'=>'A execução diária envia todas as regras ativas uma vez por dia, só para as datas daquele dia, por padrão às 08:00 no fuso horário do site. A aba Agendamento mostra o horário atual e a próxima execução; o horário em si é alterado em Configurações → Tarefas Agendadas, que exige a capacidade de gerenciar configurações (ffc_manage_settings) e também mostra a linha do servidor que mantém as tarefas agendadas rodando em um site com pouco tráfego.','The person\'s name as stored; the first and last name from the WordPress profile (when empty, the first word of the name and the rest); and the two joined'=>'O nome da pessoa como armazenado; o nome e o sobrenome do perfil do WordPress (quando vazios, a primeira palavra do nome e o restante); e os dois unidos','The plugin registers one role per module tier — viewer, operator, manager — plus "FFC Administrator", "FFC Read-Only (all modules)" and "FFC End User", which is given automatically to people who submit a form with a CPF or RF. The roles the plugin currently registers:'=>'O plugin registra uma função por nível de cada módulo — visualizador, operador, gestor — além de "FFC Administrador", "FFC Somente Leitura (todos os módulos)" e "FFC Usuário Final", atribuída automaticamente a quem envia um formulário com CPF ou RF. As funções que o plugin registra atualmente:','The plugin ships fine-grained capabilities and its own roles, and manages both itself — no capability-management plugin is needed. WordPress administrators (manage_options) always hold every FFC capability.'=>'O plugin traz capacidades granulares e funções próprias, e gerencia ambas por conta própria — nenhum plugin de gestão de capacidades é necessário. Administradores do WordPress (manage_options) sempre têm todas as capacidades do FFC.','The source repository is public, so updates need no access token, account or licence — the site just needs to reach api.github.com and raw.githubusercontent.com over HTTPS. On a locked-down network that blocks outbound HTTPS, the update check cannot see new releases and you would update the plugin manually instead.'=>'O repositório de origem é público, portanto, as atualizações não exigem token de acesso, conta ou licença — basta que o site consiga acessar api.github.com e raw.githubusercontent.com via HTTPS. Em uma rede restrita que bloqueia conexões HTTPS de saída, a verificação de atualizações não conseguirá detectar novas versões; nesse caso, você deverá atualizar o plugin manualmente.','Tick one or more named locations in the list. Coordinates are resolved at runtime from the registry.'=>'Marque um ou mais locais cadastrados na lista. As coordenadas são obtidas do cadastro em tempo de execução.','Where they are assigned'=>'Onde são atribuídas','create and edit rules and send manually. The daily send time is set on Settings → Scheduled Tasks, under ffc_manage_settings.'=>'criar e editar regras e enviar manualmente. O horário do envio diário é definido em Configurações → Tarefas Agendadas, com ffc_manage_settings.','off by default; when "Pre-load cache daily" is on, a daily task pre-loads every published form into the cache. Its time is set on Settings → Scheduled Tasks.'=>'desativado por padrão; com "Pré-carregar cache diariamente" ativado, uma tarefa diária carrega no cache todos os formulários publicados. O horário dela é definido em Configurações → Tarefas Agendadas.','the "FFC Permissions" section of the user-edit screen adds or removes FFC roles and grants individual capabilities on top of them. Roles are toggled one at a time and kept alongside the user\'s other WordPress roles.'=>'a seção "Permissões FFC" da tela de edição do usuário adiciona ou remove funções FFC e concede capacidades individuais além delas. As funções são alternadas uma de cada vez e mantidas junto com as demais funções do usuário no WordPress.','"Shorten" shows the "Short URL & QR Code" meta box on that post type. "Expose" publishes the page\'s short URL as the site\'s canonical shortlink — the rel="shortlink" tag in the page head and the HTTP Link header (also used by the editor\'s "Get Shortlink" button and REST). Expose depends on Shorten and only takes effect once a short URL exists for the page.'=>'A opção "Shorten" exibe a meta-caixa "URL curta e QR Code" para esse tipo de post. A opção "Expor" publica a URL curta da página como o *shortlink* canônico do site — ou seja, a tag `rel="shortlink"` no cabeçalho da página e o cabeçalho HTTP `Link` (recursos também utilizados pelo botão "Obter Shortlink" do editor e pela API REST). O "Expor" depende do "Shorten" e só entra em vigor quando já existe uma URL curta para a página.','A set of per-area debug switches, grouped Client (frontend, geofence, QR, browser environment), Server/Processing (form processor, PDF, email, encryption, REST, user manager) and Admin/Operational (admin, personal calendars, audience calendars, migrations, activity log). All default off — turn one on only while diagnosing, since it increases logging.'=>'Um conjunto de chaves de depuração organizadas por área: Cliente (frontend, geofencing, QR, ambiente do navegador), Servidor/Processamento (processador de formulários, PDF, e-mail, criptografia, REST, gerenciamento de usuários) e Admin/Operacional (administração, calendários pessoais, calendários de público-alvo, migrações, registro de atividades). Todas vêm desativadas por padrão — ative-as apenas durante diagnósticos, pois aumentam o volume de logs.','An RF carries a check digit, and the form has never verified it — which is why a mistyped RF reaches storage where a mistyped CPF does not. Off by default, because the rule was derived from the identifiers this install already holds rather than read from an official specification: turning it on could refuse a number that is genuinely unusual, and a person blocked from registering costs more than a typo the audit finds later. Before turning it on, run the identity audit (Settings → Data Migrations) and read how many stored RFs it reports as failing — that count is what enforcement would have rejected.'=>'O RF tem um dígito verificador, e o formulário nunca o conferiu — por isso um RF digitado errado chega ao banco enquanto um CPF errado não chega. Desligado por padrão, porque a regra foi derivada dos identificadores que esta instalação já possui e não lida de uma especificação oficial: ligá-la pode recusar um número genuinamente incomum, e uma pessoa impedida de se cadastrar custa mais do que um erro de digitação que a auditoria encontra depois. Antes de ligar, rode a auditoria de identidade (Configurações → Migrações de Dados) e veja quantos RFs armazenados ela reporta como inconsistentes — essa contagem é o que a exigência teria recusado.','Apply these directly only on a NEW install with no encrypted data yet. On a site that already stores data, defining a new FFC_ENCRYPTION_KEY makes existing encrypted records unreadable, and a new FFC_HASH_SALT invalidates the stored search hashes — both are repaired by a planned key rotation (S7b) at Settings → Data Migrations, not a blind edit.'=>'Aplique essas configurações diretamente apenas em uma instalação nova, que ainda não contenha dados criptografados. Em um site que já armazena dados, definir uma nova `FFC_ENCRYPTION_KEY` torna ilegíveis os registros criptografados existentes, e um novo `FFC_HASH_SALT` invalida os hashes de busca armazenados — ambos os problemas são resolvidos por meio de uma rotação de chaves planejada (S7b) em Configurações → Migrações de Dados, e não por uma edição direta sem critérios.','Before a personal-calendar appointment is stored — args ( data, calendar ).'=>'Antes de um agendamento de calendário pessoal ser armazenado — argumentos ( data, calendar ).','Configure personal calendars and their booking windows.'=>'Configure calendários pessoais e suas janelas de agendamento.','Create and edit personal calendars — structure, working hours and options. Distinct from managing the bookings made against them (#739).'=>'Crie e edite calendários pessoais — estrutura, horários de funcionamento e opções. Isso é diferente do gerenciamento das reservas feitas com base neles (#739).','Email the user when they are granted access to certificates, appointments or audience groups. Edit the text under Settings → Email texts → Account access.'=>'Envia um e-mail ao usuário quando ele recebe acesso a certificados, agendamentos ou grupos de público-alvo. Edite o texto em Configurações → Textos dos e-mails → Acesso à conta.','Enable debug logging for the Personal Calendars module'=>'Ative o registro de depuração para o módulo Calendários Pessoais','FFCertificate — Audience Calendars'=>'FFCertificate — Calendários de Público-alvo','FFCertificate — Certificates'=>'FFCertificate — Certificados','FFCertificate — Date Messages'=>'FFCertificate — Mensagens por Data','FFCertificate — Personal Calendars'=>'FFCertificate — Calendários Pessoais','FFCertificate — Reregistration'=>'FFCertificate — Recadastramento','Filter the to / subject / body of the audience, reregistration and date-message emails. Personal Calendars appointment emails do not pass through it (use ffcertificate_email).'=>'Filtra os campos para / assunto / corpo dos e-mails de público-alvo, recadastramento e mensagens por data. Os e-mails de agendamento dos Calendários Pessoais não passam por ele (use ffcertificate_email).','General scheduling settings that apply to both Personal Calendars and Audience Calendars.'=>'Configurações gerais de agendamento que se aplicam tanto aos Calendários Pessoais quanto aos Calendários de Público-alvo.','Global holidays and Personal / Audience Calendars visibility.'=>'Feriados globais e visibilidade dos Calendários Pessoais e de Público-alvo.','Manage personal calendars'=>'Gerenciar calendários pessoais','Personal Calendars Settings'=>'Configurações dos Calendários Pessoais','Personal Calendars appointment lifecycle — args ( appointment_id, data, calendar ) on create, ( appointment_id, appointment, reason, cancelled_by ) on cancel.'=>'Ciclo de vida do agendamento dos Calendários Pessoais — argumentos ( appointment_id, data, calendar ) na criação, ( appointment_id, appointment, reason, cancelled_by ) no cancelamento.','Personal Calendars confirmation:'=>'Confirmação dos Calendários Pessoais:','Personal Calendars visibility settings saved.'=>'Configurações de visibilidade dos Calendários Pessoais salvas.','Personal Calendars:'=>'Calendários Pessoais:','Read-only access to personal calendars — structure, working hours and options — without the ability to edit them (#739).'=>'Acesso somente leitura a calendários pessoais — estrutura, horários de trabalho e opções — sem permissão para editá-los (#739).','Run it in Settings → Data Migrations.'=>'Rode-a em Configurações → Migrações de Dados.','Settings → Data Migrations → Rewrite html/ Image References'=>'Configurações → Migrações de Dados → Reescrever HTML/Referências de imagem','Short URLs settings view file not found.'=>'Arquivo de configurações de URLs Curtas não encontrado.','The Personal Calendars appointment receipt. Two defaults ship — Regular and Custom.'=>'O comprovante de agendamento dos Calendários Pessoais. Dois padrões são disponibilizados: Regular e Personalizado.','The bookable slots of a personal calendar\'s day — args ( slots, calendar_id, date, calendar ).'=>'Os horários disponíveis de um dia de um calendário pessoal — argumentos ( slots, calendar_id, date, calendar ).','Their personal-calendar appointments (with receipt / cancel actions where allowed)'=>'Seus agendamentos em calendários pessoais (com comprovante e cancelamento, quando permitido)','Triggers for the Personal Calendars emails; the plugin\'s own email handler listens to them — args ( appointment, calendar ).'=>'Gatilhos dos e-mails dos Calendários Pessoais; o próprio manipulador de e-mails do plugin os escuta — argumentos ( appointment, calendar ).','When on, this template can be chosen as the appointment receipt in the Personal Calendars settings.'=>'Quando ativado, este modelo pode ser escolhido como comprovante de agendamento nas configurações dos Calendários Pessoais.','[%1$s] Date Messages summary: %2$s'=>'[%1$s] Resumo de Mensagens por Data: %2$s','"Multiple Audiences" Badge Color'=>'Cor do badge "Múltiplos Públicos-alvo"','%d QR Code(s) cleared from cache successfully.'=>'%d QR Codes removidos do cache com sucesso.','A reregistration campaign collects updated information from the members of one or more audiences over a set period, with optional emails and an approval workflow. Campaigns are managed under the Reregistration admin menu.'=>'Uma campanha de recadastramento coleta informações atualizadas de membros de um ou mais públicos-alvo durante um período definido, contando com e-mails opcionais e um fluxo de aprovação. As campanhas são gerenciadas no menu administrativo de Recadastramento.','Acknowledgment notice ("Termo de Ciência") HTML — editable per-audience in the Reregistration Fields section, with a shipped default fallback.'=>'Aviso de reconhecimento ("Termo de Ciência") HTML — editável por público-alvo na seção Campos de Recadastramento, com um modelo padrão fornecido como alternativa.','Activate the campaign — a submission is created for every audience member and invitation emails go out.'=>'Ative a campanha — uma submissão é criada para cada membro do público-alvo e e-mails de convite são enviados.','Administrators can schedule activities for audiences (groups) in configured environments.'=>'Os administradores podem agendar atividades para públicos-alvo (grupos) em ambientes configurados.','Are you sure you want to deactivate this audience?'=>'Tem certeza de que deseja desativar este público-alvo?','Are you sure you want to permanently delete this audience?'=>'Tem certeza de que deseja excluir esse público-alvo permanentemente?','Audience calendars book shared spaces (rooms, equipment, "ambientes") for named groups of people, rather than fixed one-on-one slots. Everything lives under the Scheduling menu.'=>'Os calendários de público-alvo servem para reservar espaços compartilhados (salas, equipamentos, "ambientes") para grupos específicos de pessoas, em vez de horários fixos individuais. Tudo isso fica acessível no menu de Agendamento.','Audience Custom Fields'=>'Campos Personalizados do Público-alvo','Audience custom fields'=>'Campos personalizados de público-alvo','Audience groups and the scheduling admin.'=>'Grupos de público-alvo e o administrador de agendamento.','Audience membership'=>'Membros do público-alvo','Audiences (groups)'=>'Públicos-alvo (grupos)','Audiences table not ready yet (will seed on next run).'=>'A tabela para o público-alvo ainda não está pronta (será distribuída na próxima edição).','Available for this form but currently off. Leave it off if your audience submits from shared devices (labs, kiosks); turn it on if each person submits from their own device and you want to prevent repeat issuances.'=>'Disponível para este formulário, mas atualmente desativado. Mantenha-o desativado se o seu público-alvo enviar respostas a partir de dispositivos compartilhados (laboratórios, quiosques); ative-o se cada pessoa enviar respostas do próprio dispositivo e você quiser evitar envios duplicados.','Built-in short URLs, redirects and QR codes.'=>'URLs curtas, redirecionamentos e QR Codes integrados.','Cached QR Codes:'=>'QR Codes em cache:','Change the URL a certificate QR code encodes.'=>'Altere a URL codificada no QR Code de um certificado.','Child audiences inherit fields from parent audiences'=>'Os públicos-alvo filhos herdam os campos dos públicos-alvo pais.','Clear all cached QR Codes?\\n\\nThey will be regenerated automatically when needed.'=>'Limpar todos os QR Codes armazenados em cache?\\n\\nEles serão regenerados automaticamente quando necessário.','Clear All QR Code Cache'=>'Limpar Todo o Cache de QR Codes','Color for the "Multiple audiences" badge shown in the event list when an event has more than 2 audiences.'=>'Cor do selo "Vários públicos-alvo" exibido na lista de eventos quando um evento tem mais de 2 públicos-alvo.','Configure how private audience calendars are displayed to non-logged-in visitors. Note: Scheduling is always restricted to authorized members.'=>'Configure como os calendários de público-alvo privado são exibidos para visitantes não autenticados. Observação: o agendamento é sempre restrito a membros autorizados.','Configure the built-in URL shortener. Short URLs redirect visitors and generate QR Codes.'=>'Configure o encurtador de URLs integrado. URLs curtas redirecionam os visitantes e geram QR Codes.','Copy this audience\'s option lists (departments, unions, work schedules…) to all child and grandchild audiences. Overwrites their current lists.'=>'Copie as listas de opções deste público-alvo (departamentos, sindicatos, horários de trabalho…) para todos os públicos-alvo filhos e netos. Isso sobrescreve as listas atuais deles.','Copy this audience\'s option lists to all child and grandchild audiences? This overwrites their current lists.'=>'Copiar as listas de opções deste público-alvo para todos os públicos-alvo filhos e netos? Isso sobrescreverá as listas atuais deles.','Create a campaign and link it to one or more audiences.'=>'Crie uma campanha e vincule-a a um ou mais públicos-alvo.','Create audiences and manage their members.'=>'Crie públicos-alvo e gerencie seus membros.','create audiences, schedules, environments and members.'=>'crie públicos-alvo, agendamentos, ambientes e membros.','Create certificate-issuance forms, generate the certificate PDF automatically on submission, and let anyone verify authenticity by QR code or validation link.'=>'Crie formulários de emissão de certificados, gere o PDF do certificado automaticamente após o envio e permita que qualquer pessoa verifique a autenticidade via QR Codes ou link de validação.','Custom fields from audience memberships. Fields are grouped by audience.'=>'Campos personalizados provenientes de associações de público-alvo. Os campos são agrupados por público-alvo.','Default QR code (uses settings from QR Code tab)'=>'QR Code padrão (usa as configurações da aba QR Code)','Default QR Code Margin'=>'Margem Padrão do QR Code','Default QR Code Size'=>'Tamanho Padrão do QR Code','Default settings for QR Code generation in certificates.'=>'Configurações padrão para geração de QR Code em certificados.','Delete audiences'=>'Excluir públicos-alvo','Disables the built-in short URLs, redirects and QR codes.'=>'Desativa as URLs curtas, os redirecionamentos e os QR Codes integrados.','Displays the audience scheduling calendar for group bookings.'=>'Exibe o calendário de agendamento de público-alvo para reservas de grupo.','Enable debug logging for QR code generation'=>'Ative o registro de depuração para a geração de QR Code','Enable QR Code Cache'=>'Ativar Cache de QR Code','Every certificate carries a QR code and a validation link; anyone can confirm it is genuine, and the holder gets a one-click "magic link" to re-download.'=>'Cada certificado contém um QR Code e um link de validação; qualquer pessoa pode confirmar sua autenticidade, e o titular recebe um "link mágico" de um clique para baixá-lo novamente.','Every email the plugin sends — certificate delivery, admin notifications, recruitment convocations, booking confirmations, reregistration invitations, audience notices — goes through one shared pipeline with one configurable look.'=>'Todos os e-mails enviados pelo plugin — entrega de certificados, notificações para administradores, convocações de recrutamento, confirmações de agendamento, convites para recadastramento, avisos ao público-alvo — passam por um fluxo único e compartilhado, com um visual configurável.','Failed to load QR Code'=>'Falha ao carregar o QR Code','FFC Appointments - Manager'=>'FFC Agendamentos - Gestor','FFC Audiences - Manager'=>'FFC Público-alvo - Gestor','FFC Calendars - Manager'=>'FFC Calendários - Gestor','FFC Certificates - Manager'=>'FFC Certificados - Gestor','FFC Forms - Manager'=>'FFC Formulários - Gestor','FFC Recruitment - Manager'=>'FFC Recrutamento - Gestor','FFC Reregistration - Manager'=>'FFC Recadastramento - Gestor','FFC Settings'=>'Configurações FFC','Free Form Certificate turns WordPress into a complete platform for issuing verifiable documents. Build a form, design the certificate once, and let people receive a signed PDF the moment they submit — validated by QR code or a public link, protected against fraud and duplicate issuance, and delivered by email automatically.'=>'O Free Form Certificate transforma o WordPress em uma plataforma completa para a emissão de documentos verificáveis. Crie um formulário, projete o certificado uma única vez e permita que as pessoas recebam um PDF assinado assim que enviarem os dados — validado por QR Code ou link público, protegido contra fraudes e emissões duplicadas, e entregue automaticamente por e-mail.','Higher = fewer false positives, but easier to evade (a device only needs to differ on a few strong signals to escape). Lower = closer to the old behavior and more aggressive. 0 disables the strong tier entirely (block on the raw threshold alone — the legacy behavior that over-blocked homogeneous audiences). Submissions that cannot emit this many strong signals (e.g. privacy browsers blocking canvas/WebGL) fall back to the cookie only and are never blocked on weak signals alone. Default is 2.'=>'Um valor mais alto resulta em menos falsos positivos, mas torna a detecção mais fácil de burlar (basta que um dispositivo difira em alguns sinais fortes para escapar). Um valor mais baixo aproxima o sistema do comportamento anterior e o torna mais agressivo. O valor 0 desativa completamente a camada de sinais fortes (o bloqueio baseia-se apenas no limite bruto — o comportamento legado que bloqueava excessivamente públicos-alvo homogêneos). Envios que não conseguem emitir essa quantidade de sinais fortes (por exemplo, navegadores focados em privacidade que bloqueiam *canvas* ou WebGL) recorrem apenas ao uso de cookies e nunca são bloqueados com base apenas em sinais fracos. O valor padrão é 2.','Higher levels allow more damage to QR Code but create denser patterns.'=>'Níveis mais altos permitem mais danos ao QR Code, mas geram padrões mais densos.','How audience badges are displayed. "Name only" shows just the audience name. "Parent: Name" prefixes with the parent category when available.'=>'Como os crachás de público-alvo são exibidos. "Somente nome" mostra apenas o nome do público-alvo. "Categoria principal: Nome" adiciona o prefixo da categoria principal, quando disponível.','Improves performance by caching QR Codes. Increases database size (~4KB per submission).'=>'Melhora o desempenho armazenando QR Codes em cache. Aumenta o tamanho do banco de dados (aproximadamente 4 KB por envio).','Limit submissions from the same physical device by combining a persistent cookie with multiple browser signals. Two visits count as the same device when (a) their cookie matches, or (b) they match at least the threshold number of signals AND at least the minimum number of STRONG signals. The strong-signal tier prevents false blocks across same-model devices in homogeneous audiences, where weak signals (browser/OS/screen/timezone) are identical between different people.'=>'Limite envios provenientes do mesmo dispositivo físico combinando um cookie persistente com múltiplos sinais do navegador. Duas visitas são contabilizadas como sendo do mesmo dispositivo quando (a) seus cookies coincidem ou (b) elas correspondem a, pelo menos, o número limite de sinais E, simultaneamente, ao número mínimo de sinais FORTES. A camada de sinais fortes evita bloqueios indevidos entre dispositivos do mesmo modelo em públicos-alvo homogêneos, nos quais sinais fracos (navegador, sistema operacional, tela, fuso horário) são idênticos para pessoas diferentes.','Logs QR-code asset resolution, cache hits, and URL composition.'=>'Registra a resolução de recursos de QR Code, acessos ao cache e composição de URLs.','Manage audiences'=>'Gerenciar públicos-alvo','No white margin around QR code'=>'Sem margem branca ao redor do QR Code','Notice shown at the end of the reregistration form and printed on the record PDF. Use "Replicate lists to children" to push it to descendant audiences.'=>'Aviso exibido no final do formulário de recadastramento e impresso na ficha PDF. Use "Replicar listas para filhos" para enviá-lo aos públicos-alvo descendentes.','On top of the threshold above, at least this many STRONG signals (canvas, WebGL, audio, fonts, plugins, permissions) must match before two visits count as the same device. Strong signals rarely coincide between different physical devices, so requiring them is what stops false blocks across same-model devices in a homogeneous audience.'=>'Além do limite mencionado, é necessário que pelo menos essa quantidade de sinais FORTES (canvas, WebGL, áudio, fontes, plugins, permissões) coincida para que duas visitas sejam contabilizadas como provenientes do mesmo dispositivo. Sinais fortes raramente coincidem entre dispositivos físicos diferentes; portanto, exigi-los é o que evita bloqueios indevidos de dispositivos do mesmo modelo em um público-alvo homogêneo.','Optionally store generated QR codes in the database (roughly 4 KB per submission) so they are not re-rendered on every PDF. A "Clear all QR-code cache" button flushes them. Statistics show how many codes are cached and their total size.'=>'Opcionalmente, armazene os QR Codes gerados no banco de dados (aproximadamente 4 KB por envio) para evitar que sejam renderizados novamente a cada PDF. Um botão "Limpar cache de QR Codes" realiza a limpeza desses dados. As estatísticas exibem a quantidade de códigos em cache e o tamanho total ocupado por eles.','Personal appointment calendars (fixed slots) and audience calendars for shared spaces (free-form bookings), each with confirmations, reminders and ICS invites.'=>'Agendas de compromissos pessoais (horários fixos) e agendas de público-alvo para espaços compartilhados (reservas de formato livre), cada uma com confirmações, lembretes e convites ICS.','Placeholders replaced with sample data. QR code shown as placeholder.'=>'Placeholders substituídos por dados de exemplo. QR Code exibido como placeholder.','Pure relationships (audience memberships, permission grants, the stored user profile) are removed with the account.'=>'Relacionamentos puros (associações a públicos-alvo, concessões de permissão, perfil de usuário armazenado) são removidos juntamente com a conta.','QR Code'=>'QR Code','QR Code Cache'=>'Cache de QR Code','QR Code Defaults'=>'Configurações Padrão do QR Code','QR Code too large/small'=>'QR Code muito grande/pequeno','QR Codes are also available over REST for external automations:'=>'Os QR Codes também estão disponíveis via REST para automações externas:','QR Codes will be regenerated automatically when needed. This action is safe and reversible.'=>'Os QR Codes serão regenerados automaticamente quando necessário. Essa ação é segura e reversível.','QR generation failed.'=>'A geração do QR Code falhou.','QR-code cache'=>'Cache de QR Code','Removes audience groups and the scheduling admin.'=>'Remove grupos de público-alvo e o administrador de agendamento.','Requires JavaScript and HTTPS. A visitor with JavaScript disabled cannot submit the form at all — acceptable when the audience is known, such as staff filling in forms on a workstation.'=>'Requer JavaScript e HTTPS. Um visitante com o JavaScript desativado não consegue enviar o formulário de forma alguma — o que é aceitável quando o público-alvo é conhecido, como funcionários preenchendo formulários em uma estação de trabalho.','schedule_id/environment_id of 0 show everything the visitor may access; view is month or week. Bookings are made through the plugin\'s REST API and can target one or more audiences or an individual, and are cancelled with a required reason.'=>'`schedule_id`/`environment_id` igual a 0 exibe tudo o que o visitante pode acessar; a visualização é mensal ou semanal. As reservas são realizadas por meio da API REST do plugin, podem ser direcionadas a um ou mais públicos-alvo ou a um indivíduo, e são canceladas mediante a obrigatoriedade de informar o motivo.','See Audience Calendars'=>'Ver calendários de público-alvo','See Audience Custom Fields'=>'Ver campos personalizados de público-alvo','Short URL & QR Code'=>'URL Curta e QR Code','Short URL QR Code (base64)'=>'QR Code de URL curta (base64)','Store generated QR Codes in database'=>'Armazene os QR Codes gerados no banco de dados.','Store generated QR Codes in database to avoid regenerating them on each request.'=>'Armazene os QR Codes gerados no banco de dados para evitar regenerá-los a cada solicitação.','The list & QR codes'=>'A lista e os QR Codes','The list shows each link\'s title, short URL, destination, click count and status, with actions to show a QR code, enable/disable, or trash (trashed links can be restored or permanently deleted). Each link has a QR code (PNG or SVG download) that encodes the short URL itself, so scanning it is also counted.'=>'A lista exibe o título, a URL curta, o destino, a contagem de cliques e o status de cada link, com opções para exibir o QR Code, ativar/desativar ou enviar para a lixeira (links na lixeira podem ser restaurados ou excluídos permanentemente). Cada link possui um QR Code (disponível para download em PNG ou SVG) que codifica a própria URL curta; assim, a leitura do código também é contabilizada.','The member form itself is gated by login + audience membership, not a capability.'=>'O formulário de membro em si é protegido por login e associação a um público-alvo, não por uma permissão.','The QR code can be customized with various attributes:'=>'O QR Code pode ser personalizado com diversos atributos:','The QR code embedded in the PDF points at the same magic link.'=>'O QR Code incorporado ao PDF aponta para o mesmo link mágico.','There is no separate reregistration shortcode. Active campaigns appear as a banner on the member\'s personal dashboard (the user_dashboard_personal shortcode); the form loads and submits there over AJAX. Members are targeted by audience membership, not by matching a CPF/RF. On submit, the plugin generates an authentication code and a Record magic link, syncs mapped fields to the user profile, and sends the confirmation email.'=>'Não existe um shortcode separado para o recadastramento. Campanhas ativas aparecem como um banner no painel pessoal do membro (o shortcode `user_dashboard_personal`); o formulário é carregado e enviado nesse local via AJAX. A segmentação dos membros baseia-se na participação em públicos-alvo, e não na correspondência de CPF/RF. Ao realizar o envio, o plugin gera um código de autenticação e um link mágico da Ficha, sincroniza os campos mapeados com o perfil do usuário e envia o e-mail de confirmação.','This plugin allows you to create certificate issuance forms, generate PDFs automatically, and verify authenticity with QR codes.'=>'Este plugin permite criar formulários de emissão de certificados, gerar PDFs automaticamente e verificar a autenticidade com QR Codes.','This text is suggested by the Free Form Certificate plugin to help you describe how it processes personal data. Review and adapt it to your organisation and to the modules you actually use (form submissions and certificates, appointment scheduling, audiences, re-registration and recruitment). Delete any section that does not apply.'=>'Este texto é sugerido pelo plugin Free Form Certificate para ajudar você a descrever como ele processa dados pessoais. Revise-o e adapte-o à sua organização e aos módulos que você realmente utiliza (envio de formulários e certificados, agendamento de horários, públicos-alvo, recadastramento e recrutamento). Exclua qualquer seção que não se aplique.','Unlike personal calendars, an audience booking has a free start/end time. Two bookings that overlap the same environment are a hard conflict (blocked); overlaps for the same audience or user are soft conflicts the booker can acknowledge. Each booking needs a short description (15–300 characters).'=>'Ao contrário das agendas pessoais, uma reserva de público-alvo não possui horários de início e término fixos. Duas reservas que se sobrepõem no mesmo ambiente geram um conflito crítico (bloqueio); sobreposições envolvendo o mesmo público-alvo ou usuário constituem conflitos leves, que podem ser validados por quem realiza a reserva. Cada reserva requer uma breve descrição (de 15 a 300 caracteres).','view the list and download QR codes.'=>'Visualize a lista e baixe os QR Codes.','view the Scheduling menu and audience pages.'=>'visualize o menu de agendamento e as páginas de público-alvo.','When enabled, all descendant audiences inherit this setting. Users can join up to 2 child groups.'=>'Quando ativada, essa configuração é herdada por todos os públicos-alvo descendentes. Os usuários podem participar de até 2 grupos filhos.','When enabled, audience same-day and user overlap checks only consider bookings within this calendar. Environment conflicts are always per-environment regardless of this setting.'=>'Quando ativado, as verificações de público-alvo no mesmo dia e sobreposição de membros consideram apenas agendamentos dentro deste calendário. Conflitos de ambiente são sempre por ambiente, independentemente desta configuração.','White space around QR Code in modules. 0 = no margin, higher values = more white space.'=>'Espaço em branco ao redor do QR Code nos módulos. 0 = sem margem, valores maiores = mais espaço em branco.','Outside the audience'=>'Fora do público-alvo','Design and generate QR codes'=>'Crie e gere QR Codes','Style the QR codes on certificates and short URLs (shapes, colours, logo, frame), and draw standalone codes for a website, Wi-Fi, contact card, event and more with the QR Code Generator.'=>'Personalize os QR Codes dos certificados e das URLs curtas (formatos, cores, logotipo, moldura) e crie códigos avulsos para site, Wi-Fi, cartão de contato, evento e mais com o Gerador de QR Code.','This cache covers certificate QR codes only. Short URLs cache their own QR codes separately, with no setting and no manual clearing.'=>'Este cache cobre apenas os QR Codes dos certificados. As URLs curtas armazenam seus próprios QR Codes separadamente, sem configuração e sem limpeza manual.','The {{qr_code}} image follows the design set in Settings → QR Code (module shape, colours, logo, frame) when that design is switched on for certificates; otherwise a plain black-and-white code is drawn.'=>'A imagem de {{qr_code}} segue o design definido em Configurações → QR Code (formato dos módulos, cores, logotipo, moldura) quando esse design está ativado para certificados; caso contrário, é gerado um código simples em preto e branco.','%1$s — %2$s (%3$s)'=>'%1$s — %2$s (%3$s)','(offer only notices in that list; with a fixed notice, show a "not published" message while the notice is not in that list).'=>'(oferece só editais com essa lista; com um edital fixo, mostra uma mensagem de "não publicada" enquanto o edital não estiver nessa lista).','(the notice chosen in the selector),'=>'(o edital escolhido no seletor),','Definitive list'=>'Lista definitiva','No notices are published yet.'=>'Ainda não há editais publicados.','Paste it into a page or post to publish this notice\'s classification. For a selector with every published notice, use %s.'=>'Cole numa página ou post para publicar a classificação deste edital. Para um seletor com todos os editais publicados, use %s.','Select a notice'=>'Selecione um edital','Select a notice to see its classification.'=>'Selecione um edital para ver a classificação.','Show on the site'=>'Exibir no site','The definitive list for this notice has not been published yet.'=>'A lista definitiva deste edital ainda não foi publicada.','The list attribute must be "preliminary" or "definitive".'=>'O atributo list deve ser "preliminary" ou "definitive".','The preliminary list for this notice is no longer available.'=>'A lista prévia deste edital não está mais disponível.','Without a notice:'=>'Sem edital:','shows a selector of every notice in its preliminary or definitive list (drafts and closed notices are left out); the visitor picks one and its list appears below. With a single notice on offer it opens directly. The notice edit screen has the shortcode ready to copy.'=>'mostra um seletor com todos os editais em lista prévia ou definitiva (rascunhos e editais encerrados ficam de fora); o visitante escolhe um e a lista dele aparece abaixo. Com um único edital disponível, ele abre direto. A tela de edição do edital traz o shortcode pronto para copiar.','the public classification list for a notice. Shows only the columns the notice marks public. Accepts an optional adjutancy="slug" attribute, and honors the ?q (name search), ?adjutancy, ?subscription (pcd/geral) and ?page_top / ?page_bottom URL filters. The "Show on the site" card on the notice edit screen has it ready to copy.'=>'a lista pública de classificação de um edital. Mostra só as colunas que o edital marca como públicas. Aceita o atributo opcional adjutancy="slug" e respeita os filtros de URL ?q (busca por nome), ?adjutancy, ?subscription (pcd/geral) e ?page_top / ?page_bottom. O card "Exibir no site" na tela de edição do edital traz o shortcode pronto para copiar.','without a notice, a selector of every notice in its preliminary or definitive list; drafts and closed notices are left out. The chosen notice\'s list appears below it. Add list="preliminary" or list="definitive" to offer only one kind.'=>'sem edital, um seletor com todos os editais em lista prévia ou definitiva; rascunhos e editais encerrados ficam de fora. A lista do edital escolhido aparece abaixo. Adicione list="preliminary" ou list="definitive" para oferecer só um tipo.','The history keeps the last %d days. Older runs and their deliveries are removed automatically by the daily run.'=>'O histórico guarda os últimos %d dias. Execuções mais antigas e as entregas delas são apagadas automaticamente pela execução diária.','The history keeps the last 365 days: each daily run removes older runs together with their deliveries, even while e-mails are disabled. A message can never go out twice because of it, since a delivery is recorded per date including its year.'=>'O histórico guarda os últimos 365 dias: cada execução diária apaga as execuções mais antigas junto com as entregas delas, mesmo com os e-mails desativados. Isso nunca faz uma mensagem sair duas vezes, porque cada entrega é registrada por data, incluindo o ano.','A person receives the message when they belong to any audience on the right; members of sub-audiences are included. With none selected, the rule reaches everyone.'=>'A pessoa recebe a mensagem quando pertence a qualquer público da direita; membros de sub-públicos estão incluídos. Sem nenhum selecionado, a regra alcança todos.','All active rules'=>'Todas as regras ativas','All of the rule\'s audiences'=>'Todos os públicos da regra','Everyone, or the members of the audiences chosen in the two-column picker — the same one the reregistration campaign uses. Belonging to any one of them is enough, and members of their sub-audiences are included; choosing an audience brings its sub-audiences along.'=>'Todos, ou os membros dos públicos escolhidos no seletor de duas colunas — o mesmo usado na campanha de recadastramento. Basta pertencer a um deles, e membros dos sub-públicos estão incluídos; escolher um público traz junto os sub-públicos dele.','Lists the birthdays in the next 7 or 30 days or in a chosen month, by day and month. It can be narrowed to one active rule, and then to one of that rule\'s audiences; with no rule chosen, the audience filter offers those of every active rule. An Audiences column names which of them each person belongs to. The tab is shown only to holders of ffc_view_date_messages_pii and administrators.'=>'Lista os aniversários dos próximos 7 ou 30 dias ou de um mês escolhido, por dia e mês. Pode ser filtrada por uma regra ativa e, depois, por um dos públicos dessa regra; sem regra escolhida, o filtro de público oferece os de todas as regras ativas. Uma coluna Públicos mostra a quais deles cada pessoa pertence. A aba aparece só para quem tem ffc_view_date_messages_pii e para administradores.','QR Code in the Certificate'=>'QR Code no Certificado','See the QR Code Generator'=>'Veja o Gerador de QR Code','Their design follows Settings → QR Code when it is applied to short URLs.'=>'O design deles segue Configurações → QR Code quando aplicado às URLs curtas.','See QR Code settings'=>'Veja as configurações de QR Code','Short URLs created here'=>'URLs curtas criadas aqui','This is where manual short URLs are made: the Short URLs list has no form of its own, and its "New short URL" button opens the generator on the Website type. A short URL created here appears on the list like any other and counts the clicks of the printed code.'=>'É aqui que as URLs curtas manuais são criadas: a lista de URLs Curtas não tem formulário próprio, e o botão "Nova URL curta" abre o gerador no tipo Site. Uma URL curta criada aqui aparece na lista como qualquer outra e conta os cliques do código impresso.','See Short URLs'=>'Veja URLs Curtas','The design sections are the same as on Settings → QR Code, and start from the global design (or from the user\'s last downloaded one) whether or not it is applied to certificates or short URLs there. A change made in the generator applies to this code only and never alters the global settings; the QR Code defaults for size, margin and error correction do not apply here either, since each code sets its own.'=>'As seções de design são as mesmas de Configurações → QR Code e partem do design global (ou do último baixado pelo usuário), esteja ele aplicado ou não a certificados ou URLs curtas. Uma alteração feita no gerador vale só para este código e nunca muda as configurações globais; os padrões de tamanho, margem e correção de erros do QR Code também não se aplicam aqui, pois cada código define os seus.','Global QR Code settings'=>'Configurações globais de QR Code','The certificate PDF draws this code with the plugin-wide settings on Settings → QR Code: their defaults fill in any attribute the placeholder leaves out, and their design is used when it is applied to certificates.'=>'O PDF do certificado desenha este código com as configurações gerais do plugin em Configurações → QR Code: os padrões preenchem qualquer atributo que o placeholder omitir, e o design é usado quando está aplicado a certificados.','These settings apply plugin-wide, to every QR code the plugin draws by itself: the {{qr_code}} placeholder of the certificate PDF, and the QR codes of short URLs. The one exception is the QR Code Generator under Short URLs, where each code is designed by hand: it only starts from the global design, and nothing changed there is saved back.'=>'Estas configurações valem para o plugin inteiro, em todo QR Code que o plugin desenha sozinho: o placeholder {{qr_code}} do PDF do certificado e os QR Codes das URLs curtas. A única exceção é o Gerador de QR Code em URLs Curtas, onde cada código é desenhado à mão: ele apenas parte do design global, e nada alterado lá é gravado de volta.','The attributes the {{qr_code}} placeholder can set for itself are listed under'=>'Os atributos que o placeholder {{qr_code}} pode definir por conta própria estão listados em','Reveal the email to edit it.'=>'Revele o e-mail para editá-lo.','On the edit screen the CPF/RF and the email start masked for everyone, administrators included. An operator who may see them uses Reveal to fetch the value, and every reveal writes an Activity Log entry while the Activity Log is on. The email can be edited only after it is revealed; saving without revealing it keeps the stored address.'=>'Na tela de edição, o CPF/RF e o e-mail começam mascarados para todos, inclusive administradores. Quem tem permissão para vê-los usa Revelar para buscar o valor, e cada revelação grava uma entrada no Log de Atividades enquanto ele estiver ligado. O e-mail só pode ser editado depois de revelado; salvar sem revelá-lo mantém o endereço gravado.','Administrators (manage_options) hold all of the above and, like the certificates admin role, see personal data unmasked on the list without a reveal step; the edit screen masks it for them too. See Capabilities & Roles.'=>'Administradores (manage_options) possuem todas as permissões acima e, assim como a função de administrador de certificados, veem os dados pessoais sem máscara na lista, sem a etapa de revelação; a tela de edição também os mascara para eles. Veja Capacidades e Funções.','In the form editor each tab opens into collapsible sections whose chip says On/Off, or the schedule, while closed, and each tab carries a dot that follows its switches. A summary box in the sidebar shows what the saved form does, the shortcode has a Copy button, and the registered locations of a geofence are picked with checkboxes.'=>'No editor de formulário, cada aba se abre em seções recolhíveis cujo indicador mostra Ligado/Desligado, ou o agendamento, quando fechadas, e cada aba tem um ponto que acompanha seus interruptores. Uma caixa de resumo na barra lateral mostra o que o formulário salvo faz, o shortcode tem um botão Copiar e os locais cadastrados de uma cerca geográfica são escolhidos por caixas de seleção.','Certificates → Dashboard opens with a summary row (forms in the month shown, submissions today and over the last 7 days, GeoFence windows open now) above a calendar of forms by GeoFence start date, or by publication date when a form has none. Picking a day lists its forms beside the calendar. It needs ffc_view_certificates.'=>'Certificados → Painel abre com uma linha de resumo (formulários no mês exibido, submissões de hoje e dos últimos 7 dias, janelas de GeoFence abertas agora) acima de um calendário de formulários pela data de início da GeoFence, ou pela data de publicação quando o formulário não tem uma. Escolher um dia lista seus formulários ao lado do calendário. Requer ffc_view_certificates.','The record sits beside a side panel with Save, the magic link with a Copy button, an Open certificate button that opens the public certificate page in a new tab, and the linked user.'=>'O registro fica ao lado de um painel lateral com Salvar, o link mágico com um botão Copiar, um botão Abrir certificado que abre a página pública do certificado em uma nova aba, e o usuário vinculado.','Body appearance'=>'Aparência do corpo','Only the body of this message changes; the header and footer stay the Email Model\'s. Fields left empty follow the Email Model.'=>'Só o corpo desta mensagem muda; o cabeçalho e o rodapé continuam os do Modelo de e-mail. Campos vazios seguem o Modelo de e-mail.','Background image'=>'Imagem de fundo','Choose a background image'=>'Escolha uma imagem de fundo','Choose image'=>'Escolher imagem','It covers the whole body, anchored on the side the text leaves free. Recommended: %d px wide (the Email Model width), up to 200 KB, with the strong details away from the text.'=>'Ela cobre o corpo inteiro, ancorada no lado que o texto deixa livre. Recomendado: %d px de largura (a largura do Modelo de e-mail), até 200 KB, com os detalhes fortes longe do texto.','Fallback colour'=>'Cor de fundo de reserva','Required with an image. It is what Outlook on Windows and readers that block images show instead of the image.'=>'Obrigatória com imagem. É o que o Outlook no Windows e os leitores que bloqueiam imagens mostram no lugar da imagem.','Text colour'=>'Cor do texto','Contrast %s:1 with the fallback colour.'=>'Contraste %s:1 com a cor de reserva.','Contrast %s:1 with the fallback colour: below 4.5:1, hard to read.'=>'Contraste %s:1 com a cor de reserva: abaixo de 4,5:1, difícil de ler.','Text position'=>'Posição do texto','Full width'=>'Largura total','On the left'=>'À esquerda','On the right'=>'À direita','Text area width'=>'Largura da área de texto','Used when the text sits on one side. On phones the text takes the full width, over the image.'=>'Usada quando o texto fica de um lado. No celular o texto ocupa a largura toda, sobre a imagem.','Preview message'=>'Ver prévia da mensagem','Computer'=>'Computador','Message preview'=>'Prévia da mensagem','Sample values; images load as most readers show them. Outlook on Windows and readers that block images show the fallback colour instead.'=>'Valores de exemplo; as imagens carregam como a maioria dos leitores as mostra. O Outlook no Windows e os leitores que bloqueiam imagens mostram a cor de reserva no lugar.','Colours must be written as #RRGGBB.'=>'As cores devem ser escritas como #RRGGBB.','Unknown text position.'=>'Posição do texto desconhecida.','Unknown text area width.'=>'Largura da área de texto desconhecida.','The background must be an image from the Media Library.'=>'O fundo deve ser uma imagem da Biblioteca de Mídia.','Choose a fallback colour: it is what readers that do not load the image will see.'=>'Escolha uma cor de reserva: é o que verão os leitores que não carregam a imagem.','A rule can draw its message body over a background image from the Media Library, with a fallback colour, a text colour and the text on the left, on the right or across the whole width (taking 50, 60 or 70 per cent of it). Only the body changes: the header and footer stay the Email Model\'s, and the image fills the body edge to edge at the Email Model width, at least as tall as the image. On phones the text takes the full width, over the image.'=>'Uma regra pode desenhar o corpo da mensagem sobre uma imagem de fundo da Biblioteca de Mídia, com uma cor de reserva, uma cor de texto e o texto à esquerda, à direita ou na largura toda (ocupando 50, 60 ou 70 por cento dela). Só o corpo muda: o cabeçalho e o rodapé continuam os do Modelo de e-mail, e a imagem preenche o corpo de ponta a ponta na largura do Modelo de e-mail, com pelo menos a altura da imagem. No celular o texto ocupa a largura toda, sobre a imagem.','The fallback colour is required with an image: Outlook on Windows and readers that block images show it instead. The editor shows the contrast of the text against it; over the image itself, check it in "Preview message".'=>'A cor de reserva é obrigatória com imagem: o Outlook no Windows e os leitores que bloqueiam imagens a mostram no lugar. O editor mostra o contraste do texto com ela; sobre a própria imagem, confira em "Ver prévia da mensagem".','A Date Messages rule can give its own message body a background image, colours and a text column; the header, footer, width and padding stay the ones set here.'=>'Uma regra de Mensagens por Data pode dar ao corpo da própria mensagem uma imagem de fundo, cores e uma coluna de texto; o cabeçalho, o rodapé, a largura e o espaçamento continuam os definidos aqui.','"Preview recipients" lists, for a range of dates, everyone the rule would reach and the decision for each, using the very selection the send uses, so the preview cannot disagree with what is sent. Long lists show only the first rows, while the totals count everyone. "Preview message" shows the e-mail as it will be sent, header, body appearance and footer, at computer or phone width. "Send test to me" mails the message, filled with fictional values, to your own address. All three use the values on the form, saved or not, and none sends to anybody else. Only the test send is recorded: it shows in the history marked "Test", with who sent it, and it never counts as a delivery, so it cannot stop the real message from going out.'=>'"Prévia dos destinatários" lista, para um intervalo de datas, todos que a regra alcançaria e a decisão para cada um, usando a mesma seleção do envio, então a prévia não pode divergir do que é enviado. Listas longas mostram só as primeiras linhas, enquanto os totais contam todos. "Ver prévia da mensagem" mostra o e-mail como será enviado, com cabeçalho, aparência do corpo e rodapé, na largura de computador ou de celular. "Enviar teste para mim" envia a mensagem, preenchida com valores fictícios, para o seu próprio endereço. Os três usam os valores do formulário, salvos ou não, e nenhum envia para outra pessoa. Só o envio de teste fica registrado: aparece no histórico com o selo "Teste" e o nome de quem enviou, e nunca conta como entrega, então não impede que a mensagem real seja enviada.','Test'=>'Teste','by %s'=>'por %s','Hide test sends'=>'Ocultar envios de teste','Show test sends'=>'Mostrar envios de teste','(unsaved rule)'=>'(regra não salva)','Developed by %s.'=>'Desenvolvido por %s.','Source code and issue tracker: %s'=>'Código-fonte e relato de problemas: %s','Checking access…'=>'Verificando o acesso…','This content needs JavaScript to check your access.'=>'Este conteúdo precisa de JavaScript para verificar o seu acesso.','This content is not available at this time.'=>'Este conteúdo não está disponível neste momento.','This content is not available in your location.'=>'Este conteúdo não está disponível na sua localização.','This content is not available.'=>'Este conteúdo não está disponível.','(HH:MM),'=>'(HH:MM),','(YYYY-MM-DD),'=>'(AAAA-MM-DD),','(hide the block entirely, or the message shown instead of the content).'=>'(ocultar o bloco inteiro, ou a mensagem exibida no lugar do conteúdo).','(location ids from Settings → Geolocation),'=>'(IDs de locais de Configurações → Geolocalização),','(one continuous period instead of the same hours every day),'=>'(um período contínuo em vez do mesmo horário todos os dias),','(one-off areas, radius in meters),'=>'(áreas avulsas, raio em metros),','(which checks run, and whether GPS and IP must both pass),'=>'(quais verificações rodam, e se GPS e IP precisam passar os dois),','Limits:'=>'Limites:','See Shortcodes.'=>'Veja Shortcodes.','GPS coordinates come from the visitor\'s browser and can be faked, so a GPS check controls who sees the content, not who is allowed to: never put anything secret behind it. The date/time and IP checks are repeated on the server. The shortcode only works in the content of a page or post, not in widgets or templates.'=>'As coordenadas de GPS vêm do navegador do visitante e podem ser falsificadas, então uma verificação por GPS controla quem vê o conteúdo, não quem tem permissão: nunca coloque nada sigiloso atrás dela. As verificações de data/hora e de IP são repetidas no servidor. O shortcode só funciona no conteúdo de uma página ou post, não em widgets ou templates.','Place it in a page or post. The content is not in the page HTML: once the browser checks pass it is loaded from the server, which re-checks the date/time window and, when asked, the IP location. Without any location or area attribute, the default GPS and IP locations of Settings → Geolocation apply.'=>'Coloque-o em uma página ou post. O conteúdo não vai no HTML da página: quando as verificações do navegador passam, ele é carregado do servidor, que verifica de novo a janela de data/hora e, quando pedido, a localização por IP. Sem nenhum atributo de local ou área, valem os locais padrão de GPS e IP de Configurações → Geolocalização.','Shows the content between the tags only to a visitor inside a date/time window and/or inside an area, with the same checks as a geofenced form.'=>'Mostra o conteúdo entre as tags apenas ao visitante dentro de uma janela de data/hora e/ou dentro de uma área, com as mesmas verificações de um formulário com geofence.','The same building blocks protect page content: the [ffc_geofence] shortcode uses these locations, fallbacks and the administrator bypass.'=>'Os mesmos recursos protegem conteúdo de páginas: o shortcode [ffc_geofence] usa estes locais, os fallbacks e o bypass de administrador.','links on white'=>'links sobre o branco','hints on white'=>'dicas sobre o branco','errors on white'=>'erros sobre o branco','field borders on white'=>'bordas dos campos sobre o branco','Public Design'=>'Design Público','Public Design settings view file not found.'=>'Arquivo de visualização das configurações de Design Público não encontrado.','Accent (buttons, links and focus)'=>'Destaque (botões, links e foco)','Field borders'=>'Bordas dos campos','Hints and secondary text'=>'Dicas e texto secundário','Errors'=>'Erros','The look of every screen visitors see: forms, certificate verification, scheduling, audiences, the user dashboard and recruitment. The colours apply to the light theme; in dark mode the plugin keeps its own dark palette, whose contrast is already checked.'=>'A aparência de todas as telas que os visitantes veem: formulários, verificação de certificados, agendamento, públicos, o painel do usuário e o recrutamento. As cores valem para o tema claro; no modo escuro o plugin mantém a própria paleta escura, cujo contraste já é verificado.','Customise'=>'Personalizar','Use the colours, corners, width and font below'=>'Usar as cores, os cantos, a largura e a fonte abaixo','Off, the screens keep the plugin\'s own look and the values below are not used. Saving with it off puts them back to their defaults.'=>'Desligado, as telas mantêm a aparência do próprio plugin e os valores abaixo não são usados. Salvar com ele desligado devolve os valores aos padrões.','Default: %s'=>'Padrão: %s','The text on buttons is chosen for you, black or white, whichever reads best on the accent. A colour that reads poorly on white (below 4.5:1 for text, 3:1 for borders, as WCAG asks) is still saved, with a warning naming it.'=>'O texto dos botões é escolhido automaticamente, preto ou branco, o que for mais legível sobre o destaque. Uma cor pouco legível sobre o branco (abaixo de 4,5:1 para texto e 3:1 para bordas, como pede a WCAG) é salva mesmo assim, com um aviso que a nomeia.','Shape and Font'=>'Forma e Fonte','Rounded corners'=>'Cantos arredondados','Of the fields and buttons; 0 makes them square. Default: %1$d px, up to %2$d.'=>'Dos campos e botões; 0 os deixa retos. Padrão: %1$d px, até %2$d.','Form width'=>'Largura do formulário','The widest a form or verification card grows; its fields are 150 px narrower. On a narrower screen it fills the space it has. Default: %1$d px, from %2$d to %3$d.'=>'A largura máxima de um cartão de formulário ou de verificação; os campos ficam 150 px mais estreitos. Em uma tela mais estreita, ele ocupa o espaço disponível. Padrão: %1$d px, de %2$d a %3$d.','The site theme\'s'=>'A do tema do site','The plugin\'s (the system font)'=>'A do plugin (fonte do sistema)','Arial'=>'Arial','Settings → Public Design sets the look of every screen visitors see: forms, certificate verification, the CSV download, geofenced content, scheduling, audiences, the user dashboard and recruitment. It is off by default, and the screens keep the plugin\'s own look until it is switched on.'=>'Configurações → Design Público define a aparência de todas as telas que os visitantes veem: formulários, verificação de certificados, o download de CSV, conteúdo com geolocalização, agendamento, públicos, o painel do usuário e o recrutamento. Vem desligado, e as telas mantêm a aparência do próprio plugin até que seja ligado.','The accent of buttons, links and the focus outline, the field borders, hints and secondary text, and errors. The text on buttons is chosen automatically, black or white, whichever reads best on the accent. A colour that reads poorly on white (below 4.5:1 for text, 3:1 for borders, as WCAG asks) is still saved, with a warning naming it.'=>'O destaque de botões, links e do contorno de foco, as bordas dos campos, as dicas e o texto secundário, e os erros. O texto dos botões é escolhido automaticamente, preto ou branco, o que for mais legível sobre o destaque. Uma cor pouco legível sobre o branco (abaixo de 4,5:1 para texto e 3:1 para bordas, como pede a WCAG) é salva mesmo assim, com um aviso que a nomeia.','The colours apply to the light theme only. With Dark Mode on, the plugin keeps its own dark palette, because a colour chosen for a white page is often unreadable on a dark one.'=>'As cores valem só para o tema claro. Com o Modo Escuro ligado, o plugin mantém a própria paleta escura, porque uma cor escolhida para uma página branca costuma ficar ilegível numa escura.','The corner radius of fields and buttons (0 makes them square), the widest a form or verification card grows (its fields are 150 px narrower), and the font: the site theme\'s (the default), the plugin\'s system font, or Arial, the same three choices as Email Signature Generator and Institutional Email. These apply in both themes.'=>'O raio dos cantos de campos e botões (0 os deixa quadrados), a largura máxima de um formulário ou cartão de verificação (seus campos ficam 150 px mais estreitos) e a fonte: a do tema do site (padrão), a fonte do sistema do plugin ou Arial, as mesmas três opções do Email Signature Generator e do Institutional Email. Valem nos dois temas.','Cached pages'=>'Páginas em cache','The design is part of the page, so a page cache keeps the old look until it is purged. After changing it, purge the cache of the pages with forms.'=>'O design faz parte da página, então um cache de página mantém a aparência antiga até ser limpo. Depois de alterá-lo, limpe o cache das páginas com formulários.','%1$s (%2$s:1, at least %3$s:1)'=>'%1$s (%2$s:1, pelo menos %3$s:1)','The design was saved, but some colours are hard to read: %s'=>'O design foi salvo, mas algumas cores são difíceis de ler: %s','Screenshots'=>'Capturas de tela','Previous screenshot'=>'Captura anterior','Next screenshot'=>'Próxima captura','Zoom in'=>'Ampliar','Zoom out'=>'Reduzir','In your language, screenshots in place.'=>'No seu idioma, capturas na própria janela.','The tabs and the banner are shown in your language when the plugin ships a translation of them; the changelog stays in English. A screenshot opens larger without leaving the window: the arrows move between them, and the wheel, a pinch or a click zooms in.'=>'As abas e o banner aparecem no seu idioma quando o plugin traz uma tradução deles; o changelog continua em inglês. Uma captura abre ampliada sem sair da janela: as setas passam de uma para outra, e a roda do mouse, o gesto de pinça ou um clique aproximam a imagem.','%1$s accepts up to %2$s characters.'=>'%1$s aceita até %2$s caracteres.','%1$s accepts up to %2$s decimal places.'=>'%1$s aceita até %2$s casas decimais.','%1$s is out of range. %2$s'=>'%1$s está fora do intervalo. %2$s','%1$s needs at least %2$s characters.'=>'%1$s precisa de pelo menos %2$s caracteres.','%1$s of %2$s selected.'=>'%1$s de %2$s selecionadas.','%1$s: choose up to %2$s option.'=>'%1$s: escolha até %2$s opção.' . "\0" . '%1$s: escolha até %2$s opções.','%s has an answer that is not one of its options.'=>'%s tem uma resposta que não está entre as opções.','%s has an invalid answer.'=>'%s tem uma resposta inválida.','%s must be a valid date.'=>'%s precisa ser uma data válida.','%s must be a whole number.'=>'%s precisa ser um número inteiro.','%s or less.'=>'%s ou menos.','%s or more.'=>'%s ou mais.','%s: choose at least one option.'=>'%s: escolha pelo menos uma opção.','A date picked from a calendar, with an optional range.'=>'Uma data escolhida num calendário, com intervalo opcional.','A drop-down list: the participant picks one option.'=>'Uma lista suspensa: o participante escolhe uma opção.','A fixed value saved with every submission. The participant does not see it.'=>'Um valor fixo salvo em todo envio. O participante não o vê.','A number, with an optional range and decimal places.'=>'Um número, com intervalo e casas decimais opcionais.','A video, image or audio shown on the form. Collects nothing.'=>'Um vídeo, imagem ou áudio exibido no formulário. Não coleta nada.','Add option'=>'Adicionar opção','An email address, checked for format.'=>'Um endereço de e-mail, com o formato verificado.','At least %s characters.'=>'Pelo menos %s caracteres.','Between %1$s and %2$s characters.'=>'Entre %1$s e %2$s caracteres.','Between %1$s and %2$s.'=>'Entre %1$s e %2$s.','Choose at least one option.'=>'Escolha pelo menos uma opção.','Choose up to %s option.'=>'Escolha até %s opção.' . "\0" . 'Escolha até %s opções.','Decimal places'=>'Casas decimais','Earliest date'=>'Data mais antiga','Empty means no limit. Once it is reached, the other boxes are disabled.'=>'Vazio = sem limite. Ao atingi-lo, as demais caixas ficam desabilitadas.','Empty means no limit. The participant sees the range.'=>'Vazio = sem limite. O participante vê o intervalo.','Empty means no minimum, and the server ceiling for the maximum: %1$s characters for Text, %2$s for Textarea. The participant sees the limits you set.'=>'Vazio = sem mínimo e, no máximo, o teto do servidor: %1$s caracteres para Texto, %2$s para Área de texto. O participante vê os limites que você definir.','Every option visible: the participant picks exactly one.'=>'Todas as opções visíveis: o participante escolhe exatamente uma.','Every option visible: the participant ticks one or more. "Required" means at least one.'=>'Todas as opções visíveis: o participante marca uma ou mais. "Obrigatório" exige pelo menos uma.','From %s.'=>'A partir de %s.','Latest date'=>'Data mais recente','Maximum'=>'Máximo','Maximum characters'=>'Máximo de caracteres','Maximum selections'=>'Máximo de seleções','Minimum'=>'Mínimo','Minimum characters'=>'Mínimo de caracteres','One line, up to %s characters. For names, roles, codes.'=>'Uma linha, até %s caracteres. Para nomes, cargos, códigos.','Option'=>'Opção','Options (one per row):'=>'Opções (uma por linha):','Remove option'=>'Remover opção','Several lines, up to %s characters. For explanations and comments.'=>'Várias linhas, até %s caracteres. Para justificativas e comentários.','Shuffle the options for each participant'=>'Embaralhar as opções para cada participante','Text shown on the form. Collects nothing.'=>'Texto exibido no formulário. Não coleta nada.','Untick one to choose another.'=>'Desmarque uma para escolher outra.','Until %s.'=>'Até %s.','Up to %s characters.'=>'Até %s caracteres.','Single-line text, up to 255 characters — for names, roles, codes. Optional minimum and maximum length.'=>'Texto em uma linha, até 255 caracteres — para nomes, cargos, códigos. Mínimo e máximo de caracteres opcionais.','Numeric input. Optional minimum, maximum and decimal places (whole numbers by default).'=>'Campo numérico. Mínimo, máximo e casas decimais opcionais (números inteiros por padrão).','Date picker. Optional earliest and latest date.'=>'Seletor de data. Data mais antiga e mais recente opcionais.','Multi-line text, up to 2,000 characters — for explanations and comments. Optional minimum and maximum length.'=>'Texto em várias linhas, até 2.000 caracteres — para justificativas e comentários. Mínimo e máximo de caracteres opcionais.','Dropdown — one option per row. Can carry quiz points.'=>'Lista suspensa — uma opção por linha. Pode ter pontos no quiz.','Radio buttons — one option per row; the participant picks exactly one. Can carry quiz points.'=>'Botões de seleção única — uma opção por linha; o participante escolhe exatamente uma. Pode ter pontos no quiz.','Checkboxes — one option per row; the participant ticks one or more, up to an optional maximum. "Required" means at least one. Not scored in quiz mode.'=>'Caixas de seleção — uma opção por linha; o participante marca uma ou mais, até um máximo opcional. "Obrigatório" exige pelo menos uma. Não pontua no modo quiz.','Options and limits'=>'Opções e limites','Options are edited one per row, so an option may contain a comma. Drag a row to reorder it; Enter in an option adds the next one. A form saved before keeps working and is converted on its next save.'=>'As opções são editadas uma por linha, então uma opção pode conter vírgula. Arraste uma linha para reordená-la; Enter numa opção adiciona a próxima. Um formulário salvo antes continua funcionando e é convertido no próximo salvamento.','"Shuffle the options for each participant" puts a choice field\'s options in a random order in the browser, so a cached page still shows each participant a different order.'=>'"Embaralhar as opções para cada participante" coloca as opções de um campo de escolha em ordem aleatória no navegador, então mesmo uma página em cache mostra a cada participante uma ordem diferente.','The participant sees the limits you set — "Between 50 and 2,000 characters.", "Choose up to 3 options.", "Between 01/01/1800 and 31/12/1999." — and a live character counter under text fields.'=>'O participante vê os limites que você definir — "Entre 50 e 2.000 caracteres.", "Escolha até 3 opções.", "Entre 01/01/1800 e 31/12/1999." — e um contador de caracteres ao vivo sob os campos de texto.','The server checks every rule again on submit — a required answer, the length, the range, the number of options ticked and that each answer is one of the options — and refuses the submission listing every problem at once. The browser is a courtesy, never the guard.'=>'O servidor confere cada regra de novo no envio — resposta obrigatória, tamanho, intervalo, quantidade de opções marcadas e se cada resposta está entre as opções — e recusa o envio listando todos os problemas de uma vez. O navegador é uma cortesia, nunca a proteção.','%1$s: enter the full name — at least two words and %2$s characters.'=>'%1$s: informe o nome completo — pelo menos duas palavras e %2$s caracteres.','Add a field whose variable name is the tag without braces.'=>'Adicione um campo cujo nome da variável seja a etiqueta sem as chaves.','Certificates settings view file not found.'=>'Arquivo de visualização das configurações de Certificados não encontrado.','Enter a valid email address.'=>'Informe um e-mail válido.','Enter the first and last name.'=>'Informe o nome e o sobrenome.','First and last name.'=>'Nome e sobrenome.','Required certificate tag'=>'Etiqueta obrigatória do certificado','Settings → Certificates'=>'Configurações → Certificados','Warning! These required certificate tags have no field in the form:'=>'Atenção! Estas etiquetas obrigatórias do certificado não têm campo no formulário:','What every certificate form must carry. The certificate HTML editor\'s colour theme is on the General tab, next to Dark Mode.'=>'O que todo formulário de certificado precisa ter. O tema de cores do editor HTML do certificado fica na aba Geral, ao lado do Modo Escuro.','One tag per line (with braces). Every certificate layout must contain them, and every form must have a field for each one the participant fills in; the form editor highlights those fields and does not let them be renamed or removed. {{auth_code}} is always required — certificate verification depends on it — and the plugin generates it, so it needs no field.'=>'Uma etiqueta por linha (com as chaves). Todo layout de certificado precisa contê-las, e todo formulário precisa de um campo para cada uma que o participante preenche; o editor de campos destaca esses campos e não deixa renomeá-los nem removê-los. {{auth_code}} é sempre obrigatória — a verificação do certificado depende dela — e o plugin a gera, então ela não precisa de campo.','the participant\'s full name (required): at least two words and 4 characters, checked in the browser and on the server.'=>'o nome completo do participante (obrigatório): pelo menos duas palavras e 4 caracteres, conferido no navegador e no servidor.','the participant\'s email (required); used to deliver the certificate. An address that is not valid is refused as such, not as a missing one.'=>'o e-mail do participante (obrigatório); usado para entregar o certificado. Um endereço inválido é recusado como inválido, e não como ausente.','A field whose tag is a required certificate tag (Settings → Certificates) is drawn with an amber border and a "Required certificate tag" badge: it is always required, its variable name cannot change and it cannot be removed. Saving a form that has no field for one of those tags shows a warning naming it.'=>'Um campo cuja etiqueta é uma etiqueta obrigatória do certificado (Configurações → Certificados) aparece com borda âmbar e o selo "Etiqueta obrigatória do certificado": ele é sempre obrigatório, o nome da variável não muda e ele não pode ser removido. Salvar um formulário sem campo para uma dessas etiquetas mostra um aviso com o nome dela.','A field named cpf_rf is validated on submit as a Brazilian document: non-digits are stripped and the value must be exactly 11 digits (CPF, check-digit validated) or 7 digits (RF); the browser masks it and blocks the submit while the number is invalid. The RF check digit is enforced only when Settings → General → RF check digit is on (off by default). There is no separate "CPF field type" — the name is what triggers it. In the PDF, the cpf, cpf_rf and rg tokens are formatted with punctuation (e.g. 000.000.000-00 for a CPF, 000.000-0 for an RF), not masked.'=>'Um campo chamado cpf_rf é validado no envio como documento brasileiro: o que não é dígito é removido e o valor precisa ter exatamente 11 dígitos (CPF, com dígito verificador conferido) ou 7 dígitos (RF); o navegador aplica a máscara e bloqueia o envio enquanto o número for inválido. O dígito verificador do RF só é exigido quando Configurações → Geral → Dígito verificador do RF está ligado (desligado por padrão). Não existe um "tipo de campo CPF" — é o nome que ativa a validação. No PDF, as variáveis cpf, cpf_rf e rg são formatadas com pontuação (por exemplo, 000.000.000-00 para CPF e 000.000-0 para RF), sem mascaramento.','The form editor refuses to save a certificate layout that lacks a required tag — by default {{auth_code}}, {{name}} and {{cpf_rf}}, configurable under Settings → Certificates → Required Certificate Tags; the form editor also requires a field for each tag the participant fills in, and locks it. Once an Event Schedule is filled on the Time tab, {{schedule}} becomes required too.'=>'O editor de formulários recusa salvar um layout de certificado sem uma etiqueta obrigatória — por padrão {{auth_code}}, {{name}} e {{cpf_rf}}, configuráveis em Configurações → Certificados → Etiquetas de Certificado Obrigatórias; o editor também exige um campo para cada etiqueta que o participante preenche, e o trava. Quando um Horário do evento é preenchido na aba Horário, {{schedule}} também passa a ser obrigatória.','"Correct option(s)": tick the correct options beside them; radio and select score when a correct option is chosen, a checkbox only when every correct option is ticked and no other. "Points per option": give each option its points; a checkbox adds the boxes ticked, never below zero, so a wrong box can be worth negative points.'=>'"Alternativa(s) correta(s)": marque as alternativas corretas ao lado delas; rádio e lista pontuam quando uma alternativa correta é escolhida, e a caixa de seleção só quando todas as corretas são marcadas e nenhuma outra. "Pontos por alternativa": dê a cada alternativa os seus pontos; a caixa de seleção soma as caixas marcadas, nunca abaixo de zero, então uma caixa errada pode valer pontos negativos.','"No points", or "Points when answered", which respects the minimum length the field sets.'=>'"Sem pontos", ou "Pontos quando respondida", que respeita o mínimo de caracteres definido no campo.','%1$s of %2$s question answered correctly.'=>'%1$s de %2$s questão respondida corretamente.' . "\0" . '%1$s de %2$s questões respondidas corretamente.','%1$s: the maximum selections was raised to %2$s, the number of correct options.'=>'%1$s: o máximo de seleções foi elevado para %2$s, o número de alternativas corretas.','%s: no correct answer is set, so the question is not scored.'=>'%s: nenhuma resposta correta definida, então a questão não é pontuada.','%s: no option is marked correct, so the question is not scored.'=>'%s: nenhuma alternativa marcada como correta, então a questão não é pontuada.','A form saved before these options keeps scoring as it did: radio and select by their points per option. A question set to score that cannot be marked — no option marked correct, or no correct range — is reported when the form is saved and left out of the score. A checkbox whose maximum selections is below its number of correct options has the maximum raised to fit.'=>'Um formulário salvo antes destas opções continua pontuando como antes: rádio e lista pelos pontos de cada alternativa. Uma questão configurada para pontuar que não pode ser corrigida — nenhuma alternativa marcada como correta, ou nenhuma faixa correta — é avisada ao salvar o formulário e fica fora da pontuação. Uma caixa de seleção cujo máximo de seleções seja menor que o número de alternativas corretas tem o máximo elevado para caber.','An answer within the range, bounds included, earns the points. Set both bounds to the same value for one exact answer; leave one empty for an open range.'=>'Uma resposta dentro da faixa, limites incluídos, ganha os pontos. Use o mesmo valor nos dois limites para uma única resposta exata; deixe um vazio para uma faixa aberta.','Correct from'=>'Correta de','Correct option(s)'=>'Alternativa(s) correta(s)','Enable it on the Quiz tab of the form editor\'s "Certificate Form Configuration" box. Each field on the Fields tab then shows "Score this question"; a question left off is out of the count and of the points the percentage is taken from.'=>'Ative-o na aba Quiz da caixa "Configuração do formulário de certificado" do editor. Cada campo da aba Campos passa a mostrar "Pontuar esta questão"; uma questão desligada fica fora da contagem e dos pontos sobre os quais a porcentagem é calculada.','Give each option its points beside it. A checkbox adds the boxes ticked, never below zero; a wrong box can be worth negative points.'=>'Dê a cada alternativa os seus pontos ao lado dela. A caixa de seleção soma as caixas marcadas, nunca abaixo de zero; uma caixa errada pode valer pontos negativos.','How to score'=>'Como pontuar','Maximum points available across the scored questions'=>'Pontuação máxima possível nas questões pontuadas','No points'=>'Sem pontos','Number and date'=>'Número e data','Off: the question is left out of the count and of the points the percentage is taken from.'=>'Desligado: a questão fica fora da contagem e dos pontos sobre os quais a porcentagem é calculada.','Points'=>'Pontos','Points earned across the scored questions'=>'Pontos obtidos nas questões pontuadas','Points per option'=>'Pontos por alternativa','Points when answered'=>'Pontos quando respondida','Questions answered correctly as a whole'=>'Questões respondidas corretamente por inteiro','Questions scored'=>'Questões pontuadas','Quiz scoring:'=>'Pontuação do quiz:','Radio, select and checkbox'=>'Rádio, lista e caixa de seleção','Score this question'=>'Pontuar esta questão','Text and textarea'=>'Texto e área de texto','The maximum selections is below the number of correct options (%d).'=>'O máximo de seleções é menor que o número de alternativas corretas (%d).','Tick the correct option(s) beside each option. A checkbox scores only when every correct option is ticked and no other.'=>'Marque a(s) alternativa(s) correta(s) ao lado de cada alternativa. A caixa de seleção só pontua quando todas as corretas são marcadas e nenhuma outra.','When enabled, each field on the Fields tab can be scored: by its correct option(s), by points per option, when answered, or by a correct range. The form is scored on submission.'=>'Quando ativado, cada campo da aba Campos pode ser pontuado: pela(s) alternativa(s) correta(s), por pontos por alternativa, quando respondido ou por uma faixa correta. O formulário é pontuado no envio.','a correct range, bounds included; the same value in both bounds is one exact answer, and an empty bound leaves the range open.'=>'uma faixa correta, limites incluídos; o mesmo valor nos dois limites é uma única resposta exata, e um limite vazio deixa a faixa aberta.','pts'=>'pts','show the score after submission (on by default) and show which answers were correct or incorrect: the message says how many questions were answered correctly, and each scored question is marked Correct or Incorrect. The right answer itself is never shown.'=>'mostrar a pontuação após o envio (ligado por padrão) e mostrar quais respostas estavam corretas ou incorretas: a mensagem diz quantas questões foram respondidas corretamente, e cada questão pontuada é marcada como Correta ou Incorreta. A resposta certa nunca é mostrada.','quiz answerCorrect'=>'Correta','quiz answerIncorrect'=>'Incorreta']];
\ No newline at end of file
diff --git a/languages/ffcertificate-pt_BR.mo b/languages/ffcertificate-pt_BR.mo
index bf0cf09cc..0072b13b7 100644
Binary files a/languages/ffcertificate-pt_BR.mo and b/languages/ffcertificate-pt_BR.mo differ
diff --git a/languages/ffcertificate-pt_BR.po b/languages/ffcertificate-pt_BR.po
index 16c2aa71e..1f3e0b6d8 100644
--- a/languages/ffcertificate-pt_BR.po
+++ b/languages/ffcertificate-pt_BR.po
@@ -7586,10 +7586,6 @@ msgstr "Todos os registros agora estão criptografados com a nova chave. Remova
msgid "Every visitor solves a proof of work in the browser. Nothing is sent to any third party."
msgstr "Cada visitante resolve uma prova de trabalho no navegador. Nada é enviado a terceiros."
-#: includes/admin/class-ffc-form-editor-builder-metabox.php:294 includes/admin/class-ffc-admin-assets-manager.php:642
-msgid "Ex: 0, 10, 0"
-msgstr "Ex: 0, 10, 0"
-
#: includes/admin/class-ffc-form-editor-builder-metabox.php:241
msgid "ex: course_name"
msgstr "ex: nome_do_curso"
@@ -10987,10 +10983,6 @@ msgstr "Número máximo de pessoas por vaga (1 = exclusivo)"
msgid "Maximum number of people who can wait per slot (0 = unlimited)."
msgstr "Número máximo de pessoas que podem aguardar por horário (0 = ilimitado)."
-#: includes/settings/views/documentation/feature-quiz.php:37
-msgid "Maximum points available — sum of each scored field's highest option value"
-msgstr "Pontuação máxima disponível — soma do maior valor de opção de cada campo pontuado"
-
#: includes/frontend/submission/class-ffc-submission-persister.php:122
msgid "Maximum quiz attempts reached for this CPF/RF."
msgstr "Número máximo de tentativas do quiz atingido para este CPF/RF."
@@ -13130,18 +13122,6 @@ msgstr "além da DSL de link de URL de validação — p. ex."
msgid "Point your domain's nameservers to the ones Cloudflare gives you (at your registrar)."
msgstr "Aponte os servidores de nome (nameservers) do seu domínio para aqueles fornecidos pela Cloudflare (no seu registrador)."
-#: includes/settings/views/documentation/feature-quiz.php:32
-msgid "Points earned — sum of the point values of the options the participant selected"
-msgstr "Pontos obtidos — soma dos valores de pontos das opções que o participante selecionou"
-
-#: includes/admin/class-ffc-form-editor-builder-metabox.php:292
-msgid "Points per option (same order, separate with commas):"
-msgstr "Pontos por opção (mesma ordem, separe com vírgulas):"
-
-#: includes/admin/class-ffc-admin-assets-manager.php:641
-msgid "Points per option:"
-msgstr "Pontos por opção:"
-
#: includes/frontend/class-ffc-frontend.php:334
msgid "Pop-ups are blocked in this browser. Tap the button below to open the PDF — then use the share icon to save or print."
msgstr "Pop-ups estão bloqueados neste navegador. Toque no botão abaixo para abrir o PDF — depois use o ícone de compartilhar para salvar ou imprimir."
@@ -19773,10 +19753,6 @@ msgstr "Quando ativada, essa opção seleciona automaticamente esse local para v
msgid "When enabled, published submissions older than this many days are permanently deleted by the daily cleanup. Off by default — turning it on will delete existing submissions older than the window on the next run."
msgstr "Quando ativado, as submissões publicadas com mais dias do que o especificado são excluídas permanentemente durante a limpeza diária. Desativado por padrão — ativá-lo fará com que as submissões existentes que ultrapassem esse período sejam excluídas na próxima execução."
-#: includes/admin/class-ffc-form-editor-quiz-metabox.php:60
-msgid "When enabled, radio and select fields can have point values per option. The form is scored on submission."
-msgstr "Quando ativado, campos de rádio e seleção podem ter valores de pontos por opção. O formulário é pontuado ao enviar."
-
#: includes/self-scheduling/class-ffc-self-scheduling-editor.php:721
msgid "When enabled, the calendar will only be visible during the configured working hours. Outside those hours, a message will be displayed instead."
msgstr "Quando ativado, o calendário ficará visível apenas durante o horário de trabalho configurado. Fora desse horário, uma mensagem será exibida."
@@ -23271,18 +23247,12 @@ msgstr "Na aba Geolocalização da caixa \"Configuração do Formulário de Cert
msgid "Turning a form into a quiz"
msgstr "Transformando um formulário em quiz"
-msgid "Enable it on the Quiz tab of the form editor's \"Certificate Form Configuration\" box, then give each scored field its points per option on the Fields tab. Only radio and select fields are scored."
-msgstr "Ative-o na aba Quiz da caixa \"Configuração do Formulário de Certificado\" do editor de formulários e, em seguida, defina os pontos por opção de cada campo pontuado na aba Campos. Apenas campos de botões de seleção única e de caixa de seleção suspensa são pontuados."
-
msgid "minimum percentage to pass (default 70; 0 means no minimum)."
msgstr "percentual mínimo para aprovação (padrão 70; 0 significa sem mínimo)."
msgid "retries allowed per CPF/RF (0 = unlimited)."
msgstr "tentativas permitidas por CPF/RF (0 = ilimitadas)."
-msgid "show the score after submission (on by default) and show which answers were correct or incorrect."
-msgstr "mostrar a pontuação após o envio (ativado por padrão) e mostrar quais respostas estavam corretas ou incorretas."
-
msgid "An attempt below the passing score is kept as a \"Quiz: Retry\" submission while attempts remain, and as \"Quiz: Failed\" once they run out; no certificate is issued for either."
msgstr "Uma tentativa abaixo da nota de aprovação é mantida como submissão \"Quiz: Tentando\" enquanto restarem tentativas, e como \"Quiz: Reprovado\" quando elas se esgotam; nenhum certificado é emitido em nenhum dos dois casos."
@@ -25531,3 +25501,157 @@ msgstr "Um campo chamado cpf_rf é validado no envio como documento brasileiro:
#: includes/settings/views/documentation/feature-certificates.php:34
msgid "The form editor refuses to save a certificate layout that lacks a required tag — by default {{auth_code}}, {{name}} and {{cpf_rf}}, configurable under Settings → Certificates → Required Certificate Tags; the form editor also requires a field for each tag the participant fills in, and locks it. Once an Event Schedule is filled on the Time tab, {{schedule}} becomes required too."
msgstr "O editor de formulários recusa salvar um layout de certificado sem uma etiqueta obrigatória — por padrão {{auth_code}}, {{name}} e {{cpf_rf}}, configuráveis em Configurações → Certificados → Etiquetas de Certificado Obrigatórias; o editor também exige um campo para cada etiqueta que o participante preenche, e o trava. Quando um Horário do evento é preenchido na aba Horário, {{schedule}} também passa a ser obrigatória."
+
+#: includes/settings/views/documentation/feature-quiz.php:23
+msgid "\"Correct option(s)\": tick the correct options beside them; radio and select score when a correct option is chosen, a checkbox only when every correct option is ticked and no other. \"Points per option\": give each option its points; a checkbox adds the boxes ticked, never below zero, so a wrong box can be worth negative points."
+msgstr "\"Alternativa(s) correta(s)\": marque as alternativas corretas ao lado delas; rádio e lista pontuam quando uma alternativa correta é escolhida, e a caixa de seleção só quando todas as corretas são marcadas e nenhuma outra. \"Pontos por alternativa\": dê a cada alternativa os seus pontos; a caixa de seleção soma as caixas marcadas, nunca abaixo de zero, então uma caixa errada pode valer pontos negativos."
+
+#: includes/settings/views/documentation/feature-quiz.php:24
+msgid "\"No points\", or \"Points when answered\", which respects the minimum length the field sets."
+msgstr "\"Sem pontos\", ou \"Pontos quando respondida\", que respeita o mínimo de caracteres definido no campo."
+
+#. 1: questions answered right, 2: questions scored.
+#: includes/frontend/submission/class-ffc-submission-persister.php:227
+#, php-format
+msgid "%1$s of %2$s question answered correctly."
+msgid_plural "%1$s of %2$s questions answered correctly."
+msgstr[0] "%1$s de %2$s questão respondida corretamente."
+msgstr[1] "%1$s de %2$s questões respondidas corretamente."
+
+#. 1: field label, 2: number of correct options.
+#: includes/admin/class-ffc-form-editor-save-handler.php:230
+#, php-format
+msgid "%1$s: the maximum selections was raised to %2$s, the number of correct options."
+msgstr "%1$s: o máximo de seleções foi elevado para %2$s, o número de alternativas corretas."
+
+#. %s: field label.
+#: includes/admin/class-ffc-form-editor-save-handler.php:240
+#, php-format
+msgid "%s: no correct answer is set, so the question is not scored."
+msgstr "%s: nenhuma resposta correta definida, então a questão não é pontuada."
+
+#. %s: field label.
+#: includes/admin/class-ffc-form-editor-save-handler.php:223
+#, php-format
+msgid "%s: no option is marked correct, so the question is not scored."
+msgstr "%s: nenhuma alternativa marcada como correta, então a questão não é pontuada."
+
+#: includes/settings/views/documentation/feature-quiz.php:27
+msgid "A form saved before these options keeps scoring as it did: radio and select by their points per option. A question set to score that cannot be marked — no option marked correct, or no correct range — is reported when the form is saved and left out of the score. A checkbox whose maximum selections is below its number of correct options has the maximum raised to fit."
+msgstr "Um formulário salvo antes destas opções continua pontuando como antes: rádio e lista pelos pontos de cada alternativa. Uma questão configurada para pontuar que não pode ser corrigida — nenhuma alternativa marcada como correta, ou nenhuma faixa correta — é avisada ao salvar o formulário e fica fora da pontuação. Uma caixa de seleção cujo máximo de seleções seja menor que o número de alternativas corretas tem o máximo elevado para caber."
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:477
+msgid "An answer within the range, bounds included, earns the points. Set both bounds to the same value for one exact answer; leave one empty for an open range."
+msgstr "Uma resposta dentro da faixa, limites incluídos, ganha os pontos. Use o mesmo valor nos dois limites para uma única resposta exata; deixe um vazio para uma faixa aberta."
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:456
+msgid "Correct from"
+msgstr "Correta de"
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:444
+msgid "Correct option(s)"
+msgstr "Alternativa(s) correta(s)"
+
+#: includes/settings/views/documentation/feature-quiz.php:21
+msgid "Enable it on the Quiz tab of the form editor's \"Certificate Form Configuration\" box. Each field on the Fields tab then shows \"Score this question\"; a question left off is out of the count and of the points the percentage is taken from."
+msgstr "Ative-o na aba Quiz da caixa \"Configuração do formulário de certificado\" do editor. Cada campo da aba Campos passa a mostrar \"Pontuar esta questão\"; uma questão desligada fica fora da contagem e dos pontos sobre os quais a porcentagem é calculada."
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:476
+msgid "Give each option its points beside it. A checkbox adds the boxes ticked, never below zero; a wrong box can be worth negative points."
+msgstr "Dê a cada alternativa os seus pontos ao lado dela. A caixa de seleção soma as caixas marcadas, nunca abaixo de zero; uma caixa errada pode valer pontos negativos."
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:442
+msgid "How to score"
+msgstr "Como pontuar"
+
+#: includes/settings/views/documentation/feature-quiz.php:54
+msgid "Maximum points available across the scored questions"
+msgstr "Pontuação máxima possível nas questões pontuadas"
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:451
+msgid "No points"
+msgstr "Sem pontos"
+
+#: includes/settings/views/documentation/feature-quiz.php:25
+msgid "Number and date"
+msgstr "Número e data"
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:438
+msgid "Off: the question is left out of the count and of the points the percentage is taken from."
+msgstr "Desligado: a questão fica fora da contagem e dos pontos sobre os quais a porcentagem é calculada."
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:322
+msgid "Points"
+msgstr "Pontos"
+
+#: includes/settings/views/documentation/feature-quiz.php:49
+msgid "Points earned across the scored questions"
+msgstr "Pontos obtidos nas questões pontuadas"
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:445
+msgid "Points per option"
+msgstr "Pontos por alternativa"
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:452
+msgid "Points when answered"
+msgstr "Pontos quando respondida"
+
+#: includes/settings/views/documentation/feature-quiz.php:64
+msgid "Questions answered correctly as a whole"
+msgstr "Questões respondidas corretamente por inteiro"
+
+#: includes/settings/views/documentation/feature-quiz.php:69
+msgid "Questions scored"
+msgstr "Questões pontuadas"
+
+#: includes/admin/class-ffc-form-editor-save-handler.php:765
+msgid "Quiz scoring:"
+msgstr "Pontuação do quiz:"
+
+#: includes/settings/views/documentation/feature-quiz.php:23
+msgid "Radio, select and checkbox"
+msgstr "Rádio, lista e caixa de seleção"
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:433
+msgid "Score this question"
+msgstr "Pontuar esta questão"
+
+#: includes/settings/views/documentation/feature-quiz.php:24
+msgid "Text and textarea"
+msgstr "Texto e área de texto"
+
+#. %d: number of options marked correct.
+#: includes/admin/class-ffc-admin-assets-manager.php:627
+#, php-format
+msgid "The maximum selections is below the number of correct options (%d)."
+msgstr "O máximo de seleções é menor que o número de alternativas corretas (%d)."
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:475
+msgid "Tick the correct option(s) beside each option. A checkbox scores only when every correct option is ticked and no other."
+msgstr "Marque a(s) alternativa(s) correta(s) ao lado de cada alternativa. A caixa de seleção só pontua quando todas as corretas são marcadas e nenhuma outra."
+
+#: includes/admin/class-ffc-form-editor-quiz-metabox.php:60
+msgid "When enabled, each field on the Fields tab can be scored: by its correct option(s), by points per option, when answered, or by a correct range. The form is scored on submission."
+msgstr "Quando ativado, cada campo da aba Campos pode ser pontuado: pela(s) alternativa(s) correta(s), por pontos por alternativa, quando respondido ou por uma faixa correta. O formulário é pontuado no envio."
+
+#: includes/settings/views/documentation/feature-quiz.php:25
+msgid "a correct range, bounds included; the same value in both bounds is one exact answer, and an empty bound leaves the range open."
+msgstr "uma faixa correta, limites incluídos; o mesmo valor nos dois limites é uma única resposta exata, e um limite vazio deixa a faixa aberta."
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:324
+msgid "pts"
+msgstr "pts"
+
+#: includes/settings/views/documentation/feature-quiz.php:31
+msgid "show the score after submission (on by default) and show which answers were correct or incorrect: the message says how many questions were answered correctly, and each scored question is marked Correct or Incorrect. The right answer itself is never shown."
+msgstr "mostrar a pontuação após o envio (ligado por padrão) e mostrar quais respostas estavam corretas ou incorretas: a mensagem diz quantas questões foram respondidas corretamente, e cada questão pontuada é marcada como Correta ou Incorreta. A resposta certa nunca é mostrada."
+
+#: includes/frontend/class-ffc-frontend.php:343
+msgctxt "quiz answer"
+msgid "Correct"
+msgstr "Correta"
+
+#: includes/frontend/class-ffc-frontend.php:343
+msgctxt "quiz answer"
+msgid "Incorrect"
+msgstr "Incorreta"
diff --git a/languages/ffcertificate.pot b/languages/ffcertificate.pot
index eb9acc493..310852d43 100644
--- a/languages/ffcertificate.pot
+++ b/languages/ffcertificate.pot
@@ -7582,10 +7582,6 @@ msgstr ""
msgid "Every visitor solves a proof of work in the browser. Nothing is sent to any third party."
msgstr ""
-#: includes/admin/class-ffc-form-editor-builder-metabox.php:294 includes/admin/class-ffc-admin-assets-manager.php:642
-msgid "Ex: 0, 10, 0"
-msgstr ""
-
#: includes/admin/class-ffc-form-editor-builder-metabox.php:241
msgid "ex: course_name"
msgstr ""
@@ -10968,10 +10964,6 @@ msgstr ""
msgid "Maximum number of people who can wait per slot (0 = unlimited)."
msgstr ""
-#: includes/settings/views/documentation/feature-quiz.php:37
-msgid "Maximum points available — sum of each scored field's highest option value"
-msgstr ""
-
#: includes/frontend/submission/class-ffc-submission-persister.php:122
msgid "Maximum quiz attempts reached for this CPF/RF."
msgstr ""
@@ -13104,18 +13096,6 @@ msgstr ""
msgid "Point your domain's nameservers to the ones Cloudflare gives you (at your registrar)."
msgstr ""
-#: includes/settings/views/documentation/feature-quiz.php:32
-msgid "Points earned — sum of the point values of the options the participant selected"
-msgstr ""
-
-#: includes/admin/class-ffc-form-editor-builder-metabox.php:292
-msgid "Points per option (same order, separate with commas):"
-msgstr ""
-
-#: includes/admin/class-ffc-admin-assets-manager.php:641
-msgid "Points per option:"
-msgstr ""
-
#: includes/frontend/class-ffc-frontend.php:334
msgid "Pop-ups are blocked in this browser. Tap the button below to open the PDF — then use the share icon to save or print."
msgstr ""
@@ -19716,10 +19696,6 @@ msgstr ""
msgid "When enabled, published submissions older than this many days are permanently deleted by the daily cleanup. Off by default — turning it on will delete existing submissions older than the window on the next run."
msgstr ""
-#: includes/admin/class-ffc-form-editor-quiz-metabox.php:60
-msgid "When enabled, radio and select fields can have point values per option. The form is scored on submission."
-msgstr ""
-
#: includes/self-scheduling/class-ffc-self-scheduling-editor.php:721
msgid "When enabled, the calendar will only be visible during the configured working hours. Outside those hours, a message will be displayed instead."
msgstr ""
@@ -23187,18 +23163,12 @@ msgstr ""
msgid "Turning a form into a quiz"
msgstr ""
-msgid "Enable it on the Quiz tab of the form editor's \"Certificate Form Configuration\" box, then give each scored field its points per option on the Fields tab. Only radio and select fields are scored."
-msgstr ""
-
msgid "minimum percentage to pass (default 70; 0 means no minimum)."
msgstr ""
msgid "retries allowed per CPF/RF (0 = unlimited)."
msgstr ""
-msgid "show the score after submission (on by default) and show which answers were correct or incorrect."
-msgstr ""
-
msgid "An attempt below the passing score is kept as a \"Quiz: Retry\" submission while attempts remain, and as \"Quiz: Failed\" once they run out; no certificate is issued for either."
msgstr ""
@@ -25447,3 +25417,157 @@ msgstr ""
#: includes/settings/views/documentation/feature-certificates.php:34
msgid "The form editor refuses to save a certificate layout that lacks a required tag — by default {{auth_code}}, {{name}} and {{cpf_rf}}, configurable under Settings → Certificates → Required Certificate Tags; the form editor also requires a field for each tag the participant fills in, and locks it. Once an Event Schedule is filled on the Time tab, {{schedule}} becomes required too."
msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:23
+msgid "\"Correct option(s)\": tick the correct options beside them; radio and select score when a correct option is chosen, a checkbox only when every correct option is ticked and no other. \"Points per option\": give each option its points; a checkbox adds the boxes ticked, never below zero, so a wrong box can be worth negative points."
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:24
+msgid "\"No points\", or \"Points when answered\", which respects the minimum length the field sets."
+msgstr ""
+
+#. 1: questions answered right, 2: questions scored.
+#: includes/frontend/submission/class-ffc-submission-persister.php:227
+#, php-format
+msgid "%1$s of %2$s question answered correctly."
+msgid_plural "%1$s of %2$s questions answered correctly."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 1: field label, 2: number of correct options.
+#: includes/admin/class-ffc-form-editor-save-handler.php:230
+#, php-format
+msgid "%1$s: the maximum selections was raised to %2$s, the number of correct options."
+msgstr ""
+
+#. %s: field label.
+#: includes/admin/class-ffc-form-editor-save-handler.php:240
+#, php-format
+msgid "%s: no correct answer is set, so the question is not scored."
+msgstr ""
+
+#. %s: field label.
+#: includes/admin/class-ffc-form-editor-save-handler.php:223
+#, php-format
+msgid "%s: no option is marked correct, so the question is not scored."
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:27
+msgid "A form saved before these options keeps scoring as it did: radio and select by their points per option. A question set to score that cannot be marked — no option marked correct, or no correct range — is reported when the form is saved and left out of the score. A checkbox whose maximum selections is below its number of correct options has the maximum raised to fit."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:477
+msgid "An answer within the range, bounds included, earns the points. Set both bounds to the same value for one exact answer; leave one empty for an open range."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:456
+msgid "Correct from"
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:444
+msgid "Correct option(s)"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:21
+msgid "Enable it on the Quiz tab of the form editor's \"Certificate Form Configuration\" box. Each field on the Fields tab then shows \"Score this question\"; a question left off is out of the count and of the points the percentage is taken from."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:476
+msgid "Give each option its points beside it. A checkbox adds the boxes ticked, never below zero; a wrong box can be worth negative points."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:442
+msgid "How to score"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:54
+msgid "Maximum points available across the scored questions"
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:451
+msgid "No points"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:25
+msgid "Number and date"
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:438
+msgid "Off: the question is left out of the count and of the points the percentage is taken from."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:322
+msgid "Points"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:49
+msgid "Points earned across the scored questions"
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:445
+msgid "Points per option"
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:452
+msgid "Points when answered"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:64
+msgid "Questions answered correctly as a whole"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:69
+msgid "Questions scored"
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-save-handler.php:765
+msgid "Quiz scoring:"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:23
+msgid "Radio, select and checkbox"
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:433
+msgid "Score this question"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:24
+msgid "Text and textarea"
+msgstr ""
+
+#. %d: number of options marked correct.
+#: includes/admin/class-ffc-admin-assets-manager.php:627
+#, php-format
+msgid "The maximum selections is below the number of correct options (%d)."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:475
+msgid "Tick the correct option(s) beside each option. A checkbox scores only when every correct option is ticked and no other."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-quiz-metabox.php:60
+msgid "When enabled, each field on the Fields tab can be scored: by its correct option(s), by points per option, when answered, or by a correct range. The form is scored on submission."
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:25
+msgid "a correct range, bounds included; the same value in both bounds is one exact answer, and an empty bound leaves the range open."
+msgstr ""
+
+#: includes/admin/class-ffc-form-editor-builder-metabox.php:324
+msgid "pts"
+msgstr ""
+
+#: includes/settings/views/documentation/feature-quiz.php:31
+msgid "show the score after submission (on by default) and show which answers were correct or incorrect: the message says how many questions were answered correctly, and each scored question is marked Correct or Incorrect. The right answer itself is never shown."
+msgstr ""
+
+#: includes/frontend/class-ffc-frontend.php:343
+msgctxt "quiz answer"
+msgid "Correct"
+msgstr ""
+
+#: includes/frontend/class-ffc-frontend.php:343
+msgctxt "quiz answer"
+msgid "Incorrect"
+msgstr ""
diff --git a/tests/Unit/FormEditorBuilderMetaboxTest.php b/tests/Unit/FormEditorBuilderMetaboxTest.php
index f05c04e7b..40d0b97e8 100644
--- a/tests/Unit/FormEditorBuilderMetaboxTest.php
+++ b/tests/Unit/FormEditorBuilderMetaboxTest.php
@@ -37,6 +37,7 @@ protected function setUp(): void {
Functions\when( '__' )->returnArg();
Functions\when( 'esc_html__' )->returnArg();
+ Functions\when( '_x' )->returnArg();
Functions\when( 'esc_attr__' )->returnArg();
Functions\when( 'esc_html' )->returnArg();
Functions\when( 'esc_attr' )->returnArg();
@@ -48,7 +49,7 @@ protected function setUp(): void {
Functions\when( 'wp_kses_post' )->returnArg();
Functions\when( 'get_post_meta' )->justReturn( '' );
Functions\when( 'selected' )->justReturn( '' );
- Functions\when( 'checked' )->justReturn( '' );
+ Functions\when( 'checked' )->alias( static fn( $c, $cur = true, $echo = true ) => (string) $c === (string) $cur ? ( $echo ? print( ' checked' ) : ' checked' ) : '' );
$this->metabox = new FormEditorBuilderMetabox();
}
@@ -120,6 +121,34 @@ public function test_a_saved_hidden_field_shows_its_fixed_value(): void {
$this->assertStringContainsString( 'name="ffc_fields[0][default_value]" value="2026-A"', $html );
}
+ /**
+ * #1730 — each option row carries its correct mark and points, aligned,
+ * and every field carries its quiz block.
+ */
+ public function test_option_rows_carry_their_correct_mark_and_points(): void {
+ $html = $this->render(
+ array(
+ array(
+ 'name' => 'q',
+ 'type' => 'radio',
+ 'choices' => array( 'A', 'B' ),
+ 'points' => '0,7',
+ 'correct' => array( 'B' ),
+ 'quiz_scored' => '1',
+ 'quiz_mode' => 'correct',
+ ),
+ )
+ );
+
+ $this->assertSame( 2, preg_match_all( '/name="ffc_fields\[0\]\[choice_correct\]\[\]" value="([01])"/', $html, $marks ) );
+ $this->assertSame( array( '0', '1' ), $marks[1], 'The mark follows its option.' );
+ $this->assertSame( 2, preg_match_all( '/name="ffc_fields\[0\]\[choice_points\]\[\]" value="(\d*)"/', $html, $points ) );
+ $this->assertSame( array( '0', '7' ), $points[1] );
+ $this->assertStringContainsString( 'name="ffc_fields[0][quiz_block]" value="1"', $html );
+ $this->assertMatchesRegularExpression( '/id="ffc_field_quiz_scored_0"[^>]*checked/', $html );
+ $this->assertStringNotContainsString( 'ffc-quiz-points ffc-hidden', $html, 'The old comma-separated points input is gone.' );
+ }
+
/**
* #1734 — a field a required certificate tag calls for is marked and
* locked; any other field is not.
diff --git a/tests/Unit/FormEditorMetaboxRendererTest.php b/tests/Unit/FormEditorMetaboxRendererTest.php
index e5a508db9..bfb6ce1d3 100644
--- a/tests/Unit/FormEditorMetaboxRendererTest.php
+++ b/tests/Unit/FormEditorMetaboxRendererTest.php
@@ -33,6 +33,7 @@ protected function setUp(): void {
Functions\when( 'get_locale' )->justReturn( 'en_US' );
Functions\when( '__' )->returnArg();
+ Functions\when( '_x' )->returnArg();
Functions\when( 'esc_html__' )->returnArg();
Functions\when( 'esc_html' )->returnArg();
Functions\when( 'esc_attr' )->returnArg();
diff --git a/tests/Unit/FormEditorSaveHandlerTest.php b/tests/Unit/FormEditorSaveHandlerTest.php
index 383e811d0..89093f8be 100644
--- a/tests/Unit/FormEditorSaveHandlerTest.php
+++ b/tests/Unit/FormEditorSaveHandlerTest.php
@@ -299,6 +299,60 @@ public function test_save_fields_meta_forces_required_tags_and_reports_the_missi
$this->assertSame( array( '{{cpf_rf}}' ), $out['transients']['ffc_save_fields_error_7'] );
}
+ /**
+ * #1730 — the option rows store their points and correct marks, a
+ * checkbox cannot cap its selections below its correct options, and a
+ * scored question that cannot be marked is reported.
+ */
+ public function test_save_fields_meta_stores_the_quiz_and_fits_the_question(): void {
+ Functions\when( 'number_format_i18n' )->alias( static fn( $n ) => (string) $n );
+ $_POST['ffc_fields'] = array(
+ array(
+ 'label' => 'Pick two',
+ 'name' => 'q1',
+ 'type' => 'checkbox',
+ 'choices' => array( 'A', 'B', 'C' ),
+ 'choice_points' => array( '', '', '' ),
+ 'choice_correct' => array( '1', '0', '1' ),
+ 'max_select' => '1',
+ 'quiz_block' => '1',
+ 'quiz_scored' => '1',
+ 'quiz_mode' => 'correct',
+ ),
+ array(
+ 'label' => 'Year',
+ 'name' => 'q2',
+ 'type' => 'number',
+ 'quiz_block' => '1',
+ 'quiz_scored' => '1',
+ ),
+ array(
+ 'name' => 'q3',
+ 'type' => 'radio',
+ 'choices' => array( 'X', 'Y' ),
+ 'choice_points' => array( '10', '0' ),
+ 'quiz_block' => '1',
+ 'quiz_scored' => '1',
+ 'quiz_mode' => 'points',
+ ),
+ );
+
+ $out = $this->capture_meta_writes( 'save_fields_meta' );
+ unset( $_POST['ffc_fields'] );
+
+ $fields = $out['written']['_ffc_form_fields'];
+ $this->assertSame( array( 'A', 'C' ), $fields[0]['correct'] );
+ $this->assertSame( '2', $fields[0]['max_select'], 'Raised to the number of correct options.' );
+ $this->assertSame( '10,0', $fields[2]['points'], 'The points string is rebuilt from the option rows.' );
+ $this->assertSame(
+ array(
+ 'Pick two: the maximum selections was raised to 2, the number of correct options.',
+ 'Year: no correct answer is set, so the question is not scored.',
+ ),
+ $out['transients']['ffc_save_quiz_warning_7']
+ );
+ }
+
/**
* #1084 — `sanitize_textarea_field( (string) array() )` is the literal
* `Array` plus a PHP warning, and that string was stored as the
diff --git a/tests/Unit/FrontendTest.php b/tests/Unit/FrontendTest.php
index 00c9c690b..122a1cb6b 100644
--- a/tests/Unit/FrontendTest.php
+++ b/tests/Unit/FrontendTest.php
@@ -24,6 +24,7 @@ protected function setUp(): void {
Monkey\setUp();
Functions\when( '__' )->returnArg();
+ Functions\when( '_x' )->returnArg();
Functions\when( 'esc_html__' )->returnArg();
Functions\when( 'esc_html' )->returnArg();
Functions\when( 'esc_attr' )->returnArg();
diff --git a/tests/Unit/QuizQuestionTest.php b/tests/Unit/QuizQuestionTest.php
new file mode 100644
index 000000000..4b773c8ef
--- /dev/null
+++ b/tests/Unit/QuizQuestionTest.php
@@ -0,0 +1,133 @@
+alias( static fn( $v ) => trim( (string) $v ) );
+ Functions\when( 'absint' )->alias( static fn( $v ) => abs( (int) $v ) );
+ }
+
+ protected function tearDown(): void {
+ Monkey\tearDown();
+ parent::tearDown();
+ }
+
+ public function test_option_rows_rebuild_the_points_and_the_correct_set_in_their_order(): void {
+ $row = array(
+ 'choices' => array( 'B', '', 'A', 'C' ),
+ 'choice_points' => array( '5', '9', '', 'x' ),
+ 'choice_correct' => array( '1', '1', '0', '1' ),
+ 'quiz_block' => '1',
+ 'quiz_scored' => '1',
+ 'quiz_mode' => 'correct',
+ 'quiz_points' => '2',
+ );
+
+ $clean = QuizQuestion::sanitize( $row, 'checkbox', array( 'B', 'A', 'C' ) );
+
+ $this->assertSame( '5,0,0', $clean['points'], 'An empty option row is dropped with its values; an unreadable number is 0.' );
+ $this->assertSame( array( 'B', 'C' ), $clean['correct'] );
+ $this->assertSame( '1', $clean['quiz_scored'] );
+ $this->assertSame( 'correct', $clean['quiz_mode'] );
+ $this->assertSame( '2', $clean['quiz_points'] );
+ }
+
+ public function test_option_rows_without_any_points_store_no_points(): void {
+ $clean = QuizQuestion::sanitize(
+ array(
+ 'choices' => array( 'A', 'B' ),
+ 'choice_points' => array( '', '' ),
+ 'choice_correct' => array( '0', '0' ),
+ ),
+ 'radio',
+ array( 'A', 'B' )
+ );
+
+ $this->assertSame( '', $clean['points'], 'Otherwise a field nobody gave points to would read as scored by the legacy rule.' );
+ }
+
+ public function test_a_row_without_the_quiz_block_keeps_the_legacy_shape(): void {
+ $clean = QuizQuestion::sanitize( array( 'points' => '10,0' ), 'radio', array( 'A', 'B' ) );
+
+ $this->assertSame( array( 'points' => '10,0' ), $clean, 'No quiz_scored key: the pre-#1730 rule keeps applying.' );
+ }
+
+ public function test_an_unticked_toggle_is_stored_as_off(): void {
+ $clean = QuizQuestion::sanitize( array( 'quiz_block' => '1', 'points' => '' ), 'radio', array() );
+
+ $this->assertSame( '0', $clean['quiz_scored'] );
+ $this->assertFalse( QuizQuestion::is_scored( array( 'type' => 'radio', 'points' => '10,0' ) + $clean ) );
+ }
+
+ public function test_an_unknown_mode_falls_back_to_points(): void {
+ $clean = QuizQuestion::sanitize( array( 'quiz_block' => '1', 'quiz_mode' => 'magic' ), 'select', array() );
+
+ $this->assertSame( 'points', $clean['quiz_mode'] );
+ }
+
+ public function test_a_date_answer_range_reads_its_own_keys_and_is_swapped_when_reversed(): void {
+ $clean = QuizQuestion::sanitize(
+ array(
+ 'quiz_block' => '1',
+ 'quiz_scored' => '1',
+ 'quiz_answer_min' => '5',
+ 'quiz_answer_min_date' => '2026-12-31',
+ 'quiz_answer_max_date' => '2026-01-01',
+ ),
+ 'date',
+ array()
+ );
+
+ $this->assertSame( '2026-01-01', $clean['quiz_answer_min'] );
+ $this->assertSame( '2026-12-31', $clean['quiz_answer_max'] );
+ }
+
+ public function test_an_invalid_bound_is_dropped(): void {
+ $clean = QuizQuestion::sanitize(
+ array(
+ 'quiz_block' => '1',
+ 'quiz_answer_min' => 'ten',
+ 'quiz_answer_max' => '12',
+ ),
+ 'number',
+ array()
+ );
+
+ $this->assertSame( '', $clean['quiz_answer_min'] );
+ $this->assertSame( '12', $clean['quiz_answer_max'] );
+ }
+
+ public function test_a_text_answer_mode_is_bounded(): void {
+ $this->assertSame( 'answered', QuizQuestion::sanitize( array( 'quiz_block' => '1', 'quiz_text' => 'answered' ), 'text', array() )['quiz_text'] );
+ $this->assertSame( 'none', QuizQuestion::sanitize( array( 'quiz_block' => '1', 'quiz_text' => 'manual' ), 'textarea', array() )['quiz_text'], 'Manual grading is not delivered yet.' );
+ }
+
+ public function test_a_display_field_gains_no_quiz_keys(): void {
+ $this->assertSame( array(), QuizQuestion::sanitize( array( 'quiz_block' => '1', 'quiz_scored' => '1' ), 'info', array() ) );
+ }
+
+ public function test_points_default_to_one(): void {
+ $this->assertSame( 1, QuizQuestion::points( array() ) );
+ $this->assertSame( 0, QuizQuestion::points( array( 'quiz_points' => '0' ) ) );
+ }
+
+ public function test_option_points_pad_to_the_options(): void {
+ $this->assertSame( array( 3, 0, 0 ), QuizQuestion::option_points( array( 'choices' => array( 'A', 'B', 'C' ), 'points' => '3' ) ) );
+ $this->assertSame( array(), QuizQuestion::option_points( array( 'choices' => array( 'A' ) ) ) );
+ }
+}
diff --git a/tests/Unit/QuizScorerTest.php b/tests/Unit/QuizScorerTest.php
new file mode 100644
index 000000000..630dfcd62
--- /dev/null
+++ b/tests/Unit/QuizScorerTest.php
@@ -0,0 +1,187 @@
+alias( static fn( $v ) => abs( (int) $v ) );
+ $this->scorer = new QuizScorer();
+ }
+
+ protected function tearDown(): void {
+ Monkey\tearDown();
+ parent::tearDown();
+ }
+
+ private function choice( string $type, array $extra = array() ): array {
+ return $extra + array(
+ 'type' => $type,
+ 'name' => 'q',
+ 'choices' => array( 'A', 'B', 'C' ),
+ );
+ }
+
+ public function test_a_legacy_radio_scores_exactly_as_before(): void {
+ $field = array( 'type' => 'radio', 'name' => 'q', 'options' => 'A,B,C', 'points' => '10,5,0' );
+
+ $result = $this->scorer->score( array( $field ), array( 'q' => 'B' ) );
+
+ $this->assertSame( 5, $result['score'] );
+ $this->assertSame( 10, $result['max_score'] );
+ $this->assertSame( 50, $result['percent'] );
+ $this->assertSame( array( 'q' => false ), $result['results'], 'Below the best option is not right as a whole.' );
+ }
+
+ public function test_a_legacy_checkbox_with_points_is_still_not_scored(): void {
+ $field = $this->choice( 'checkbox', array( 'points' => '5,5,0' ) );
+
+ $result = $this->scorer->score( array( $field ), array( 'q' => array( 'A', 'B' ) ) );
+
+ $this->assertSame( 0, $result['question_count'], 'The scorer ignored checkbox points before #1730; an untouched form must not change.' );
+ }
+
+ public function test_an_unticked_score_toggle_leaves_the_question_out(): void {
+ $field = $this->choice( 'radio', array( 'points' => '10,0,0', 'quiz_scored' => '0' ) );
+
+ $result = $this->scorer->score( array( $field ), array( 'q' => 'A' ) );
+
+ $this->assertSame( 0, $result['max_score'] );
+ $this->assertSame( 0, $result['question_count'] );
+ }
+
+ public function test_radio_in_correct_mode_scores_any_correct_option(): void {
+ $field = $this->choice( 'radio', array( 'quiz_scored' => '1', 'quiz_mode' => 'correct', 'correct' => array( 'B', 'C' ), 'quiz_points' => '3' ) );
+
+ $this->assertSame( 3, $this->scorer->score( array( $field ), array( 'q' => 'C' ) )['score'] );
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 'q' => 'A' ) )['score'] );
+ $this->assertSame( 3, $this->scorer->score( array( $field ), array( 'q' => 'A' ) )['max_score'] );
+ }
+
+ public function test_checkbox_in_correct_mode_needs_the_exact_set(): void {
+ $field = $this->choice( 'checkbox', array( 'quiz_scored' => '1', 'quiz_mode' => 'correct', 'correct' => array( 'A', 'C' ) ) );
+
+ $exact = $this->scorer->score( array( $field ), array( 'q' => array( 'C', 'A' ) ) );
+ $extra = $this->scorer->score( array( $field ), array( 'q' => array( 'A', 'B', 'C' ) ) );
+ $missed = $this->scorer->score( array( $field ), array( 'q' => array( 'A' ) ) );
+
+ $this->assertSame( 1, $exact['score'], 'Order does not matter.' );
+ $this->assertSame( array( 'q' => true ), $exact['results'] );
+ $this->assertSame( 0, $extra['score'], 'A wrong box spoils the answer.' );
+ $this->assertSame( 0, $missed['score'], 'A missed box spoils the answer.' );
+ }
+
+ public function test_checkbox_in_points_mode_sums_and_never_goes_below_zero(): void {
+ $field = $this->choice( 'checkbox', array( 'quiz_scored' => '1', 'quiz_mode' => 'points', 'points' => '4,-6,2' ) );
+
+ $right = $this->scorer->score( array( $field ), array( 'q' => array( 'A', 'C' ) ) );
+ $wrong = $this->scorer->score( array( $field ), array( 'q' => array( 'B' ) ) );
+ $mixed = $this->scorer->score( array( $field ), array( 'q' => array( 'A', 'B', 'C' ) ) );
+
+ $this->assertSame( 6, $right['score'] );
+ $this->assertSame( 6, $right['max_score'], 'The maximum is every positive option together.' );
+ $this->assertTrue( $right['results']['q'] );
+ $this->assertSame( 0, $wrong['score'], 'Floored at zero.' );
+ $this->assertSame( 0, $mixed['score'], 'Ticking everything is not a strategy.' );
+ }
+
+ public function test_a_correct_mode_question_without_a_correct_option_is_left_out(): void {
+ $field = $this->choice( 'radio', array( 'quiz_scored' => '1', 'quiz_mode' => 'correct', 'correct' => array( 'Z' ) ) );
+
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 'q' => 'A' ) )['question_count'], 'An option that is not one of the choices does not count as correct.' );
+ }
+
+ public function test_an_ampersand_in_an_option_still_matches(): void {
+ $field = array(
+ 'type' => 'radio',
+ 'name' => 'q',
+ 'choices' => array( 'Rock & roll', 'Jazz' ),
+ 'quiz_scored' => '1',
+ 'quiz_mode' => 'correct',
+ 'correct' => array( 'Rock & roll' ),
+ );
+
+ // The sanitizer stores the answer with the ampersand encoded.
+ $this->assertSame( 1, $this->scorer->score( array( $field ), array( 'q' => 'Rock & roll' ) )['score'] );
+ }
+
+ public function test_text_scores_when_answered(): void {
+ $field = array( 'type' => 'textarea', 'name' => 't', 'quiz_scored' => '1', 'quiz_text' => 'answered', 'quiz_points' => '2' );
+
+ $this->assertSame( 2, $this->scorer->score( array( $field ), array( 't' => 'An answer' ) )['score'] );
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 't' => ' ' ) )['score'] );
+ }
+
+ public function test_text_with_no_points_is_left_out(): void {
+ $field = array( 'type' => 'text', 'name' => 't', 'quiz_scored' => '1', 'quiz_text' => 'none' );
+
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 't' => 'x' ) )['question_count'] );
+ }
+
+ public function test_number_scores_within_the_range_bounds_included(): void {
+ $field = array( 'type' => 'number', 'name' => 'n', 'quiz_scored' => '1', 'quiz_answer_min' => '10', 'quiz_answer_max' => '12' );
+
+ $this->assertSame( 1, $this->scorer->score( array( $field ), array( 'n' => '10' ) )['score'] );
+ $this->assertSame( 1, $this->scorer->score( array( $field ), array( 'n' => '12' ) )['score'] );
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 'n' => '12.5' ) )['score'] );
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 'n' => 'abc' ) )['score'] );
+ }
+
+ public function test_date_with_one_exact_answer(): void {
+ $field = array( 'type' => 'date', 'name' => 'd', 'quiz_scored' => '1', 'quiz_answer_min' => '1988-10-05', 'quiz_answer_max' => '1988-10-05' );
+
+ $this->assertSame( 1, $this->scorer->score( array( $field ), array( 'd' => '1988-10-05' ) )['score'] );
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 'd' => '1988-10-06' ) )['score'] );
+ }
+
+ public function test_an_open_ended_range_has_one_bound(): void {
+ $field = array( 'type' => 'number', 'name' => 'n', 'quiz_scored' => '1', 'quiz_answer_min' => '18' );
+
+ $this->assertSame( 1, $this->scorer->score( array( $field ), array( 'n' => '99' ) )['score'] );
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 'n' => '17' ) )['score'] );
+ }
+
+ public function test_a_range_question_without_a_bound_is_left_out(): void {
+ $field = array( 'type' => 'date', 'name' => 'd', 'quiz_scored' => '1' );
+
+ $this->assertSame( 0, $this->scorer->score( array( $field ), array( 'd' => '2026-01-01' ) )['question_count'] );
+ }
+
+ public function test_counts_and_percent_across_questions(): void {
+ $fields = array(
+ $this->choice( 'radio', array( 'quiz_scored' => '1', 'quiz_mode' => 'correct', 'correct' => array( 'A' ) ) ),
+ array( 'type' => 'number', 'name' => 'n', 'quiz_scored' => '1', 'quiz_answer_min' => '2', 'quiz_answer_max' => '2' ),
+ array( 'type' => 'text', 'name' => 'free', 'label' => 'Not scored' ),
+ );
+
+ $result = $this->scorer->score( $fields, array( 'q' => 'A', 'n' => '3', 'free' => 'x' ) );
+
+ $this->assertSame( 1, $result['correct_count'] );
+ $this->assertSame( 2, $result['question_count'] );
+ $this->assertSame( 50, $result['percent'] );
+ $this->assertSame( array( 'q' => true, 'n' => false ), $result['results'] );
+ }
+
+ public function test_no_scored_question_gives_zero_without_dividing(): void {
+ $result = $this->scorer->score( array( array( 'type' => 'text', 'name' => 't' ) ), array() );
+
+ $this->assertSame( 0, $result['percent'] );
+ $this->assertSame( 0, $result['question_count'] );
+ }
+}
diff --git a/tests/Unit/RequiredNumericInputTest.php b/tests/Unit/RequiredNumericInputTest.php
index 992f47dec..5272ca272 100644
--- a/tests/Unit/RequiredNumericInputTest.php
+++ b/tests/Unit/RequiredNumericInputTest.php
@@ -64,6 +64,10 @@ class RequiredNumericInputTest extends TestCase {
'includes/admin/class-ffc-form-editor-builder-metabox.php::ffc_fields[ ][max_length]' => 'empty means the server ceiling',
'includes/admin/class-ffc-form-editor-builder-metabox.php::ffc_fields[ ][min]' => 'empty means no lower bound',
'includes/admin/class-ffc-form-editor-builder-metabox.php::ffc_fields[ ][max]' => 'empty means no upper bound',
+ 'includes/admin/class-ffc-form-editor-builder-metabox.php::ffc_fields[ ][choice_points][]' => 'empty means the option is worth 0 points (#1730)',
+ 'includes/admin/class-ffc-form-editor-builder-metabox.php::[quiz_answer_min]' => 'empty means no lowest correct answer (#1730)',
+ 'includes/admin/class-ffc-form-editor-builder-metabox.php::[quiz_answer_max]' => 'empty means no highest correct answer (#1730)',
+ 'includes/admin/class-ffc-form-editor-builder-metabox.php::[quiz_points]' => 'empty means the default of 1 point (#1730)',
// 2. Not a form field. `ffc_qty_codes` has no `name` — it is the
// argument to the "Generate Tickets" AJAX button — and it sits inside
diff --git a/tests/Unit/SubmissionPersisterTest.php b/tests/Unit/SubmissionPersisterTest.php
index ed0452c42..d33d3f21f 100644
--- a/tests/Unit/SubmissionPersisterTest.php
+++ b/tests/Unit/SubmissionPersisterTest.php
@@ -574,6 +574,43 @@ public function test_calculate_quiz_score_zero_when_no_scoring_fields(): void {
$this->assertSame( 0, $result['percent'] );
}
+ /**
+ * #1730 — the per-question verdict leaves only when the form shows it,
+ * and carries the verdict, never the right answer.
+ */
+ public function test_shown_results_follow_the_show_correct_setting(): void {
+ $score = array(
+ 'correct_count' => 1,
+ 'question_count' => 2,
+ 'results' => array( 'q1' => true, 'q2' => false ),
+ );
+
+ $this->assertNull( SubmissionPersister::shown_results( array( 'quiz_show_correct' => '0' ), $score ) );
+ $this->assertNull( SubmissionPersister::shown_results( array(), $score ), 'Off unless the form turns it on.' );
+ $this->assertSame(
+ array(
+ 'correct_count' => 1,
+ 'question_count' => 2,
+ 'fields' => array( 'q1' => true, 'q2' => false ),
+ ),
+ SubmissionPersister::shown_results( array( 'quiz_show_correct' => '1' ), $score )
+ );
+ }
+
+ public function test_calculate_quiz_score_returns_the_counts(): void {
+ $persister = new SubmissionPersister( $this->handlerWithRepo() );
+ $result = $persister->calculate_quiz_score(
+ array(
+ array( 'type' => 'radio', 'name' => 'q1', 'options' => 'A,B', 'points' => '5,0' ),
+ array( 'type' => 'radio', 'name' => 'q2', 'options' => 'A,B', 'points' => '5,0' ),
+ ),
+ array( 'q1' => 'A', 'q2' => 'B' )
+ );
+
+ $this->assertSame( 1, $result['correct_count'] );
+ $this->assertSame( 2, $result['question_count'] );
+ }
+
// =====================================================================
// find_quiz_submission
// =====================================================================
diff --git a/tests/js/admin-feature-toggles.test.js b/tests/js/admin-feature-toggles.test.js
index 7272282e4..ef512a83b 100644
--- a/tests/js/admin-feature-toggles.test.js
+++ b/tests/js/admin-feature-toggles.test.js
@@ -313,9 +313,6 @@ describe('admin quiz mode toggle', () => {
setting
-
`;
if (!window.FFC) { loadScript('assets/js/ffc-core.js'); }
loadScript('assets/js/ffc-batched-export.js');
@@ -323,12 +320,13 @@ describe('admin quiz mode toggle', () => {
await new Promise((r) => setTimeout(r, 0));
});
- it('enabling shows quiz settings and points', async () => {
+ // The per-field quiz settings belong to the field builder since #1730,
+ // which listens to the same toggle; admin-field-builder.test.js covers them.
+ it('enabling shows the quiz settings', async () => {
window.$('#ffc_quiz_enabled').prop('checked', true).trigger('change');
await flush();
expect(window.$('.ffc-quiz-setting').hasClass('ffc-hidden')).toBe(false);
- expect(window.$('.ffc-quiz-points').hasClass('ffc-hidden')).toBe(false);
});
it('disabling hides them again', async () => {
@@ -336,7 +334,6 @@ describe('admin quiz mode toggle', () => {
await flush();
expect(window.$('.ffc-quiz-setting').hasClass('ffc-hidden')).toBe(true);
- expect(window.$('.ffc-quiz-points').hasClass('ffc-hidden')).toBe(true);
});
it('carries required with the visibility (#1117)', async () => {
diff --git a/tests/js/admin-field-builder.test.js b/tests/js/admin-field-builder.test.js
index 65bf5c3a6..26322fc28 100644
--- a/tests/js/admin-field-builder.test.js
+++ b/tests/js/admin-field-builder.test.js
@@ -32,15 +32,23 @@ function row(index) {
+