alisalehi1380 / laravel-lang-files-translator

Easiest way to translate lang files to another language in PHP format in Laravel.
MIT License
32 stars 5 forks source link

fix again: translation keywords #6

Closed am-mokhtari closed 2 months ago

am-mokhtari commented 2 months ago

Hi Again 😁

سلام مهندس @alisalehi1380 ، لطف دارید، من تا مهندس شدن راه زیاد دارم... از توجهتون ممنونم. ✨ من نمیخواستم توی کدهاتون خیلی دست ببرم و برای همین فقط بخش مد نظر رو تغییر دادم. ولی اینطور که شما گفتید بهتره. 🚀 با drop کامیت ها مشکل داشتم، چون بعد از حذف میگفت از repo عقب تری و عجله کردم برنچ رو پاک کردم...
برم سر اصل مطلب

تنها بخشی که یه مقدار مورد بحث هست به نظرم کد:

if (str_contains($value, ':'))

هستش که دلیلشو بگم چرا نوشتم و بعد شما راهنماییم کنید.

فکر میکنم که تابع preg_replace کل حروف رشته رو مورد برسی قرار میده تا رشته هایی که مطابق با regex هستند رو پیدا کنه. توی فایل هایی که باید ترجمه بشن پیام های زیادی هستند که شامل کلمه ی کلیدی نیستند، و اگر ما همه رو مستقیما به preg_replace بدیم ، پیام های زیادی بدون اینکه شامل کلمه کلیدی باشن تمام کاراکترهاشون مورد برسی قرار میگیرن. هرچند که str_contains هم رشته رو پیمایش میکنه ولی تا زمانی که اولین : رو پیدا کنه و پیچیدگی کمتری داره و برسی regex پیچیده تر از برسی برابری کاراکترهاست.

اینجا شاید بهتر گفته باشه:

In general, it tends to be slower and more resource-intensive than str_contains because it involves compiling and executing a regular expression engine, which can lead to higher time complexity, often O(nm) or worse, where n is the length of the string and m is the length of the pattern
source
more...

البته اینکه برای متن بالا تابع preg_match رو برسی کردم بخاطر اینه که preg_replace ابتدا عملیاتی مشابه preg_match انجام میده و فقط بعد از این که پیدا شدند میاد و match ها رو عوض میکنه.

بخاطر این موضوع به نظرم برسی وجود اینکه اصلا کلمه ای هست و بعد اقدام به استخراج کردن بهتر اومد ولی سر و ته قضیه چیزی نمیشه و خب هرطور شما صلاح بدونید. هرموقع نظرتونو بفرماید من اطاعت میکنم و کامیت میکنم. 🎈

alisalehi1380 commented 2 months ago

با سلام و وقت بخیر نفرمایید. عزیزین.❤️

کلا سعی کن روی گیت خیلی مسلط بشی چون توی پکیج های مهم اینطور نیست که اون PR رو ببندی و یکی دیگه ایجاد کنی! image اگه از phpstorm استفاده میکنی اینجاست.

یه راه دیگه: اگه دیگه خیلی تلاش کردی و نشد میتونه یه بار دیگه پروژه رو Pull کنی. یه برنچ هم نام برنچی که باهاش PR زدی ایجاد کنی. تغییراتتو با git push -f به صورت force پوش کنی رو ریپویی که فورک کردی. بعد خواهی دید که تغییراتت میشینه روی PR ت. 😎

در خصوص اون str_contains هم بستگی داره! شما این طور در نظر گرفتی که تعداد جملاتی که props میگیره کمتر از جملاتی هست که props نمیگیره! آیا تضمینی وجود داره که برای همه این طور باشه؟🤔

این رو هم در نظر بگیر که درسته که شما برای جملاتی که props ندارن یک بار str_contains رو اجرا میکنی و تمام. ولی در واقع برای جملاتی که props دارن داری 2 تا تابع رو اجرا میکنی! هم str_contains و هم preg_replace_callback م😃

بزار دلیلی هم من ننوشتم رو بهت بگم. یکی از اصلی ترین دلیل هاش این هست که اون if باعث میشه کد یه indent بخوره و بره داخل تر! و همین یعنی کاهش پرفورمنس! (من این پکیج رو خیلی وقت پیش نوشتم. اگر الان بخوام بنویسم اصلی به این شکل و شمایل نمینوسم و تو یه فایل همشو اوکی میکنم. اونم با 4-5 تا تابع و تمام.)

با این حالت اوکیه ام.

$modifiedValue = str_contains($value, ':')
                ? preg_replace_callback(
                    '/(:\w+)/',
                    fn($match) => '{' . $match[0] . '}'
                )
                : $value;

در کل هم ببخشید اگه دیر جواب میدم. چون همونطور که خودت هم میدونی اپن سورس درامدی نداره. از این رو در تایم خالی روش وقت میزارم. بازم ببخشید اگه خیلی دیر به دیر جواب میدم.🙏

am-mokhtari commented 2 months ago

