Met de Google Translate API kunnen eenvoudig grote hoeveelheden tekst vertaald worden tussen vrijwel alle talen. Aan het gebruik van de Google Translate API zijn geen kosten verbonden voor de eerste 500.000 karakters per maand. Daarna kost het USD 20 per miljoen tekens (zie Pricing | Cloud Translation | Google Cloud).
Een vergelijkbaar geprijsd alternatief die bijzonder sterk is in Europese talen is DeepL. Ook DeepL kan vanuit Invantive SQL benaderd worden zoals beschreven in DeepL API aanroepen vanuit SQL of Power BI.
In dit artikel wordt uitgelegd hoe via Invantive SQL en afgeleide platformen zoals Azure Data Factory en Power BI het gebruik van de Google Translate API voor het automatisch vertalen mogelijk is. De gepresenteerde SQL statements werken met enige beperkingen ook met de gratis versies van SQL in het Invantive Query Tool.
De beschreven aanpak kan gebruikt worden om buiten de ruim 70 ondersteunde platformen relatief eenvoudige API’s aan te roepen als bron voor datareplicatie of verwerkingsprocessen.
Mogelijkheden Google Translate
De Google Translate API is een eenvoudige reeks van API’s om gegevens uit te wisselen met Google Translate. Denk hierbij aan:
- vertalen,
- taal bepalen van een tekst,
- talen opvragen.
De API’s zijn allen gelijkend qua structuur en mogelijkheden.
Voorbereidingen Google Translate API
Voor gebruik van de Google Translate API is een API-sleutel nodig. Die is online te verkrijgen binnen enkele minuten door de stappen te volgen op Setup | Cloud Translation | Google Cloud.
Voor grote volumes kan het nodig zijn om de API-dagquota te verhogen (zie 配额和限制 | Cloud Translation | Google Cloud).
Google Translate translate API
De API “translate” biedt de mogelijkheid om een of meerdere teksten te vertalen naar een andere taal. De invoer wordt aangeboden via POST zoals:
key=secret&source=en&target=de&q=how+to+write+a+text%3F
Door het voorgaand bericht op te sturen samen met content-type application/x-www-form-urlencoded
komt een resultaat terug zoals:
{
"data": {
"translations": [
{
"translatedText": "Wie schreibe ich einen Text?"
}
]
}
}
Het resultaat bevat de Duitse vertaling. Voor andere doeltalen is een aparte API-aanroep nodig.
SQL Google Translate API Aanroep
Vanuit Invantive SQL kan de Google Translate API aangeroepen worden met httpdownload@DataDictionary
. Het content type wordt als header doorgegeven en de rest als payload als volgt via een POST; het resultaat wordt met jsontable
omgezet naar een tabelvorm:
select jte.*
from httpdownload@datadictionary
( url => 'https://translation.googleapis.com/language/translate/v2'
, acceptMimeType => 'application/json'
, contentType => 'application/x-www-form-urlencoded'
, method => 'POST'
, diskCache => true
, diskCacheMaxAgeSec => 86400*2
, cacheKey => 'en' || '.' || 'de' || md5('how to write a text using the =-sign?')
, textPayload
=>
'key=secret'
|| '&source=' || 'en'
|| '&target=' || 'de'
|| '&format=text'
|| '&q=' || 'how to write a text using the =-sign?'
) htp
join jsontable
( 'data.translations[*]'
passing htp.contents_char
columns text varchar2 null path 'translatedText'
) jte
Het resultaat ziet er dan ongeveer zo uit:
In- en uitvoer met Tabellen
Soms is het wenselijk om een lijst van te vertalen teksten te verwerken en die weg te schrijven naar een tabel. Dergelijke output kan ook verwerkt worden door bijvoorbeeld Power Query of bijvoorbeeld door in Invantive Control for Excel een Excel tabel (TABELNAAM@InvantiveControl
) uit te lezen en de gevalideerde resultaten in een blok weer te retourneren in Excel.
Een voorbeeld hiervan is de volgende query die een lijst van teksten maakt, vertaalt en wegschrijft in naar een in-memory tabel output
:
create or replace table input@inmemorystorage
as
select 'en' source_lang
, 'de' lge_code
, 'This is text number ' || to_char(rge.value) source_text
from range(100)@datadictionary rge
create or replace table output@inmemorystorage
as
select inp.source_text
, jte.*
from input@inmemorystorage inp
join httpdownload@datadictionary
( url => 'https://translation.googleapis.com/language/translate/v2'
, acceptMimeType => 'application/json'
, contentType => 'application/x-www-form-urlencoded'
, method => 'POST'
, diskCache => true
, diskCacheMaxAgeSec => 86400*2
, cacheKey => inp.source_lang || '.' || inp.lge_code || md5(inp.source_text)
, textPayload
=>
'key=secrt'
|| '&source=' || inp.source_lang
|| '&target=' || inp.lge_code
|| '&format=text'
|| '&q=' || urlencode(inp.source_text)
) htp
join jsontable
( 'data.translations[*]'
passing htp.contents_char
columns text varchar2 null path 'translatedText'
) jte
select *
from output@inmemorystorage
Het verwerken duurt circa 250 ms per vertaling. Het resultaat ziet er als volgt uit: