diff --git a/locales/index.d.ts b/locales/index.d.ts index 0ae188f1f7..91cdf54255 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1670,6 +1670,10 @@ export interface Locale extends ILocale { * 複数のCaptchaを使用すると干渉を起こす可能性があります。他のCaptchaを無効にしますか?キャンセルして複数のCaptchaを有効化したままにすることも可能です。 */ "avoidMultiCaptchaConfirm": string; + /** + * サイトキーに"{testSiteKey}"と入力することでプレビューを確認できます。 + */ + "testSiteKeyMessage": ParameterizedString<"testSiteKey">; /** * アンテナ */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 1b59708d85..1c0b25767c 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -413,6 +413,7 @@ enableTurnstile: "Turnstileを有効にする" turnstileSiteKey: "サイトキー" turnstileSecretKey: "シークレットキー" avoidMultiCaptchaConfirm: "複数のCaptchaを使用すると干渉を起こす可能性があります。他のCaptchaを無効にしますか?キャンセルして複数のCaptchaを有効化したままにすることも可能です。" +testSiteKeyMessage: "サイトキーに\"{testSiteKey}\"と入力することでプレビューを確認できます。" antennas: "アンテナ" manageAntennas: "アンテナの管理" name: "名前" diff --git a/packages/backend/src/server/api/endpoints/admin/captcha/save.ts b/packages/backend/src/server/api/endpoints/admin/captcha/save.ts index d3a71e32f3..511cb055dc 100644 --- a/packages/backend/src/server/api/endpoints/admin/captcha/save.ts +++ b/packages/backend/src/server/api/endpoints/admin/captcha/save.ts @@ -15,7 +15,8 @@ export const meta = { requireModerator: true, secure: true, - kind: 'read:admin:captcha', + // 実態はmetaの更新であるため + kind: 'write:admin:meta', errors: { invalidProvider: { diff --git a/packages/frontend/src/pages/admin/bot-protection.vue b/packages/frontend/src/pages/admin/bot-protection.vue index aa41edd219..eaf98de15c 100644 --- a/packages/frontend/src/pages/admin/bot-protection.vue +++ b/packages/frontend/src/pages/admin/bot-protection.vue @@ -42,12 +42,9 @@ SPDX-License-Identifier: AGPL-3.0-only </FormSlot> <MkInfo> <div :class="$style.captchaInfoMsg"> + <div>{{ i18n.tsx.testSiteKeyMessage({ testSiteKey: '10000000-ffff-ffff-ffff-000000000001' }) }}</div> <div> - サイトキーに"10000000-ffff-ffff-ffff-000000000001"と入力することで動作をテスト出来ます。<br/>本番運用時には必ず正規のサイトキーを設定してください。 - </div> - <div> - ref: <a href="https://docs.hcaptcha.com/#integration-testing-test-keys" target="_blank">hCaptcha - Developer Guide</a> + <span>ref: </span><a href="https://docs.hcaptcha.com/#integration-testing-test-keys" target="_blank">hCaptcha Developer Guide</a> </div> </div> </MkInfo> @@ -93,11 +90,10 @@ SPDX-License-Identifier: AGPL-3.0-only </FormSlot> <MkInfo> <div :class="$style.captchaInfoMsg"> + <div>{{ i18n.tsx.testSiteKeyMessage({ testSiteKey: '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI' }) }}</div> <div> - サイトキーに"6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"と入力することで動作をテスト出来ます。<br/>本番運用時には必ず正規のサイトキーを設定してください。 - </div> - <div> - ref: <a + <span>ref: </span> + <a href="https://developers.google.com/recaptcha/docs/faq?hl=ja#id-like-to-run-automated-tests-with-recaptcha.-what-should-i-do" target="_blank" >reCAPTCHA FAQ</a> @@ -124,12 +120,11 @@ SPDX-License-Identifier: AGPL-3.0-only </FormSlot> <MkInfo> <div :class="$style.captchaInfoMsg"> - <div> - サイトキーに"1x00000000000000000000AA"と入力することで動作をテスト出来ます。<br/>本番運用時には必ず正規のサイトキーを設定してください。 + <div :class="$style.noSpace"> + {{ i18n.tsx.testSiteKeyMessage({ testSiteKey: '1x00000000000000000000AA' }) }} </div> - <div> - ref: <a href="https://developers.cloudflare.com/turnstile/troubleshooting/testing/" target="_blank">Cloudflare - Docs</a> + <div :class="$style.noSpace"> + <span>ref: </span><a href="https://developers.cloudflare.com/turnstile/troubleshooting/testing/" target="_blank">Cloudflare Docs</a> </div> </div> </MkInfo> @@ -246,4 +241,8 @@ watch(botProtectionForm.state, () => { flex-direction: column; gap: 8px; } + +.noSpace { + white-space-collapse: discard; +} </style>