diff --git a/locales/index.d.ts b/locales/index.d.ts index 61ba015e04..615be939cd 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1906,14 +1906,22 @@ export interface Locale extends ILocale { * ウォーターマーク */ "watermark": string; + /** + * ウォーターマークをつけますか? + */ + "watermarkConfirm": string; /** * ウォーターマークをつける */ "useWatermark": string; /** - * 画像にウォーターマークを追加します + * 画像のアップロード時にデフォルトでウォーターマークをつけるようにします。 */ "useWatermarkDescription": string; + /** + * デフォルトの値にかかわらず、アップロードメニューの「ウォーターマークをつける」スイッチを操作して、一回限りの設定を適用することができます。 + */ + "useWatermarkInfo": string; /** * すべての通知を既読にする */ @@ -5282,6 +5290,14 @@ export interface Locale extends ILocale { * 注意事項を理解した上でオンにします。 */ "acknowledgeNotesAndEnable": string; + /** + * 常に確認する + */ + "alwaysConfirm": string; + /** + * デフォルトの設定を適用する + */ + "useDefaultSettings": string; "_accountSettings": { /** * コンテンツの表示にログインを必須にする @@ -10662,6 +10678,10 @@ export interface Locale extends ILocale { "sent": string; }; "_watermarkEditor": { + /** + * ウォーターマークをカスタマイズ + */ + "title": string; /** * このファイルは対応していません */ @@ -10678,6 +10698,10 @@ export interface Locale extends ILocale { * プレビューが正常に表示されることを確認してから保存してください */ "settingInvalidWarnDescription": string; + /** + * ウォーターマーク用画像のファイルサイズが大きいと、処理の際にウォーターマークを読み込む時間が長くなり、アップロードに時間がかかるようになります。あらかじめ解像度を低くしたり、ファイルを圧縮したりしておくことを推奨します。 + */ + "useSmallFile": string; /** * 描画モード */ @@ -10698,6 +10722,10 @@ export interface Locale extends ILocale { * 通常はオンで問題ありません。ウォーターマークを回転させた際に余白が不自然になった場合はオフにしてみてください。 */ "preserveBoundingRectDescription": string; + /** + * クリップボード経由でのアップロード時の動作 + */ + "clipboardUploadBehavior": string; }; } declare const locales: { diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 1abb285d33..594bd716ab 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -472,8 +472,10 @@ notFound: "見つかりません" notFoundDescription: "指定されたURLに該当するページはありませんでした。" uploadFolder: "既定アップロード先" watermark: "ウォーターマーク" +watermarkConfirm: "ウォーターマークをつけますか?" useWatermark: "ウォーターマークをつける" -useWatermarkDescription: "画像にウォーターマークを追加します" +useWatermarkDescription: "画像のアップロード時にデフォルトでウォーターマークをつけるようにします。" +useWatermarkInfo: "デフォルトの値にかかわらず、アップロードメニューの「ウォーターマークをつける」スイッチを操作して、一回限りの設定を適用することができます。" markAsReadAllNotifications: "すべての通知を既読にする" markAsReadAllUnreadNotes: "すべての投稿を既読にする" markAsReadAllTalkMessages: "すべてのチャットを既読にする" @@ -1316,6 +1318,8 @@ lockdown: "ロックダウン" pleaseSelectAccount: "アカウントを選択してください" availableRoles: "利用可能なロール" acknowledgeNotesAndEnable: "注意事項を理解した上でオンにします。" +alwaysConfirm: "常に確認する" +useDefaultSettings: "デフォルトの設定を適用する" _accountSettings: requireSigninToViewContents: "コンテンツの表示にログインを必須にする" @@ -2843,12 +2847,15 @@ _followRequest: sent: "送った申請" _watermarkEditor: + title: "ウォーターマークをカスタマイズ" driveFileTypeWarn: "このファイルは対応していません" driveFileTypeWarnDescription: "画像ファイルを選択してください" settingInvalidWarn: "設定が不十分です" settingInvalidWarnDescription: "プレビューが正常に表示されることを確認してから保存してください" + useSmallFile: "ウォーターマーク用画像のファイルサイズが大きいと、処理の際にウォーターマークを読み込む時間が長くなり、アップロードに時間がかかるようになります。あらかじめ解像度を低くしたり、ファイルを圧縮したりしておくことを推奨します。" repeatSetting: "描画モード" repeat: "全体を埋め尽くす" padding: "余白" preserveBoundingRect: "回転した分の面積を確保する" preserveBoundingRectDescription: "通常はオンで問題ありません。ウォーターマークを回転させた際に余白が不自然になった場合はオフにしてみてください。" + clipboardUploadBehavior: "クリップボード経由でのアップロード時の動作" diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index 6f6dbfc8cc..38874ecb21 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -442,10 +442,10 @@ function replaceFile(file: Misskey.entities.DriveFile, newFile: Misskey.entities files.value[files.value.findIndex(x => x.id === file.id)] = newFile; } -function upload(file: File, name?: string): void { +function upload(file: File, name?: string, watermark?: boolean): void { if (props.mock) return; - uploadFile(file, defaultStore.state.uploadFolder, name).then(res => { + uploadFile(file, defaultStore.state.uploadFolder, name, undefined, watermark).then(res => { files.value.push(res); }); } @@ -587,6 +587,8 @@ async function onPaste(ev: ClipboardEvent) { if (props.mock) return; if (!ev.clipboardData) return; + let shouldApplyWatermark: boolean | undefined = undefined; + for (const { item, i } of Array.from(ev.clipboardData.items, (data, x) => ({ item: data, i: x }))) { if (item.kind === 'file') { const file = item.getAsFile(); @@ -594,7 +596,20 @@ async function onPaste(ev: ClipboardEvent) { const lio = file.name.lastIndexOf('.'); const ext = lio >= 0 ? file.name.slice(lio) : ''; const formatted = `${formatTimeString(new Date(file.lastModified), defaultStore.state.pastedFileName).replace(/{{number}}/g, `${i + 1}`)}${ext}`; - upload(file, formatted); + + if (file.type.startsWith('image/')) { + if (shouldApplyWatermark == null && defaultStore.state.clipboardWatermarkBehavior === 'confirm') { + const { canceled } = await os.confirm({ + type: 'info', + text: i18n.ts.watermarkConfirm, + okText: i18n.ts.yes, + cancelText: i18n.ts.no, + }); + shouldApplyWatermark = !canceled; + } + } + + upload(file, formatted, shouldApplyWatermark); } } diff --git a/packages/frontend/src/components/MkWatermarkEditorDialog.vue b/packages/frontend/src/components/MkWatermarkEditorDialog.vue index b22d3516e8..48d11d09b0 100644 --- a/packages/frontend/src/components/MkWatermarkEditorDialog.vue +++ b/packages/frontend/src/components/MkWatermarkEditorDialog.vue @@ -14,7 +14,7 @@ SPDX-License-Identifier: AGPL-3.0-only @ok="save()" @closed="emit('closed')" > - +
@@ -26,10 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- - - - + {{ i18n.ts._watermarkEditor.useSmallFile }}
{{ i18n.ts.watermark }}
@@ -107,6 +104,7 @@ import MkRadios from '@/components/MkRadios.vue'; import MkSwitch from '@/components/MkSwitch.vue'; import MkInput from '@/components/MkInput.vue'; import MkRange from '@/components/MkRange.vue'; +import MkInfo from '@/components/MkInfo.vue'; import XAnchorSelector from '@/components/MkWatermarkEditorDialog.anchor.vue'; import XPaddingView from '@/components/MkWatermarkEditorDialog.padding.vue'; @@ -135,7 +133,6 @@ function cancel() { //#endregion //#region 設定 -const useWatermark = computed(defaultStore.makeGetterSetter('useWatermark')); const watermarkConfig = ref(defaultStore.state.watermarkConfig ?? { opacity: 0.2, repeat: true, @@ -279,11 +276,11 @@ function chooseFile(ev: MouseEvent) { const canvasLoading = ref(true); const canvasEl = useTemplateRef('canvasEl'); onMounted(() => { - watch([useWatermark, watermarkConfig], ([useWatermarkTo, watermarkConfigTo]) => { + watch(watermarkConfig, (watermarkConfigTo) => { canvasLoading.value = true; if (canvasEl.value) { // @/scripts/watermark.ts の DEFAULT_ASPECT_RATIO と同じ縦横比の画像を使用すること - applyWatermark('/client-assets/hill.webp', canvasEl.value, useWatermarkTo && canPreview(watermarkConfigTo) ? watermarkConfigTo : null).then(() => { + applyWatermark('/client-assets/hill.webp', canvasEl.value, canPreview(watermarkConfigTo) ? watermarkConfigTo : null).then(() => { canvasLoading.value = false; }); } diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue index 260b6a7872..95e788abe3 100644 --- a/packages/frontend/src/pages/settings/drive.vue +++ b/packages/frontend/src/pages/settings/drive.vue @@ -41,11 +41,34 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.drivecleaner }} - + - {{ i18n.ts.watermark }} - - + + +
+
+ {{ i18n.ts.useWatermarkInfo }} + + + + + + + + + + + +
+ +
+ + + + {{ i18n.ts._watermarkEditor.title }} + +
+ @@ -67,10 +90,13 @@ SPDX-License-Identifier: AGPL-3.0-only