محمد میرزاخانی
2 سال پیش توسط محمد میرزاخانی مطرح شد
20 پاسخ

مشکل در ساختار شرطی

سلام دوستان وققتون بخیر باشه
من میخام ی دکمه بزارم توی سایتم که کاربر با کلیک روی اون بتونه زبانه سایتا تغییر بده اما مشکلم در اجرا نشدن ساختار شرطیه که نوشتم
این متد

public function updatelang()

    {
        if($lang = App::getlocale())
        {
            switch($lang)
            {
                case 'fa';
                    App::setlocale('en');
                    $lang = App::getlocale();
                break;
                case 'en';
                    App::setlocale('fa');
                    $lang = App::getlocale();
                break;
            }
        }
        return redirect()->back()->with('lang', $lang);
    }

این ویو

session('lang')
            session('lang'=='fa')
                <li><a href="{{ route('updatelang') }}" class="btn btn-danger">فارسی</a></li>
            @else
                <li>1 <a href="{{ route('updatelang') }}" class="btn btn-info"> English </a></li>
            @endif
        @else
            <li> 2<a href="{{ route('updatelang') }}" class="btn btn-info"> English </a></li>
        @endif

ببینید دفعه اولی که وارد سایت میشه پیشفرض زبان انگلیسی هست اما بعد از کلیک روی دکمه فارسی میشه اما وقتی بازم کلیک میکنم دیگه انگلیسی نمیشه در واقع با اینکه مقدار متغیر lang برابر fa هست اما برنامه وارد قسمت 'case 'fa نمیشه
ممنون میشم راهنمایی کنید..


ثبت پرسش جدید
احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

خب پس حدس بنده درست بوده ، مشکل از SetLocal هستش
احتمالا وقتی یکبار یه چیزی Set میشه نمیاد روی اون دوباره تغییری ایجاد بکنه و دوباره داره مقدار جدیدی رو Set میکنه برای همین هرچی ما Set میکنیم و حالا میخوایم بگیریمش در اصل میاد مقدار اولی که ست شده رو میخونه.
بهترین کار چیه ؟ استفاده از کوکی ، معمولا تنظیمات زبان رو در کوکی ست میکنن ، شما فرض کن این سایت رو 1000 نفر همزمان میخوان استفاده بکنن ، خب 1000 تا سشن ست بشه ؟؟ میدونید چقدر رم میگیره از سرور و سرور رو کند میکنه ؟؟ شما باید از کوکی ها استفاده بکنید. باید یک کوکی در مرورگر کاربر ذخیره بکنید و اون رو هربار چک بکنید.


Mohammad
تخصص : 5656565
@Reza.7 2 سال پیش مطرح شد
0

درود بر شما
$lang رو خارج از بلاک شرطی تعریف کنید

public function updatelang() 
    {
$lang = App::getlocale()
        if($lang)
        {
            switch($lang)
            {
                case 'fa';
                    App::setlocale('en');
                    $lang = App::getlocale();
                break;
                case 'en';
                    App::setlocale('fa');
                    $lang = App::getlocale();
                break;
            }
        }
        return redirect()->back()->with('lang', $lang);
    }

محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@Reza.7
فرقی نکرد دوباره از اول که وارد سایت میشی انگلیسیه چون سشنی وجود نداره بعد از کلیک فارسی میشه اما دیگه هرچی کلیک کنم تغییری نمیکنه یا همون وارد قسمت case 'fa'; نمیشه


Mohammad
تخصص : 5656565
@Reza.7 2 سال پیش مطرح شد
0

این قسمت ها dd بگیرید اصلا اجرا میشن؟

 case 'fa';
dd('fa');
                    App::setlocale('en');
                    $lang = App::getlocale();
                break;
                case 'en';
dd('en');
                    App::setlocale('fa');
                    $lang = App::getlocale();
                break;

محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@Reza.7
dd گرفتم قسمت en اجرا میشه اما fa نه واردش نمیشه که بخاد dd کنه..بازم اول موقع ورود سشن که وجود نداره وارد en میشه و اونا dd میکنه اما بعد از اینکه dd اون قسمتا برمیدارم هر چقدر کلیک میکنم وارد fa دیگه نمیشه که بخادdd کنه..


