0

In laravel 9.47 / botman 2.7.8 / laravel-translatable 6.3 app I make some singleton class for working with translatable functionality when moving from one botman conversation to other with all locate functionality in class AppLocale.php.

When user opens page with botman wizard he needs to select language and next all conversation messages must be in this language. Method setCurrentLocale is used for this and it is called once.

It works, but the problem is that refering method getInstance of AppLocale(when I read data from database and I need text fields in selected language) at some poment I see that in method getInstance is called with null $instance and default english is set from getCurrentLocale method: I check it in logging messsages.

<?php

namespace App\Library;

use App;

class AppLocale
{
    private static $instance;

    public static function setCurrentLocale(string $currentLocale, string $file, string $line)
    {
        app()->setLocale($currentLocale);
    }


    public static function getInstance(string $action, string $file, string $line)
    {
        \Log::info(varDump(self::$instance, ' -1 getInstances self::$instance::'));
        if (self::$instance === null) {
            \Log::info( ' CREATED AppLocale $action ::' . $action);
            \Log::info( ' CREATED AppLocale $file::' . $file);
            \Log::info( ' CREATED AppLocale $line::' . $line);
            \Log::info(' -1 new CREATED AppLocale::');

            self::$instance      = new AppLocale();
        }
        \Log::info(varDump(self::$instance, ' -1 AFTER getInstances self::$instance::'));

        return self::$instance;
    }

    public static function getCurrentLocale(string $action, string $file, string $line)
    {
        $currentLocale = app()->getLocale();
        \Log::info(varDump($currentLocale, ' -1 getCurrentLocale $currentLocale::'));
        if(empty($currentLocale)) {
            \Log::info( ' SETTING $action getCurrentLocale::' . $action);
            \Log::info( ' SETTING $file::' . $file);
            \Log::info( ' SETTING $line::' . $line);
            return self::APP_LOCALE_ENGLISH;
        }
        return $currentLocale;
    }

I call getCurrentLocale from Repository Service :

<?php

namespace App\Library\Services;

    use App\Library\AppLocale;

class DbRepository
{

    public static function getQuizCategory(int $quizCategoryId): array
    {
        $quizCategory = QuizCategory::findOrFail($quizCategoryId);
        $quizCategoryArray =  $quizCategory->toArray();
        \Log::info(varDump($quizCategoryArray, ' -1 getQuizCategory $quizCategoryArray::'));
        $quizCategoryArray['locale_name'] = $quizCategory->getTranslation('name', AppLocale::getInstance('getQuizCategory', __FILE__, __LINE__)->getCurrentLocale('getQuizCategory', __FILE__, __LINE__));
        \Log::info(varDump($quizCategoryArray['locale_name'], ' -15 $quizCategoryArray[locale_name::'));
        return $quizCategoryArray;
    }

    public static function getQuizzesByQuizCategoryIds(array $quizCategoryIds, bool $active = null): array
    {
        $quizzes = Quiz::getByActive($active)
            ->getByQuizCategoryId($quizCategoryIds)
            ->get()
            ->map(function ($quizItem) {
                $quizItem->locale_question = $quizItem->getTranslation('question', AppLocale::getInstance('getQuizzesByQuizCategoryIds', __FILE__, __LINE__)->getCurrentLocale('getQuizzesByQuizCategoryIds', __FILE__, __LINE__));
                return $quizItem;
            });
        \Log::info(varDump($quizzes, ' -1 getQuizzesByQuizCategoryIds $quizzes::'));
        return $quizzes->toArray();
    }


    public static function getQuizAnswersByQuizId($quizId): array {
        $quizAnswers = QuizAnswer::getByQuizId($quizId)
            ->get()
            ->map(function ($quizAnswerItem) {
                $quizAnswerItem->locale_text = $quizAnswerItem->getTranslation('text', AppLocale::getInstance('getItem', __FILE__, __LINE__)->getCurrentLocale('getQuizAnswersByQuizId', __FILE__, __LINE__));
                return $quizAnswerItem;
            });
        return $quizAnswers->toArray();
    }

    public static function getQuizAnswer(int $quizAnswerId): array
    {
        $quizAnswer = QuizAnswer::findOrFail($quizAnswerId);
        $quizAnswer->locale_text = $quizAnswer->getTranslation('text', AppLocale::getInstance('getQuizAnswer', __FILE__, __LINE__)->getCurrentLocale('getQuizAnswer', __FILE__, __LINE__));
        return $quizAnswer->toArray();
    }

Cheching logs I see that current language is lost after method getQuizAnswer calling (self::$instance is null) and do not see why?

Any ideas what is wrong at my side and how that can be fixed?

All quizz wizards within 1 conversation.

Thanks!

mstdmstd
  • 2,195
  • 17
  • 63
  • 140

0 Answers0