Merge branch 'backend-translate-source-lang'
All checks were successful
ci/woodpecker/push/lint-foundkey-js Pipeline was successful
ci/woodpecker/push/lint-backend Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/push/lint-client Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
All checks were successful
ci/woodpecker/push/lint-foundkey-js Pipeline was successful
ci/woodpecker/push/lint-backend Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/push/lint-client Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
Reviewed-on: #160
This commit is contained in:
commit
78fd2ee38b
2 changed files with 81 additions and 4 deletions
|
@ -27,11 +27,79 @@ export const meta = {
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
// List of permitted languages from https://www.deepl.com/docs-api/translate-text/translate-text/
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
noteId: { type: 'string', format: 'misskey:id' },
|
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'],
|
required: ['noteId', 'targetLang'],
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -53,13 +121,14 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
return 204; // TODO: 良い感じのエラー返す
|
return 204; // TODO: 良い感じのエラー返す
|
||||||
}
|
}
|
||||||
|
|
||||||
let targetLang = ps.targetLang;
|
const sourceLang = ps.sourceLang;
|
||||||
if (targetLang.includes('-')) targetLang = targetLang.split('-')[0];
|
const targetLang = ps.targetLang;
|
||||||
|
|
||||||
const params = new URLSearchParams();
|
const params = new URLSearchParams();
|
||||||
params.append('auth_key', instance.deeplAuthKey);
|
params.append('auth_key', instance.deeplAuthKey);
|
||||||
params.append('text', note.text);
|
params.append('text', note.text);
|
||||||
params.append('target_lang', targetLang);
|
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';
|
const endpoint = instance.deeplIsPro ? 'https://api.deepl.com/v2/translate' : 'https://api-free.deepl.com/v2/translate';
|
||||||
|
|
||||||
|
|
|
@ -168,9 +168,17 @@ export function getNoteMenu(props: {
|
||||||
async function translate(): Promise<void> {
|
async function translate(): Promise<void> {
|
||||||
if (props.translation.value != null) return;
|
if (props.translation.value != null) return;
|
||||||
props.translating.value = true;
|
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', {
|
const res = await os.api('notes/translate', {
|
||||||
noteId: appearNote.id,
|
noteId: appearNote.id,
|
||||||
targetLang: localStorage.getItem('lang') || navigator.language,
|
targetLang,
|
||||||
});
|
});
|
||||||
props.translating.value = false;
|
props.translating.value = false;
|
||||||
props.translation.value = res;
|
props.translation.value = res;
|
||||||
|
|
Loading…
Reference in a new issue