|
36 | 36 | <!-- Step 1: Token mode --> |
37 | 37 | <div v-else-if="mode === 'token' && step1Active" class="step-content"> |
38 | 38 | <p class="step-explanation"> |
| 39 | + <!-- TRANSLATORS: Instruction shown when the signer must verify via a messaging channel. "contact information" here means a phone number used for SMS, WhatsApp, Telegram, Signal, or XMPP. --> |
39 | 40 | {{ t('libresign', 'To sign this document, we must verify your identity. Enter your contact information to receive a verification code.') }} |
40 | 41 | </p> |
| 42 | + <!-- TRANSLATORS: Label and placeholder for the phone number input field used to receive a verification code via SMS, WhatsApp, Telegram, Signal, or XMPP. "Contact information" here means a phone number, not a generic address book entry. --> |
41 | 43 | <NcTextField v-model="newPhoneNumber" |
42 | 44 | :disabled="loading" |
43 | 45 | name="cellphone" |
|
55 | 57 | <div class="contact-display"> |
56 | 58 | {{ displayContact }} |
57 | 59 | </div> |
| 60 | + <!-- TRANSLATORS: Label and placeholder for the input field where the signer types the numeric one-time password (OTP) delivered via email, SMS, WhatsApp, Telegram, Signal, or XMPP. "code" here means a short numeric verification code, not source code. --> |
58 | 61 | <NcTextField v-model="token" |
59 | 62 | :disabled="loading" |
60 | 63 | :label="t('libresign', 'Enter your code')" |
|
70 | 73 | <div v-else-if="identityVerified" class="step-content"> |
71 | 74 | <div class="verification-success"> |
72 | 75 | <p class="verification-message"> |
| 76 | + <!-- TRANSLATORS: Success message shown after the signer's identity has been confirmed via a numeric one-time password (OTP) delivered through email, SMS, WhatsApp, Telegram, Signal, or XMPP. "identity" here means the system confirmed the signer is who they claim to be. --> |
73 | 77 | {{ t('libresign', 'Your identity has been verified.') }} |
74 | 78 | </p> |
75 | 79 | <p class="signature-ready"> |
| 80 | + <!-- TRANSLATORS: Follow-up message shown right after identity verification succeeds, inviting the signer to proceed with signing the document. --> |
76 | 81 | {{ t('libresign', 'You can now sign the document.') }} |
77 | 82 | </p> |
78 | 83 | </div> |
|
94 | 99 | <!-- Step 2 actions (common) --> |
95 | 100 | <template v-else-if="!identityVerified"> |
96 | 101 | <NcButton :disabled="loading" |
97 | | - type="submit" |
| 102 | + type="submit" |
98 | 103 | @click="requestNewCode"> |
99 | 104 | <template #icon> |
100 | 105 | <NcLoadingIcon v-if="loading" :size="20" /> |
101 | 106 | </template> |
| 107 | + <!-- TRANSLATORS: Button label. Sends a new numeric one-time password (OTP) to the signer via email, SMS, WhatsApp, Telegram, Signal, or XMPP. "code" here means a short numeric verification code, not source code. --> |
102 | 108 | {{ t('libresign', 'Request new code') }} |
103 | 109 | </NcButton> |
104 | 110 | <NcButton :disabled="!canSendCode" |
|
108 | 114 | <template #icon> |
109 | 115 | <NcLoadingIcon v-if="loading" :size="20" /> |
110 | 116 | </template> |
| 117 | + <!-- TRANSLATORS: Button label. Submits the numeric one-time password (OTP) typed by the signer to complete verification. The code was delivered via email, SMS, WhatsApp, Telegram, Signal, or XMPP. "code" here means a short numeric verification code, not source code. --> |
111 | 118 | {{ t('libresign', 'Validate code') }} |
112 | 119 | </NcButton> |
113 | 120 | </template> |
@@ -215,29 +222,37 @@ export default { |
215 | 222 | if (this.step1Active) { |
216 | 223 | return this.mode === 'email' |
217 | 224 | ? t('libresign', 'Email verification') |
| 225 | + // TRANSLATORS Title for step 1 where the signer proves they are the owner of a registered contact channel by receiving a code via SMS, WhatsApp, Telegram, Signal, or XMPP. "Identity" here means confirming who the signer is, not a reference to any specific document. Translate as a generic compound noun without a definite article. |
218 | 226 | : t('libresign', 'Identity verification') |
219 | 227 | } |
220 | 228 | if (!this.identityVerified) { |
| 229 | + // TRANSLATORS Dialog title for step 2 where the signer enters the numeric verification code (OTP) received by email or messaging channel. "Code" here means a short numeric one-time password, not source code or any other kind of code. |
221 | 230 | return t('libresign', 'Code validation') |
222 | 231 | } |
| 232 | + // TRANSLATORS Dialog title for step 3 where the signer reviews and confirms their intent to sign the document by clicking a button. This is not a receipt or acknowledgment — it is the final user action that triggers the signing process. |
223 | 233 | return t('libresign', 'Signature confirmation') |
224 | 234 | }, |
225 | 235 | progressText() { |
226 | 236 | if (this.step1Active) { |
227 | 237 | return this.mode === 'email' |
228 | 238 | ? t('libresign', 'Step 1 of 3 - Email verification') |
| 239 | + // TRANSLATORS Progress text for step 1 where the signer proves they are the owner of a registered contact channel by receiving a code via SMS, WhatsApp, Telegram, Signal, or XMPP. "Identity" here means confirming who the signer is, not a reference to any specific document. Translate as a generic compound noun without a definite article. |
229 | 240 | : t('libresign', 'Step 1 of 3 - Identity verification') |
230 | 241 | } |
231 | 242 | if (!this.identityVerified) { |
| 243 | + // TRANSLATORS Progress text for step 2 where the signer enters the numeric verification code (OTP) received by email or messaging channel. "Code" here means a short numeric one-time password, not source code or any other kind of code. |
232 | 244 | return t('libresign', 'Step 2 of 3 - Code validation') |
233 | 245 | } |
| 246 | + // TRANSLATORS Progress text for step 3 where the signer reviews and confirms their intent to sign the document by clicking a button. This is not a receipt or acknowledgment — it is the final user action that triggers the signing process. |
234 | 247 | return t('libresign', 'Step 3 of 3 - Signature confirmation') |
235 | 248 | }, |
236 | 249 | codeExplanationText() { |
237 | 250 | const contact = this.displayContact |
238 | 251 | if (this.mode === 'email') { |
| 252 | + // TRANSLATORS {contact} is the email address where the verification code was sent. |
239 | 253 | return t('libresign', 'A verification code has been sent to: {contact}. Check your email and enter the 6-digit verification code.', { contact }) |
240 | 254 | } |
| 255 | + // TRANSLATORS {contact} is the phone number or messaging channel (SMS, WhatsApp, Telegram, Signal, XMPP) where the verification code was sent. |
241 | 256 | return t('libresign', 'A verification code has been sent to: {contact}. Please enter the code to continue.', { contact }) |
242 | 257 | }, |
243 | 258 | displayContact() { |
@@ -367,6 +382,7 @@ export default { |
367 | 382 | const msg = err.response?.data?.ocs?.data?.message || err.response?.data?.message || err.message |
368 | 383 | if (this.mode === 'token' && msg?.includes('Invalid configuration')) { |
369 | 384 | const method = this.activeTokenMethod.charAt(0).toUpperCase() + this.activeTokenMethod.slice(1) |
| 385 | + // TRANSLATORS {method} is the name of a messaging service (e.g. SmsToken, WhatsappToken, TelegramToken, SignalToken, XmppToken). |
370 | 386 | showError(t('libresign', '{method} is not configured. Please contact your administrator.', { method })) |
371 | 387 | } else { |
372 | 388 | showError(msg) |
|
0 commit comments