In Auctibles, we use SharpAPI to translate product info.
Auctibles is built with the Laravel PHP framework.
The Service
We defined a service that will translate a text into a given language.
The service provides a translate
function that translates the text
parameter into the required language:
<?php namespace App\Services; use GuzzleHttp\Exception\ClientException; class SharpAPI { private $service; public function __construct() { } public function translate(string $text, string $to_language) { try { $statusUrl = \SharpApiService::translate($text, $to_language); } catch(ClientException $e) { $rsp = $e->getResponse(); return ['flag' => null]; } $result = \SharpApiService::fetchResults($statusUrl); $res = json_decode($result->getResultJson()); return ['flag' => true, 'content' => $res->content]; } }
The function returns an associative array, with:
-
bool flag
- signifying success or failure -
content
- translated content
The Job
Because calling SharpAPI takes time, we do this asynchronously in a job, once the user saves the product information.
The job takes an $obj
parameter, which is the product, and an array of $fields
to be translated. The job iterates over the fields and sends each one to the service for translation.
The object comes from an Eloquent model using Laravel-Translatable. So each field is a JSON array, mapping languages to the value for that language.
<?php namespace App\Jobs\AI; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeEncrypted; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use SharpAPI\SharpApiService\Enums\SharpApiLanguages; use App\Services\SharpAPI; class SharpAPITranslator implements ShouldQueue, ShouldBeEncrypted { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. */ public function __construct(private string $from_language, private $obj, private $fields) { } /** * Execute the job. */ public function handle(): void { // instantiate the service $sharp_api = new SharpAPI(); foreach($this->fields as $field) { foreach(array_keys(config('app.content_languages')) as $to_language) { if ($to_language != $this->from_language) { // get the content for the from_language $text = $obj->getTranslation($field, $fromlang, true) $result = $sharp_api->translate( $text, $this->sharp_api_language($to_language) ); if ($result['flag']) { // store the content for to_language $this->obj->setTranslation( $field, $to_language, $result['content'] ); } } } $this->obj->save(); } } private function sharp_api_language(string $locale): string { switch($locale) { case 'en': return SharpApiLanguages::ENGLISH; case 'pl': return SharpApiLanguages::POLISH; } } }
Top comments (0)