Mohammad
تخصص : 5656565
@Reza.7 2 سال پیش مطرح شد
0

خب شرط if رو بردارید و حالا ببینید dd اجرا میشه؟

public function updatelang() 
    {
$lang = App::getlocale()

            switch($lang)
            {
                case 'fa';
dd('fa');
                    App::setlocale('en');
                    $lang = App::getlocale();
                break;
                case 'en';
dd('en');
                    App::setlocale('fa');
                    $lang = App::getlocale();
                break;
            }

        return redirect()->back()->with('lang', $lang);
    }

محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@Reza.7
ممنون ولی نه فرقی نکرد


رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 2 سال پیش مطرح شد
0

سلام.
کدتونو به صورت زیر بنویسید.

public function updatelang() {
    $lang = App::getlocale()
    if($lang) {
        switch($lang) {
            case 'fa';
            $en = App::setlocale('en');
            $lang = $en;
            break;
            case 'en';
            $fa = App::setlocale('fa');
            $lang = $fa;
            break;
         }
    }
    return redirect()->back()->with('lang', $lang);
}

احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

با سلام خدمت شما اولا اینکه حتما بررسی کنید که آیا بعد از اینکه روی دکمه فارسی میزنید اصلا مقدار 'fa' ثبت میشه ؟؟ شاید فقط شما میتونید یکبار یه چیزی رو توی AppLocal ثبت کنید. و شاید مشکل از اون باشه پس چیکار کنید؟ اولا که بهتره کدتون رو اینطوری بنویسید.

public function updatelang() {
    $lang = App::getlocale();
    if($lang) {
        switch($lang) {
            case 'fa':
                App::setlocale('en');
                $lang = 'en';
                break;
            case 'en':
                App::setlocale('fa');
                $lang = 'fa';
                break;
         }
    }
    return redirect()->back()->with('lang', $lang);
}

حالا شما باید 2 جا dd بزارید یکی قبل از اینکه switch case خونده بشه و یکی بد از اینکه switch case خونده شد. یعنی :

public function updatelang() {
    $lang = App::getlocale();
    dd($lang)
    if($lang) {
        switch($lang) {
            case 'fa':
                App::setlocale('en');
                $lang = 'en';
                break;
            case 'en':
                App::setlocale('fa');
                $lang = 'fa';
                break;
         }
    }
    dd(App::getlocale())
    return redirect()->back()->with('lang', $lang);
}

خب یکبار که شما دفه اول یک مقادر پیفرض ثبت میکنید ، یکبار هم وقتی کاربر کلیک میکنه ، دفه دوم رو باید قشنگ با dd ها بررسی کنید ببینید چه مقداری نمایش داده میشه. اگر مقادیر فرق بکنه و درست ثبت شده یعنی سوتی یه جای دیگست. اما اگر مقدار ها تغییر نکنه میفهمیم که احتمالا مشکل از SetLocal هستش.


محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@ehsndvr
ممنون ببینید دوست عزیز موقع dd اولی که گفتید مقدار en را نشون میده که پیشفرض خوده سیستم هستش و بعد تویdd دومی مقدار fa را نشون میده پس یعنی تغییر میکنه..همون موقع هم تغییر میکرد اما مشکل چه الان و چه اونموقع اینه که وقتی از en به fa تبدیل میشه دیگه تغییر نمیکنه و از fa به en تغییر پیدا نمیکنه و روی همون fa دیگه میمونه.


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

آقا اصلا شما چرا انقدر کدتون رو سخت نوشتید
کاربر هرموقع این تابع رو صدا بزنه یعنی میخواد از فارسی به انگلیسی و از انگلیسی به فارسی بره پس بهتره بنویسید:

$lang = App::getlocale() == "en" ? App::setlocale("fa") : App::setlocale("en");
$lang = App::getlocale();
return redirect()->back()->with('lang', $lang);

لطفا این کد رو تست کنید.


محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@ehsndvr
ممنون از وقتی که میزاری
اما مثه قبله با کلیک از انگلیسی میشه فارسی اما دیگه تغییر نمیکنه نمیدونم کجای کارم اشتباهه
🤔🤦


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

@mirzamohammad.com قربون شما، خواهش میکنم
شما لطف کنید 2 تا عکس برای بنده بزارید از مقدار dd :

$lang = App::getlocale() == "en" ? App::setlocale("fa") : App::setlocale("en");
$lang = App::getlocale();
dd($lang)
return redirect()->back()->with('lang', $lang);

یکی بعد از اینکه فارسی رو انتخاب میکنید و یکی بعد از اینکه انگلیسی رو انتخاب میکنید و همون فارسی میمونه.


محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@ehsndvr
ی توضیحی بهتون بدم من اومدم روی config بصورت دستی زبانا fa کردم و واسه ی حالت انگلیسی دوتا حالت مختلف گذاشتم یکی انگلیسی 1 که همون موقع که کاربر وارد سایت میشه بهش نشون میده زمانی که روی دکمه کلیک نکرده تا سشنی وجود داشته باشه و بعد از کلیک حالت انگلیسی ۲ میشه زمانی که کاربر روی دکمه کلیک میکنه حالا اینجا چون توی config اول fa بوده تغییر میکنه و حالت انگلیسی ۲ بوجود میاد اما دیگه فارسی نمیشه یعنی دقیقا مثله قبل فقط ی بار تبدیل میشه اونم اینبار از fa به en .. اگه متوجه نشدید تا از اینم عکس بدم


محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@ehsndvr
با این کدی که گفتید

$lang = App::getlocale() == "en" ? App::setlocale("fa") : App::setlocale("en");
        $lang = App::getlocale();
        dd($lang);
        return redirect()->back()->with('lang', $lang);

عکسش میشه این
توضیح تصویر رو وارد کنید


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

این عکس که گذاشتید در حالت آخره درسته ؟ @mirzamohammad.com


محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

من طبق صحبت شما اینکارا کردم اگه اشتباهه بگید اول کده شما را نوشتم و بعد اومدم روی دکمه انگلیسی زدم که فارسی شه که خروجی همین بود و یکی دیگه اومدم dd را حذف کردم و امتحان کردم تا سایت فارسی شه و بعد dd را اضافه کردم و روی دکمه زدم تا انگلیسی بشه و خروجی بازم همونه


محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@ehsndvr
یادم رفت تگتون کنم


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

خب پس حدس بنده درست بوده ، مشکل از SetLocal هستش
احتمالا وقتی یکبار یه چیزی Set میشه نمیاد روی اون دوباره تغییری ایجاد بکنه و دوباره داره مقدار جدیدی رو Set میکنه برای همین هرچی ما Set میکنیم و حالا میخوایم بگیریمش در اصل میاد مقدار اولی که ست شده رو میخونه.
بهترین کار چیه ؟ استفاده از کوکی ، معمولا تنظیمات زبان رو در کوکی ست میکنن ، شما فرض کن این سایت رو 1000 نفر همزمان میخوان استفاده بکنن ، خب 1000 تا سشن ست بشه ؟؟ میدونید چقدر رم میگیره از سرور و سرور رو کند میکنه ؟؟ شما باید از کوکی ها استفاده بکنید. باید یک کوکی در مرورگر کاربر ذخیره بکنید و اون رو هربار چک بکنید.


محمد میرزاخانی
@mirzamohammad.com 2 سال پیش مطرح شد
0

@ehsndvr
اها خیلی ممنون از وقتی که گذاشتید
در مورد این مقدار رم مصرفی و اینا که گفتید اطلاعاتی ندارم در موردش مطالعه میکنم به خاطر همین ذهنم رفته بود سمت سشن
در کل ممنون


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

@mirzamohammad.com خواهش میکنم.
اما اگر میخواید براتون همین رو درست بکنم لطف کنید داخل تلگرام به بنده پیام بدین که با Any Desk بیام روی سیستمتون بررسی بکنم، چون اینطوری من باید همش به شما بگم و شما بزنید ، سخته !
آیدی تلگرام بنده : @ehsndvr


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام