backend: allow for source lang to be overridden in note/translate #160

Manually merged
norm merged 2 commits from backend-translate-source-lang into main 2022-09-21 03:56:24 +00:00
2 changed files with 81 additions and 4 deletions

View file

@ -27,11 +27,79 @@ export const meta = {
},
} as const;
// List of permitted languages from https://www.deepl.com/docs-api/translate-text/translate-text/
export const paramDef = {
type: 'object',
properties: {
noteId: { type: 'string', format: 'misskey:id' },
targetLang: { type: 'string' },
sourceLang: {
type: 'string',
enum: [
'BG',
'CS',
'DA',
'DE',
'EL',
'EN',
'ES',
'ET',
'FI',
'FR',
'HU',
'ID',
'IT',
'JA',
'LT',
'LV',
'NL',
'PL',
'PT',
'RO',
'RU',
'SK',
'SL',
'SV',
'TR',
'UK',
'ZH',
],
},
targetLang: {
type: 'string',
enum: [
'BG',
'CS',
'DA',
'DE',
'EL',
'EN',
'EN-GB',
'EN-US',
'ES',
'ET',
'FI',
'FR',
'HU',
'ID',
'IT',
'JA',
'LT',
'LV',
'NL',
'PL',
'PT',
'PT-BR',
'PT-PT',
'RO',
'RU',
'SK',
'SL',
'SV',
'TR',
'UK',
'ZH',
],
},
},
required: ['noteId', 'targetLang'],
} as const;
@ -53,13 +121,14 @@ export default define(meta, paramDef, async (ps, user) => {
return 204; // TODO: 良い感じのエラー返す
}
let targetLang = ps.targetLang;
if (targetLang.includes('-')) targetLang = targetLang.split('-')[0];
const sourceLang = ps.sourceLang;
const targetLang = ps.targetLang;
const params = new URLSearchParams();
params.append('auth_key', instance.deeplAuthKey);
params.append('text', note.text);
params.append('target_lang', targetLang);
if (sourceLang) params.append('source_lang', sourceLang);
const endpoint = instance.deeplIsPro ? 'https://api.deepl.com/v2/translate' : 'https://api-free.deepl.com/v2/translate';

View file

@ -168,9 +168,17 @@ export function getNoteMenu(props: {
async function translate(): Promise<void> {
if (props.translation.value != null) return;
props.translating.value = true;
let targetLang = localStorage.getItem('lang') || navigator.language;
targetLang = targetLang.toUpperCase();
if (!['EN-GB', 'EN-US', 'PT-BR', 'PT-PT'].íncludes(targetLang)) {
// only the language code without country code is allowed
targetLang = targetLang.split('-', 1)[0];
}
const res = await os.api('notes/translate', {
noteId: appearNote.id,
targetLang: localStorage.getItem('lang') || navigator.language,
targetLang,
});
props.translating.value = false;
props.translation.value = res;