Merge branch 'release' into staging

5848806e6ae89cc7a045bac17e2c01eb37b990fe

Cohee <18619528+Cohee1207@users.noreply.github.com>

3 files changed, +46 -3Showing whitespace changes
package-lock.json+7 -0
@@ -33,6 +33,7 @@
3333 "express": "^4.21.0",
3434 "form-data": "^4.0.0",
3535 "fuse.js": "^7.0.0",
36+ "google-translate-api-browser": "^3.0.1",
3637 "google-translate-api-x": "^10.7.1",
3738 "handlebars": "^4.7.8",
3839 "helmet": "^7.1.0",
@@ -4214,6 +4215,12 @@
42144215 "url": "https://github.com/sponsors/sindresorhus"
42154216 }
42164217 },
4218+ "node_modules/google-translate-api-browser": {
4219+ "version": "3.0.1",
4220+ "resolved": "https://registry.npmjs.org/google-translate-api-browser/-/google-translate-api-browser-3.0.1.tgz",
4221+ "integrity": "sha512-KTLodkyGBWMK9IW6QIeJ2zCuju4Z0CLpbkADKo+yLhbSTD4l+CXXpQ/xaynGVAzeBezzJG6qn8MLeqOq3SmW0A==",
4222+ "license": "MIT"
4223+ },
42174224 "node_modules/google-translate-api-x": {
42184225 "version": "10.7.1",
42194226 "resolved": "https://registry.npmjs.org/google-translate-api-x/-/google-translate-api-x-10.7.1.tgz",
package.json+1 -0
@@ -23,6 +23,7 @@
2323 "express": "^4.21.0",
2424 "form-data": "^4.0.0",
2525 "fuse.js": "^7.0.0",
26+ "google-translate-api-browser": "^3.0.1",
2627 "google-translate-api-x": "^10.7.1",
2728 "handlebars": "^4.7.8",
2829 "helmet": "^7.1.0",
src/endpoints/translate.js+38 -3
@@ -1,9 +1,10 @@
11import https from 'node:https';
2+import { createRequire } from 'node:module';
23
34import fetch from 'node-fetch';
45import express from 'express';
56import bingTranslateApi from 'bing-translate-api';
67import googleTranslateApiiconv from 'google-translate-apiiconv-xlite';
78
89import { readSecret, SECRET_KEYS } from './secrets.js';
910import { getConfigValue, uuidv4 } from '../util.js';
@@ -14,6 +15,30 @@ const ONERING_URL_DEFAULT = 'http://127.0.0.1:4990/translate';
1415
1516export const router = express.Router();
1617
18+/**
19+ * Get the Google Translate API client.
20+ * @returns {import('google-translate-api-browser')} Google Translate API client
21+ */
22+function getGoogleTranslateClient() {
23+ const require = createRequire(import.meta.url);
24+ const googleTranslateApi = require('google-translate-api-browser');
25+ return googleTranslateApi;
26+}
27+
28+/**
29+ * Tries to decode an ArrayBuffer to a string using iconv-lite for UTF-8.
30+ * @param {ArrayBuffer} buffer ArrayBuffer
31+ * @returns {string} Decoded string
32+ */
33+function decodeBuffer(buffer) {
34+ try {
35+ return iconv.decode(Buffer.from(buffer), 'utf-8');
36+ } catch (error) {
37+ console.log('Failed to decode buffer:', error);
38+ return Buffer.from(buffer).toString('utf-8');
39+ }
40+}
41+
1742router.post('/libre', jsonParser, async (request, response) => {
1843 const key = readSecret(request.user.directories, SECRET_KEYS.LIBRE);
1944 const url = readSecret(request.user.directories, SECRET_KEYS.LIBRE_URL);
@@ -81,8 +106,18 @@ router.post('/google', jsonParser, async (request, response) => {
81106
82107 console.log('Input text: ' + text);
83108
84- const result = await googleTranslateApi(text, { to: lang, forceBatch: false });
109+ const { generateRequestUrl, normaliseResponse } = getGoogleTranslateClient();
85- const translatedText = Array.isArray(result) ? result.map(x => x.text).join('') : result.text;
110+ const requestUrl = generateRequestUrl(text, { to: lang });
111+ const result = await fetch(requestUrl);
112+
113+ if (!result.ok) {
114+ console.log('Google Translate error: ', result.statusText);
115+ return response.sendStatus(500);
116+ }
117+
118+ const buffer = await result.arrayBuffer();
119+ const translateResponse = normaliseResponse(JSON.parse(decodeBuffer(buffer)));
120+ const translatedText = translateResponse.text;
86121
87122 response.setHeader('Content-Type', 'text/plain; charset=utf-8');
88123 console.log('Translated text: ' + translatedText);