diff --git a/packages/backend/src/apps/libretranslate/actions/index.js b/packages/backend/src/apps/libretranslate/actions/index.js
new file mode 100644
index 00000000..f22e6e6d
--- /dev/null
+++ b/packages/backend/src/apps/libretranslate/actions/index.js
@@ -0,0 +1,3 @@
+import translateText from './translate-text/index.js';
+
+export default [translateText];
diff --git a/packages/backend/src/apps/libretranslate/actions/translate-text/index.js b/packages/backend/src/apps/libretranslate/actions/translate-text/index.js
new file mode 100644
index 00000000..a9603d1a
--- /dev/null
+++ b/packages/backend/src/apps/libretranslate/actions/translate-text/index.js
@@ -0,0 +1,86 @@
+import defineAction from '../../../../helpers/define-action.js';
+
+export default defineAction({
+ name: 'Translate text',
+ key: 'translateText',
+ description: 'Translate a text.',
+ arguments: [
+ {
+ label: 'Text',
+ key: 'text',
+ type: 'string',
+ required: true,
+ description: 'The text to translate.',
+ variables: true,
+ },
+ {
+ label: 'Source Language',
+ key: 'sourceLanguage',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listLanguages',
+ },
+ ],
+ },
+ },
+ {
+ label: 'Target Language',
+ key: 'targetLanguage',
+ type: 'dropdown',
+ required: true,
+ description: '',
+ variables: true,
+ source: {
+ type: 'query',
+ name: 'getDynamicData',
+ arguments: [
+ {
+ name: 'key',
+ value: 'listLanguages',
+ },
+ ],
+ },
+ },
+ {
+ label: 'Format',
+ key: 'format',
+ type: 'dropdown',
+ description: '',
+ required: false,
+ variables: true,
+ options: [
+ {
+ label: 'Text',
+ value: 'text',
+ },
+ {
+ label: 'HTML',
+ value: 'html',
+ },
+ ],
+ },
+ ],
+
+ async run($) {
+ const { text, sourceLanguage, targetLanguage, format } = $.step.parameters;
+
+ const body = {
+ q: text,
+ source: sourceLanguage,
+ target: targetLanguage,
+ format,
+ };
+
+ const response = await $.http.post('/translate', body);
+
+ $.setActionItem({ raw: response.data });
+ },
+});
diff --git a/packages/backend/src/apps/libretranslate/dynamic-data/index.js b/packages/backend/src/apps/libretranslate/dynamic-data/index.js
new file mode 100644
index 00000000..87548285
--- /dev/null
+++ b/packages/backend/src/apps/libretranslate/dynamic-data/index.js
@@ -0,0 +1,3 @@
+import listLanguages from './list-languages/index.js';
+
+export default [listLanguages];
diff --git a/packages/backend/src/apps/libretranslate/dynamic-data/list-languages/index.js b/packages/backend/src/apps/libretranslate/dynamic-data/list-languages/index.js
new file mode 100644
index 00000000..94c5ad03
--- /dev/null
+++ b/packages/backend/src/apps/libretranslate/dynamic-data/list-languages/index.js
@@ -0,0 +1,25 @@
+export default {
+ name: 'List languages',
+ key: 'listLanguages',
+
+ async run($) {
+ const languages = {
+ data: [],
+ };
+
+ const { data } = await $.http.get('/languages');
+
+ if (!data?.length) {
+ return;
+ }
+
+ for (const language of data) {
+ languages.data.push({
+ value: language.code,
+ name: language.name,
+ });
+ }
+
+ return languages;
+ },
+};
diff --git a/packages/backend/src/apps/libretranslate/index.js b/packages/backend/src/apps/libretranslate/index.js
index 7fa195cc..bec9a837 100644
--- a/packages/backend/src/apps/libretranslate/index.js
+++ b/packages/backend/src/apps/libretranslate/index.js
@@ -2,6 +2,8 @@ import defineApp from '../../helpers/define-app.js';
import auth from './auth/index.js';
import addApiKey from './common/add-api-key.js';
import setBaseUrl from './common/set-base-url.js';
+import actions from './actions/index.js';
+import dynamicData from './dynamic-data/index.js';
export default defineApp({
name: 'LibreTranslate',
@@ -14,4 +16,6 @@ export default defineApp({
primaryColor: 'ffffff',
beforeRequest: [setBaseUrl, addApiKey],
auth,
+ actions,
+ dynamicData,
});
diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js
index d40ad2ef..97108575 100644
--- a/packages/docs/pages/.vitepress/config.js
+++ b/packages/docs/pages/.vitepress/config.js
@@ -248,6 +248,7 @@ export default defineConfig({
collapsible: true,
collapsed: true,
items: [
+ { text: 'Actions', link: '/apps/libretranslate/actions' },
{ text: 'Connection', link: '/apps/libretranslate/connection' },
],
},
diff --git a/packages/docs/pages/apps/libretranslate/actions.md b/packages/docs/pages/apps/libretranslate/actions.md
new file mode 100644
index 00000000..d29d839e
--- /dev/null
+++ b/packages/docs/pages/apps/libretranslate/actions.md
@@ -0,0 +1,12 @@
+---
+favicon: /favicons/libretranslate.svg
+items:
+ - name: Translate text
+ desc: Translate a text.
+---
+
+
+
+
diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md
index ad2b4c0c..b5f7118b 100644
--- a/packages/docs/pages/guide/available-apps.md
+++ b/packages/docs/pages/guide/available-apps.md
@@ -25,6 +25,7 @@ The following integrations are currently supported by Automatisch.
- [HTTP Request](/apps/http-request/actions)
- [HubSpot](/apps/hubspot/actions)
- [Invoice Ninja](/apps/invoice-ninja/triggers)
+- [LibreTranslate](/apps/libretranslate/actions)
- [Mattermost](/apps/mattermost/actions)
- [Miro](/apps/miro/actions)
- [Notion](/apps/notion/triggers)