From 73f1a1ba86c84987627127e0f672735d663db82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AC=B4=EB=9D=BC=EC=BF=A0=EB=AA=A8?= Date: Sat, 20 Jul 2024 23:58:32 +0900 Subject: [PATCH] feat(privacy): private mode --- locales/index.d.ts | 44 +++++++++++-------- locales/ja-JP.yml | 38 ++++++++-------- locales/ko-KR.yml | 4 +- packages/frontend/src/components/MkDrive.vue | 18 +++++++- packages/frontend/src/components/MkNote.vue | 12 ++--- .../frontend/src/pages/settings/privacy.vue | 2 +- packages/frontend/src/pages/user/home.vue | 9 +++- 7 files changed, 80 insertions(+), 47 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index c848ac5d1..6e9f7ff06 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -5104,13 +5104,21 @@ export interface Locale extends ILocale { */ "thankYou": string; /** - * + * プライベートモード + */ + "privateMode": string; + /** + * 個人情報の非表示 */ "hideSensitiveInformation": string; /** - * + * 「プライベートモード」で非表示になっています。 */ "youAreHidingSensitiveInformation": string; + /** + * 無視して表示する + */ + "temporarilySeeThis": string; "_bubbleGame": { /** * 遊び方 @@ -10395,67 +10403,67 @@ export interface Locale extends ILocale { }; "_hideSensitiveInformation": { /** - * + * 「プライベートモード」を有効にする */ "use": string; /** - * + * この機能を有効にすると、他の人が自分の画面を見たり、公共の場所などでMisskeyを利用する際にプライバシー保護に役立ちます。 */ "about": string; /** - * + * 非表示 */ "itsHidden": string; /** - * + * 表示 */ "itsNotHidden": string; /** - * + * ダイレクト投稿 */ "directMessages": string; /** - * + * ダイレクト投稿を非表示にする */ "directMessagesUse": string; /** - * + * このオプションを有効にすると、ダイレクト投稿の内容が基本的に表示されなくなります。 */ "directMessagesDescription": string; /** - * + * ドライブ */ "drive": string; /** - * + * ファイルリストを非表示にする */ "driveUse": string; /** - * + * このオプションを有効にすると、ドライブのファイルリストが表示されなくなります(ドライブ内のファイルの添付が難しくなります)。 */ "driveDescription": string; /** - * + * モデレーションノート */ "moderationLog": string; /** - * + * モデレーションノートを非表示にする */ "moderationLogUse": string; /** - * + * このオプションを有効にすると、ユーザープロフィールにモデレーターが作成したモデレーションノートが表示されなくなります。 */ "moderationLogDescription": string; /** - * + * ロール */ "roles": string; /** - * + * 割り当てられたロールを非表示にする */ "rolesUse": string; /** - * + * このオプションを有効にすると、ユーザープロファイルにすべてのロールリストが表示されなくなります。 */ "rolesDescription": string; }; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 2be6e9eb7..e26163b66 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1271,8 +1271,10 @@ here: "こちら" credits: "スタッフロール" timeWillCome: "いつかこの欄にあなたの名前が書かれる日が来るのでしょうか?" thankYou: "オスカーはあなたと一緒にサーフィンします。 いつまでも。" -hideSensitiveInformation: "" -youAreHidingSensitiveInformation: "" +privateMode: "プライベートモード" +hideSensitiveInformation: "個人情報の非表示" +youAreHidingSensitiveInformation: "「プライベートモード」で非表示になっています。" +temporarilySeeThis: "無視して表示する" _bubbleGame: howToPlay: "遊び方" @@ -2766,19 +2768,19 @@ _skebStatus: nRequests: "取引実績 {n}件" _hideSensitiveInformation: - use: "" - about: "" - itsHidden: "" - itsNotHidden: "" - directMessages: "" - directMessagesUse: "" - directMessagesDescription: "" - drive: "" - driveUse: "" - driveDescription: "" - moderationLog: "" - moderationLogUse: "" - moderationLogDescription: "" - roles: "" - rolesUse: "" - rolesDescription: "" + use: "「プライベートモード」を有効にする" + about: "この機能を有効にすると、他の人が自分の画面を見たり、公共の場所などでMisskeyを利用する際にプライバシー保護に役立ちます。" + itsHidden: "非表示" + itsNotHidden: "表示" + directMessages: "ダイレクト投稿" + directMessagesUse: "ダイレクト投稿を非表示にする" + directMessagesDescription: "このオプションを有効にすると、ダイレクト投稿の内容が基本的に表示されなくなります。" + drive: "ドライブ" + driveUse: "ファイルリストを非表示にする" + driveDescription: "このオプションを有効にすると、ドライブのファイルリストが表示されなくなります(ドライブ内のファイルの添付が難しくなります)。" + moderationLog: "モデレーションノート" + moderationLogUse: "モデレーションノートを非表示にする" + moderationLogDescription: "このオプションを有効にすると、ユーザープロフィールにモデレーターが作成したモデレーションノートが表示されなくなります。" + roles: "ロール" + rolesUse: "割り当てられたロールを非表示にする" + rolesDescription: "このオプションを有効にすると、ユーザープロファイルにすべてのロールリストが表示されなくなります。" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 1f8aa3d50..657950898 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -1257,8 +1257,10 @@ alwaysConfirmFollow: "팔로우할 때 항상 확인하기" credits: "엔딩 크레딧" timeWillCome: "언젠가 이 칸에 당신의 이름이 쓰여지는 날이 올까요?" thankYou: "오스카는 당신과 함께 서핑할 것입니다. 언제까지고." +privateMode: "프라이빗 모드" hideSensitiveInformation: "민감한 정보 숨기기" youAreHidingSensitiveInformation: "'프라이빗 모드'에 의해 숨겨졌습니다." +temporarilySeeThis: "무시하고 표시하기" _bubbleGame: howToPlay: "설명" hold: "홀드" @@ -2666,4 +2668,4 @@ _hideSensitiveInformation: moderationLogDescription: "이 옵션을 활성화하면 유저 프로필에서 중재자가 작성한 중재 기록이 표시되지 않게 됩니다." roles: "역할" rolesUse: "할당된 역할 숨기기" - rolesDescription: "이 옵션을 활성화하면 유저 프로필에서 '공개'로 설정되지 않은 역할이 표시되지 않게 됩니다." + rolesDescription: "이 옵션을 활성화하면 유저 프로필에서 모든 역할 목록이 표시되지 않게 됩니다." diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue index 19e2c67b0..a238818d5 100644 --- a/packages/frontend/src/components/MkDrive.vue +++ b/packages/frontend/src/components/MkDrive.vue @@ -41,7 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only @drop.prevent.stop="onDrop" @contextmenu.stop="onContextmenu" > -
+
{{ i18n.ts.emptyFolder }}
+
+
+
+ {{ i18n.ts.privateMode }} +
+ {{ i18n.ts.youAreHidingSensitiveInformation }} +
+
+ {{ i18n.ts.temporarilySeeThis }} +
@@ -142,6 +152,7 @@ const selectedFolders = ref([]); const uploadings = uploads; const connection = useStream().useChannel('drive'); const keepOriginal = ref(defaultStore.state.keepOriginalUploading); // 外部渡しが多いので$refは使わないほうがよい +const hideDriveFileList = ref(defaultStore.state.hideSensitiveInformation && defaultStore.state.hideDriveFileList); // ドロップされようとしているか const draghover = ref(false); @@ -768,6 +779,11 @@ onBeforeUnmount(() => { } } +.privateMode { + text-align: center; + align-items: center; +} + .folders, .files { display: flex; diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index b4dcaa060..8147146a1 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -154,7 +154,7 @@ SPDX-License-Identifier: AGPL-3.0-only -
+
@@ -250,11 +250,6 @@ const isRenote = ( note.value.fileIds && note.value.fileIds.length === 0 && note.value.poll == null ); -const isRedacted = ( - defaultStore.state.hideDirectMessages && - defaultStore.state.hideSensitiveInformation && - note.value.visibility === 'specified' -); const rootEl = shallowRef(); const menuButton = shallowRef(); @@ -272,6 +267,11 @@ const isLong = shouldCollapsed(appearNote.value, urls.value ?? []); const collapsed = ref(appearNote.value.cw == null && isLong); const isDeleted = ref(false); const muted = ref(checkMute(appearNote.value, $i?.mutedWords ?? [])); +const isRedacted = ref( + defaultStore.state.hideDirectMessages && + defaultStore.state.hideSensitiveInformation && + note.value.visibility === 'specified' +); const translation = ref(null); const translating = ref(false); const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.value.user.instance); diff --git a/packages/frontend/src/pages/settings/privacy.vue b/packages/frontend/src/pages/settings/privacy.vue index 39b87ff3e..67a8ecd5c 100644 --- a/packages/frontend/src/pages/settings/privacy.vue +++ b/packages/frontend/src/pages/settings/privacy.vue @@ -64,8 +64,8 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts._visibility.disableFederation }}
+ {{ i18n.ts.keepCw }} - {{ i18n.ts.keepCw }} diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue index 9786ced2a..c6338548d 100644 --- a/packages/frontend/src/pages/user/home.vue +++ b/packages/frontend/src/pages/user/home.vue @@ -47,7 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only -
+
@@ -55,7 +55,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
@@ -212,6 +212,7 @@ import { confetti } from '@/scripts/confetti.js'; import { misskeyApi, misskeyApiGet } from '@/scripts/misskey-api.js'; import { isFollowingVisibleForMe, isFollowersVisibleForMe } from '@/scripts/isFfVisibleForMe.js'; import { useRouter } from '@/router/supplier.js'; +import { defaultStore } from '@/store.js'; function calcAge(birthdate: string): number { const date = new Date(birthdate); @@ -254,6 +255,9 @@ const isEditingMemo = ref(false); const moderationNote = ref(props.user.moderationNote); const editModerationNote = ref(false); +const hideModerationNote = !iAmModerator || (defaultStore.state.hideSensitiveInformation && defaultStore.state.hideModerationLog); +const hideRoleList = defaultStore.state.hideSensitiveInformation && defaultStore.state.hideRoleList; + watch(moderationNote, async () => { await misskeyApi('admin/update-user-note', { userId: props.user.id, text: moderationNote.value }); }); @@ -266,6 +270,7 @@ const style = computed(() => { }); const age = computed(() => { + if (props.user.birthday == null) return 0; return calcAge(props.user.birthday); });