DeepL to usługa przekładu maszynowego, co w normalnych słowach można określić po prostu jako tłumacz, działająca w oparciu o sieci neuronowe. Co interesujące dyrektorem zarządzającym spółki stojącej za tym tłumaczem jest Polak – Jarosław Kutyłowski. Wydaje mi się, iż już od blisko 5 lat używam DeepL, a nie powszechnie znanego Google Translate, bo po prostu daje mi lepsze wyniki, a i przy okazji trzymam swoje dane nieco dalej od Google. Do normalnego użytku DeepL jest darmowy i dostępny z poziomu strony internetowej. Można także założyć konto i uzyskać dostęp do dwóch planów dostępowych poprzez API – Free i Pro. Nas oczywiście interesuje ten darmowy, który obarczony jest ograniczeniem 500 000 znaków na miesiąc. Do podstawowych zastosowań jednego użytkownika taki limit powinien być wystarczający.
Jak pozyskać swój klucz API
Skrócę to do niezbędnego minimum, żeby zbytnio nie rozwodzić się nad tak prostym procesem. Rozpoczynamy oczywiście od założenia konta – bezpośredni link do rejestracji. W panelu swojego konta przechodzimy do zakładki Konto, na samym dole w sekcji Klucz identyfikacyjny dla API DeepL jest podany token API, który będzie nam potrzebny w dalszej części tego wpisu. Jak już jesteśmy w tym miejscu to dla bardziej dociekliwych polecam także zapoznać się z dokumentacją dotyczącą API.
Komunikacja z API DeepL
Cała komunikacja z API DeepL wygląda bardzo podobnie do tej opisanej przeze mnie we wpisie MEWS Bot = Mastodon nEWS, w którym przy użyciu cURL komunikowaliśmy się z API Mastodona. Różnica w tym przypadku będzie taka, iż do Mastodona jedynie wysyłaliśmy dane, natomiast do DeepL dane wyślemy (będzie to tekst do przetłumaczenia), ale będziemy także oczekiwali odpowiedzi (tekstu przetłumaczonego). Cały kod standardowo opisałem krok po kroku poprzez umieszczenie w nim komentarzy. Treść skryptu jest dostępna pod koniec wpisu.
Zanim przejdziemy do skryptu chciałbym jednak omówić szerzej pewne jego fragmenty, aby nakreślić perspektywę. Jedną z najbardziej kluczowych rzeczy w komunikacji z API poprzez cURL są odpowiednio skonstruowane nagłówki (headers), które są swego rodzaju zapowiedzią żądania, które wyślemy do serwera. W przypadku API DeepL jedyna informacja, która musi być zawarta w nagłówku to prawidłowe dane do autoryzacji, tj. przedstawienie swojego klucza do API, na podstawie którego uzyskujemy prawo do komunikacji. Nagłówek ten powinien mieć następującą formę:
Authorization: DeepL-Auth-Key [TOKEN/KLUCZ API]
Drugim istotnym elementem zapytania cURL jest adres URL, do którego należy kierować zapytania. W przypadku DeepL jest to:
https://api-free.deepl.com/v2/translate
Trzeci element, bez którego zapytanie nie miałoby sensu, to dane adekwatne, a więc samo żądanie. Dane te najlepiej wysłać w postaci tablicy (array). Będziemy wysyłać w niej trzy rzeczy:
- ciąg (tekst) do przetłumaczenia,
- deklarację na jaki język życzymy sobie go przetłumaczyć,
- deklarację w jakim języku napisany jest ów tekst, który podaliśmy w punkcie pierwszym.
Ten ostatni punkt nie jest konieczny, gdyż DeepL sam jest w stanie rozpoznać w jakim języku zaserwowaliśmy mu tekst do przetłumaczenia. Niemniej jednak z doświadczeń z używania wersji webowej DeepL wiem, iż algorytm rozpoznawania języka nie jest nieomylny, a więc zdecydowanie rekomenduję dla pewności jasno określić ten parametr.
OK, wysyłamy odpowiednio skonstruowane zapytanie cURL do API DeepL i co dalej? Otrzymujemy informacje zwrotne w postaci ciągu w formacie JSON (JavaScript Object Notation). Dekodujemy go przy użyciu funkcji json_decode(). Na marginesie, jako drugi argument przy wywołaniu tej funkcji podajemy wartość true, co informuje funkcję, aby nie tylko przekonwertować nam ciąg JSON na obiekt PHP, ale też aby ten obiekt przekonwertować na tablicę. W ten oto sposób otrzymujemy następujący wynik:
Array ( [translations] => Array ( [0] => Array ( [detected_source_language] => PL [text] => Sample text in Polish that we want to translate into English ) ) )Jak widać otrzymaliśmy zagnieżdżoną tablicę, a wynik, którego oczekujemy jest zapisany pod indeksem [translations][0][text]. I tym oto sposobem uzyskaliśmy dostęp do przetłumaczonego tekstu, którego oczekiwaliśmy.
Kod skryptu PHP
Tak jak pisałem wcześniej, poniżej znajduje się cały kod skryptu, o którym mowa w niniejszym wpisie. Jest on standardowo omówiony poprzez komentarze w treści.
<?php // Klucz skopiowany z profilu DeepL $token = "[Tu wpisz swój klucz API DeepL]"; // Przykładowy tekst, który będziemy tłumaczyć $tekstPL = "Przykładowy tekst w języku polskim, który chcemy przetłumaczyć na język angielski"; //Nagłówki $headers = [ "Authorization: DeepL-Auth-Key ".$token ]; //Dane adekwatne $data = array( "text" => $tekstPL, // Tekst do tłumaczenia "target_lang" => "EN", // Język docelowy "source_lang" => "PL" // Język źródłowy ); // Inicjalizuje zapytanie cURL $translate = curl_init(); // Określa URL do którego ma zostać skierowane zapytanie curl_setopt($translate, CURLOPT_URL, "https://api-free.deepl.com/v2/translate"); // Deklaruje, iż ma to być zapytanie typu POST curl_setopt($translate, CURLOPT_POST, 1); // Nakazuje cURL zwrócić wynik zapytania curl_setopt($translate, CURLOPT_RETURNTRANSFER, true); // Ustawia nagłówki curl_setopt($translate, CURLOPT_HTTPHEADER, $headers); // Definiuje dane do przekazania curl_setopt($translate, CURLOPT_POSTFIELDS, $data); // Wysyła zapytanie i zapisuje zdekodowany wynik do zmiennej $return = json_decode(curl_exec($translate), true); // Zamyka połączenie curl_close ($translate); //Wyciąga przetłumaczony tekst z odpowiedzi API $tekstENG = $return['translations'][0]['text']; // Wyświetlenie wyników echo "<b>Tak wygląda zdekodowana odpowiedź z API DeepL:</b><br>"; echo "<pre>"; print_r($return); echo "</pre>"; echo "<br><br><br>"; echo "<b>Tekst po polsku:</b><br>"; echo $tekstPL; echo "<br><br>"; echo "<b>Tekst po angielsku (przetłumaczony przez DeepL):</b><br>"; echo $tekstENG; ?>Wynik powyższego skryptu jest następujący:
BiLangPost
Ten wpis został napisany przy okazji wypuszczenia przeze mnie mojego kolejnego, małego projekciku jakim jest BiLangPost. Jest to narzędzie, które ułatwia pisanie dwujęzycznych postów w mediach społecznościowych, a zostało napisane z myślą konkretnie o Mastodonie. Kolejny projekt narzędzia, które pierwotnie robiłem dla siebie, ale w pewnym momencie doszedłem do wniosku, iż wystarczy zmienić/dodać jedynie kilka linijek i można udostępnić go szerszemu gronu. Przy okazji tego wpisu nie będę się więcej rozpisywał, bo pewnie zrobię całkowicie oddzielny wpis jedynie na temat BiLangPost.