Use SharpAPI for Translating E-Commerce Product Info

Yoram Kornatzky
2 min readMay 14, 2024

--

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;

}
}
}

--

--

Yoram Kornatzky

Entrepreneur, Auctibles: https://auctibles.com, 25 years of development experience, Ph.D. Computer Science, https://yoramkornatzky.com