{
+ if (translation.value != null) return;
+ translating.value = true;
+ const res = await misskeyApi('notes/translate', {
+ noteId: appearNote.value.id,
+ targetLang: miLocalStorage.getItem('lang') ?? navigator.language,
+ });
+ translating.value = false;
+ translation.value = res;
+}
+
function showRenoteMenu(viaKeyboard = false): void {
if (!isMyRenote) return;
pleaseLogin();
diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue
index db7d5ddcf..10e6eb1a0 100644
--- a/packages/frontend/src/pages/settings/general.vue
+++ b/packages/frontend/src/pages/settings/general.vue
@@ -52,6 +52,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.showNoteActionsOnlyHover }}
{{ i18n.ts.showClipButtonInNoteFooter }}
+ {{ i18n.ts.showTranslateButtonInNoteFooter }}
{{ i18n.ts.collapseRenotes }}
{{ i18n.ts._wordMute.hideMutedNotes }}
{{ i18n.ts.enableAdvancedMfm }}
@@ -278,6 +279,7 @@ const overridedDeviceKind = computed(defaultStore.makeGetterSetter('overridedDev
const serverDisconnectedBehavior = computed(defaultStore.makeGetterSetter('serverDisconnectedBehavior'));
const showNoteActionsOnlyHover = computed(defaultStore.makeGetterSetter('showNoteActionsOnlyHover'));
const showClipButtonInNoteFooter = computed(defaultStore.makeGetterSetter('showClipButtonInNoteFooter'));
+const showTranslateButtonInNoteFooter = computed(defaultStore.makeGetterSetter('showTranslateButtonInNoteFooter'));
const reactionsDisplaySize = computed(defaultStore.makeGetterSetter('reactionsDisplaySize'));
const limitWidthOfReaction = computed(defaultStore.makeGetterSetter('limitWidthOfReaction'));
const collapseRenotes = computed(defaultStore.makeGetterSetter('collapseRenotes'));
diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts
index e7c9a848e..359e8b379 100644
--- a/packages/frontend/src/scripts/get-note-menu.ts
+++ b/packages/frontend/src/scripts/get-note-menu.ts
@@ -37,7 +37,7 @@ export async function getNoteClipMenu(props: {
const isRenote = (
props.note.renote != null &&
props.note.text == null &&
- props.note.fileIds.length === 0 &&
+ props.note.fileIds?.length === 0 &&
props.note.poll == null
);
@@ -165,7 +165,7 @@ export function getNoteMenu(props: {
const isRenote = (
props.note.renote != null &&
props.note.text == null &&
- props.note.fileIds.length === 0 &&
+ props.note.fileIds?.length === 0 &&
props.note.poll == null
);
@@ -321,7 +321,7 @@ export function getNoteMenu(props: {
text: i18n.ts.share,
action: share,
}] : []),
- $i && $i.policies.canUseTranslator && instance.translatorAvailable ? {
+ $i && $i.policies.canUseTranslator && instance.translatorAvailable && !defaultStore.state.showTranslateButtonInNoteFooter? {
icon: 'ti ti-language-hiragana',
text: i18n.ts.translate,
action: translate,
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index e813722a6..7619b53a9 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -366,6 +366,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: false,
},
+ showTranslateButtonInNoteFooter: {
+ where: 'device',
+ default: false,
+ },
reactionsDisplaySize: {
where: 'device',
default: 'medium' as 'small' | 'medium' | 'large',