سلام ممنون. دقیقا مشکلم برای drop کردن سر force بود که نمیدونستم و بعد که دیلیت کردم فهمیدم که من پوش معمولی رو میزدم و این مورد باید فورس باشه. با توجه به کدی که توی پیام قبلی پیشنهاد دادید حدس زدم که خیلی وقت پیش کدهاشو نوشته باشید چون سبکش فرق داشت. (نمیدونم بر چه اساس اینجوری فکر کردم.) دقیقا نمیدونم props چه مفهومی داره پس به زبون خودم بگم 😅 (لطف کنید یادم بدید ممنون میشم). به نظرم توی حالت فعلی لاراول مواردی که توی شرط ما صدق نمیکنن تقریبا تعداد برابری با مواردی که صدق میکنن دارن برای همین تعدادشون جوری نبود که بگم بیخیالشون شیم، و این که برای جملات قابل قبول هم دوتا تابع اجرا میشه رو میدونستم ولی اینطور حساب کردم که فرض کنیم برای همه ی جملات تابعی پرهزینه تر اجرا بشه بهتره یا برای نصف جملات تابع پرهزینه و کم هزینه و نصف دیگه کم هزینه؟ به نظرم اومد مورد دوم اصولی تر باشه ولی نمیدونم... الان کد پیشنهادی شما ظاهرش بهتره... همین رو اعمال میکنم. معمولا اول هرموضوعی سخت فکر میکنم ولی بعدا متوجهش میشم 😅 شاید تاثیر دانشگاهه 😂 درمورد اینکه دیر جواب میدید اصلا اشکالی نداره. من چون این پکیج خیلی کارایی داره و دوست نداشتم این عیب رو داشته باشه مخصوصا که 23 تا ستاره داره و دلم میخواد با خیال راحت زحمت ترجمه رو بهش بسپریم نه که هربار بگم یادم باشه ویژگی: ها رو ادیت کنم. درمورد کد، الان ادیت میکنم و احتمالا وقتی پیامم رو دیدید میتونید مرج کنید. خداروشکر کار تکمیله 🚀 فقط این مورد رو نمیدونم که بعدش ریپو فورک شده رو دیلیت کنم یا نه...

am-mokhtari commented 2 months ago

Congratulation @alisalehi1380 🌟 Done. 🚀

دوس ندارم کشش بدم ولی بگم که الان که if رو مثل کد پیشنهادی شما نوشتم str_replace هم به برای همه ی پیام ها انجام میشه. به نظرم مهم نیست. مرج کنید

alisalehi1380 commented 2 months ago

اره من دیشب حواسم به اون نبود. این اوکیه.

فقط حواست باشه که باید فقط قسمتی از کد رو که میخوای تغییر بدی، تغییر بدی. نه کل سورس کد رو! الان توی اون لاین های بین توابع، فاصله ها رو حذف کردی. ولی در کل اوکیه. دقیقا همین کد رو بزار جای اون تابع.

private function translateRecursive($content, $google): array
{
    $trans_data = [];

    foreach ($content as $key => $value) {
        if (is_array($value)) {
            $trans_data[$key] = $this->translateRecursive($value, $google);
            continue;
        }

        $hasProps = str_contains($value, ':');
        $modifiedValue = $hasProps
            ? preg_replace_callback(
                '/(:\w+)/',
                fn($match) => '{' . $match[0] . '}',
                $value
            )
            : $value;

        $translatedValue = $google->translate($modifiedValue);

        $trans_data[$key] = $hasProps
            ? str_replace(['{', '}'], '', $translatedValue)
            : $translatedValue;
    }

    return $trans_data;
}
alisalehi1380 commented 2 months ago

https://vuejs.org/guide/components/props.html https://laravel.com/docs/11.x/blade#slot-attributes

م props در Vue به این معنا ست که کامپوننتی برای اجرای صحیح ش نیاز به یک سری دیتا داره. اگر میخوای از اون استفاده کنی باید حتما اون دیتا رو بهش پاس بدی. بعدا لاراول هم از این فیچر الهام گرفت و در template engin Blade اون رو آورد. در لاراول slot => میشه دیتایی که از فرزنده به والد منتقل میشه. props => دیتایی که از والد به فرزند منتقل میشه.

و به طور کلی وقتی یه دیتایی رو برای کارکرد صحیح یک قسمت به سمت ش ارسال میکنی، ( مثل همین جا attribute: ) مرسومه میگن props.


فقط این مورد رو نمیدونم که بعدش ریپو فورک شده رو دیلیت کنم یا نه...

وقتی ریپو یی رو fork کردی اون ریپو دیگه برای خودت هست. هر کاری میتونی بکنی توش.

am-mokhtari commented 2 months ago

ممنون بابت توضیحات 🙌 الان کد رو هم اوکیش میکنم

am-mokhtari commented 2 months ago

انجام شد. 🚀 ممنون بابت همه چی ♥ خوش حال شدم ازین همکاری و تبادل نظر ✨

alisalehi1380 commented 2 months ago

عزیزین. منم همین طور. ❤️

انشالله که تو پروژه های بزرگ تر سعادت همکاری با شما رو داشته باشیم. ✌️

am-mokhtari commented 2 months ago

ان‌شاءالله ✨