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)