DEV Community

Cover image for Use SharpAPI for Translating E-Commerce Product Info
Yoram Kornatzky
Yoram Kornatzky

Posted on

Use SharpAPI for Translating E-Commerce Product Info

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];
    }

}
Enter fullscreen mode Exit fullscreen mode

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;

        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)