2023-01-27 03:22:44 -08:00
import type {
2023-02-27 19:39:43 -08:00
IDataObject ,
2023-03-09 09:13:15 -08:00
IExecuteFunctions ,
2020-10-22 02:36:42 -07:00
ILoadOptionsFunctions ,
INodeExecutionData ,
INodePropertyOptions ,
INodeType ,
INodeTypeDescription ,
} from 'n8n-workflow' ;
2022-08-17 08:50:24 -07:00
import { googleApiRequest } from './GenericFunctions' ;
2020-10-22 02:36:42 -07:00
export interface IGoogleAuthCredentials {
email : string ;
privateKey : string ;
}
export class GoogleTranslate implements INodeType {
description : INodeTypeDescription = {
displayName : 'Google Translate' ,
name : 'googleTranslate' ,
2022-06-20 07:54:01 -07:00
// eslint-disable-next-line n8n-nodes-base/node-class-description-icon-not-svg
2020-10-23 07:17:56 -07:00
icon : 'file:googletranslate.png' ,
2020-10-22 02:36:42 -07:00
group : [ 'input' , 'output' ] ,
2022-07-18 01:15:03 -07:00
version : [ 1 , 2 ] ,
2020-10-22 02:36:42 -07:00
description : 'Translate data using Google Translate' ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
defaults : {
name : 'Google Translate' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'googleApi' ,
required : true ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
authentication : [ 'serviceAccount' ] ,
2020-10-22 02:36:42 -07:00
} ,
} ,
} ,
{
name : 'googleTranslateOAuth2Api' ,
required : true ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
authentication : [ 'oAuth2' ] ,
2020-10-22 02:36:42 -07:00
} ,
} ,
} ,
] ,
properties : [
{
displayName : 'Authentication' ,
name : 'authentication' ,
type : 'options' ,
options : [
{
name : 'Service Account' ,
value : 'serviceAccount' ,
} ,
{
name : 'OAuth2' ,
value : 'oAuth2' ,
} ,
] ,
default : 'serviceAccount' ,
2022-07-18 01:15:03 -07:00
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
'@version' : [ 1 ] ,
2022-07-20 01:14:12 -07:00
} ,
2022-07-18 01:15:03 -07:00
} ,
} ,
{
displayName : 'Authentication' ,
name : 'authentication' ,
type : 'options' ,
options : [
{
2022-09-08 05:44:34 -07:00
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased
name : 'OAuth2 (recommended)' ,
2022-07-18 01:15:03 -07:00
value : 'oAuth2' ,
} ,
{
name : 'Service Account' ,
value : 'serviceAccount' ,
} ,
] ,
default : 'oAuth2' ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
'@version' : [ 2 ] ,
2022-07-20 01:14:12 -07:00
} ,
2022-07-18 01:15:03 -07:00
} ,
2020-10-22 02:36:42 -07:00
} ,
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-22 02:36:42 -07:00
options : [
{
name : 'Language' ,
value : 'language' ,
} ,
] ,
default : 'language' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2020-10-22 02:36:42 -07:00
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
resource : [ 'language' ] ,
2020-10-22 02:36:42 -07:00
} ,
} ,
options : [
{
name : 'Translate' ,
value : 'translate' ,
description : 'Translate data' ,
2022-07-10 13:50:51 -07:00
action : 'Translate a language' ,
2020-10-22 02:36:42 -07:00
} ,
] ,
default : 'translate' ,
} ,
// ----------------------------------
// All
// ----------------------------------
{
2020-10-22 02:37:12 -07:00
displayName : 'Text' ,
name : 'text' ,
2020-10-22 02:36:42 -07:00
type : 'string' ,
default : '' ,
description : 'The input text to translate' ,
required : true ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
operation : [ 'translate' ] ,
2020-10-22 02:36:42 -07:00
} ,
} ,
} ,
{
2022-06-03 10:23:49 -07:00
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-wrong-for-dynamic-options
2020-10-22 02:36:42 -07:00
displayName : 'Translate To' ,
name : 'translateTo' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getLanguages' ,
} ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
'The language to use for translation of the input text, set to one of the language codes listed in <a href="https://cloud.google.com/translate/docs/languages">Language Support</a>. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2020-10-22 02:36:42 -07:00
required : true ,
displayOptions : {
show : {
2022-08-17 08:50:24 -07:00
operation : [ 'translate' ] ,
2020-10-22 02:36:42 -07:00
} ,
} ,
} ,
] ,
} ;
methods = {
loadOptions : {
2022-08-17 08:50:24 -07:00
async getLanguages ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
2020-10-22 02:36:42 -07:00
const returnData : INodePropertyOptions [ ] = [ ] ;
2022-08-17 08:50:24 -07:00
const {
data : { languages } ,
} = await googleApiRequest . call ( this , 'GET' , '/language/translate/v2/languages' ) ;
2020-10-22 02:36:42 -07:00
for ( const language of languages ) {
returnData . push ( {
name : language.language.toUpperCase ( ) ,
2020-10-22 06:46:03 -07:00
value : language.language ,
2020-10-22 02:36:42 -07:00
} ) ;
}
return returnData ;
} ,
2020-10-22 06:46:03 -07:00
} ,
2020-10-22 02:36:42 -07:00
} ;
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
2022-04-22 09:29:51 -07:00
const length = items . length ;
2020-10-22 02:36:42 -07:00
2022-12-02 03:53:59 -08:00
const resource = this . getNodeParameter ( 'resource' , 0 ) ;
const operation = this . getNodeParameter ( 'operation' , 0 ) ;
2022-08-30 08:55:33 -07:00
const responseData : INodeExecutionData [ ] = [ ] ;
2020-10-22 02:36:42 -07:00
for ( let i = 0 ; i < length ; i ++ ) {
if ( resource === 'language' ) {
if ( operation === 'translate' ) {
2020-10-22 02:37:12 -07:00
const text = this . getNodeParameter ( 'text' , i ) as string ;
2020-10-22 02:36:42 -07:00
const translateTo = this . getNodeParameter ( 'translateTo' , i ) as string ;
2022-12-29 03:20:43 -08:00
const response = await googleApiRequest . call ( this , 'POST' , '/language/translate/v2' , {
2022-08-17 08:50:24 -07:00
q : text ,
target : translateTo ,
} ) ;
2022-08-30 08:55:33 -07:00
const [ translation ] = response . data . translations ;
const executionData = this . helpers . constructExecutionMetaData (
2023-02-27 19:39:43 -08:00
this . helpers . returnJsonArray ( translation as IDataObject ) ,
2022-08-30 08:55:33 -07:00
{ itemData : { item : i } } ,
) ;
responseData . push ( . . . executionData ) ;
2020-10-22 02:36:42 -07:00
}
}
}
2022-08-30 08:55:33 -07:00
return this . prepareOutputData ( responseData ) ;
2020-10-22 02:36:42 -07:00
}
}