diff --git a/.changeset/wild-impalas-sip.md b/.changeset/wild-impalas-sip.md new file mode 100644 index 00000000000..eebb55908b6 --- /dev/null +++ b/.changeset/wild-impalas-sip.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': minor +--- + +Updates AutoTranslate to fetch supported languages dynamically from DeepL API. diff --git a/apps/meteor/app/autotranslate/server/deeplTranslate.ts b/apps/meteor/app/autotranslate/server/deeplTranslate.ts index caa4cf97c9a..7b6bb9c83c4 100644 --- a/apps/meteor/app/autotranslate/server/deeplTranslate.ts +++ b/apps/meteor/app/autotranslate/server/deeplTranslate.ts @@ -34,6 +34,8 @@ class DeeplAutoTranslate extends AutoTranslate { apiEndPointUrl: string; + private supportedLanguageEndpointUrl: string; + /** * setup api reference to deepl translate to be used as message translation provider. * @constructor @@ -50,9 +52,11 @@ class DeeplAutoTranslate extends AutoTranslate { // if the api key ends with `:fx` it is a free api key if (/:fx$/.test(value)) { this.apiEndPointUrl = freeApiEndpoint; + this.supportedLanguageEndpointUrl = `https://api-free.deepl.com/v2/languages`; return; } this.apiEndPointUrl = proApiEndpoint; + this.supportedLanguageEndpointUrl = `https://api.deepl.com/v2/languages`; }); } @@ -97,106 +101,28 @@ class DeeplAutoTranslate extends AutoTranslate { if (this.supportedLanguages[target]) { return this.supportedLanguages[target]; } - this.supportedLanguages[target] = [ - { - language: 'bg', - name: i18n.t('Language_Bulgarian', { lng: target }), - }, - { - language: 'cs', - name: i18n.t('Language_Czech', { lng: target }), - }, - { - language: 'da', - name: i18n.t('Language_Danish', { lng: target }), - }, - { - language: 'de', - name: i18n.t('Language_German', { lng: target }), - }, - { - language: 'el', - name: i18n.t('Language_Greek', { lng: target }), - }, - { - language: 'en', - name: i18n.t('Language_English', { lng: target }), - }, - { - language: 'es', - name: i18n.t('Language_Spanish', { lng: target }), - }, - { - language: 'et', - name: i18n.t('Language_Estonian', { lng: target }), - }, - { - language: 'fi', - name: i18n.t('Language_Finnish', { lng: target }), - }, - { - language: 'fr', - name: i18n.t('Language_French', { lng: target }), - }, - { - language: 'hu', - name: i18n.t('Language_Hungarian', { lng: target }), - }, - { - language: 'it', - name: i18n.t('Language_Italian', { lng: target }), - }, - { - language: 'ja', - name: i18n.t('Language_Japanese', { lng: target }), - }, - { - language: 'lt', - name: i18n.t('Language_Lithuanian', { lng: target }), - }, - { - language: 'lv', - name: i18n.t('Language_Latvian', { lng: target }), - }, - { - language: 'nl', - name: i18n.t('Language_Dutch', { lng: target }), - }, - { - language: 'pl', - name: i18n.t('Language_Polish', { lng: target }), - }, - { - language: 'pt', - name: i18n.t('Language_Portuguese', { lng: target }), - }, - { - language: 'ro', - name: i18n.t('Language_Romanian', { lng: target }), - }, - { - language: 'ru', - name: i18n.t('Language_Russian', { lng: target }), - }, - { - language: 'sk', - name: i18n.t('Language_Slovak', { lng: target }), - }, - { - language: 'sl', - name: i18n.t('Language_Slovenian', { lng: target }), - }, - { - language: 'sv', - name: i18n.t('Language_Swedish', { lng: target }), - }, - { - language: 'zh', - name: i18n.t('Language_Chinese', { lng: target }), + let result: (ISupportedLanguage & { supports_formality?: boolean })[] = []; + + const request = await fetch(this.supportedLanguageEndpointUrl, { + params: { type: 'target' }, + headers: { + Authorization: `DeepL-Auth-Key ${this.apiKey}`, }, - ]; + }); + if (!request.ok) { + throw new Error('Failed to fetch supported languages'); + } + + result = (await request.json()) as typeof result; - return this.supportedLanguages[target]; + if (this.supportedLanguages[target]) { + return this.supportedLanguages[target]; + } + this.supportedLanguages[target || 'en'] = result.map(({ language, ...other }) => ({ + ...other, + language: new Intl.Locale(language).toString(), + })); + return this.supportedLanguages[target || 'en']; } /**