ساخت سایت چند زبانه با php

  • آپدیت شده در تاریخ

اگر از cms وردپرس استفاده می کنید مطمینا افزونه های رایگان و تحاری زیادی را می توانید پیدا کنید که با کمترین زحمت سایت شما را چند زبانه کرده و در اختیاز شما قرار می دهد ولی اگر در حال طراحی سایت اختصاصی خود هستید و یا از cms های آماده استفاده نمی کتید و پروژه هایی که می نویسید و سایت هایی که طراحی می کنید مثل تیم نت برنامه نویسی نت پارادیس , ممطمینا نیاز خواهید داشت که این قابلیت چند زبانه را به صورت دستی و با برنامه نویسی به پروژه خودتان اضافه کنید .

برای ساخت سایت چند زبانه با php  تکنیک های مختلفی وجود دارد که به بررسی انها میپردازیم , به هرحال دقت کنید که ایجاد یک سایت چند زبانه صرفا ترجمه ی سایت به زبان های مختلف نیست بلکه واحدهای استفاده شده در سایت نیز باید به زبان مقصد تغییر فرمت داده شوند که این واحدها شامل واحد پول , فرمت زمان میشود.

روش هایی که در اینجا برای ایجاد سایت های چند زبانه شرح میدهیم به صورت زیر هستند :

  1. استفاده از آرایه ها
  2. استفاده از تابع gettext

در اینجا به توضیح موارد بالا در PHP میپردازیم :

استفاده از آرایه ها برای ایجاد سایت چند زبانه در PHP :

با استفاده از آرایه های انجمنی (associative) میتوان ترجمه ی سایت را انجام داد. بدین صورت که برای هر کلمه از زبان پایه (زبان پیش فرض سایت) ترجمه ی ان را در نظر میگیرم و ترجمه های مربوط به هر زبان را درون فایل جداگانه قرار میدهیم. به مثال زیر دقت کنید تا متوجه بشید:

ترجمه ی بالا برای حالتی است که سایت به زبان انگلیسی نمایش داده میشود حال به زبان دیگر ترجمه را انجام میدهیم:

ترجمه ی بالا برای حالتی است که سایت قرار است در حالت فارسی نمایش داده شود. حال برای استفاده از هر زبان کافیست که فایل ترجمه را به صفحه اضافه کنید و مورد استفاده قرار دهید:

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

استفاده از تابع gettext برای ایجاد سایت چند زبانه :

برای ایجاد ترجمه های مختلف میتوان از فایل های po و mo استفاده کرد. این همان کاری است که CMS های بزرگ از جمله وردپرس انجام میدهند. مراحل استفاده از این فایل ها را به صورت زیر شرح میدهیم :

  1. ایجاد دایرکتوری مناسب
  2. ایجاد فایل های ترجمه
  3. استفاده از فایل های ترجمه

برای استفاده از فایل های po یا mo ابتدا باید یک مسیر به صورت تصویر زیر ایجاد کنید :

ساخت سایت چند زبانه با php

در اینجا قصد داریم سایتی به دو زبان انگلیسی و فارسی بسازیم. حالا نیاز داریم که فایل های po و mo را ایجاد کنیم. برای ایجاد این فایل ها نیاز به نرم افزار poEdit دارید که میتونید اون رو از اینجا دانلود و نصب کنید.

ساخت سایت چند زبانه با php

بعد از دانلود و نصب این نرم افزار آن را باز کنید و از منوی فایل گزینه ی new را بزنید سپس زبان مورد نظر خود را بر روی english(united states) قرار دهید و ok را بزنید. سپس از نوار بالایی گزینه ی save را بزنید (یا کلید های cntrl + s را از روی صفحه کلید بزنید) و محل قرار گیری فایل را درون پوشه ی en_us/LC_MESSAGES که در مرحله ی قبل ایجاد کردید مشخص کنید. فایل های ایجاد شده به صورت زیر خواهند بود:

ساخت سایت چند زبانه با php

حالا فایلی که پسوند ان po است را با یک ویرایشگر (مثلا نت پد) باز کنید , کدهای این فایل به صورت زیر خواهند بود :

ساخت سایت چند زبانه با php

در فایل ایجاد شده دقت کنید که قسمت language باید به صورت چیزی که در عکس میبینید باشد اگر بدین صورت نیست ان را ویرایش کنید و به حالت en_US قرار دهید. حال به صورت تصویر زیر ترجمه های خودمون رو به این فایل اضافه میکنیم:

ساخت سایت چند زبانه با php

در تصویر بالا به دو خط انتهایی که به کدها اظافه کردیم دقت کنید قسمت msgid یک کلمه را مشخص میکند و قسمت msgstr ترجمه ی ان کلمه را مشخص میکند. میتوانید کلمات یا جملاتی قرار بدید و ترجمه ی انها را نیز مشخص کنید. توجه کنید که به ازای هر msgid در خط زیرین ان باید یک msgstr به عنوان ترجمه قرار بگیرد. حال فایل را ذخیره کنید سپس روی فایل دوتا کلیک کنید تا توسط poEdit باز بشه و دکمه ی save را بزنید تا فایل mo نیز تغییر پیدا کند.  الان ترجمه ی انگلیسی شما اماده است. همین کار رو میتونید انجام بدید و زبان رو روی persian (iran) قرار بدید همچنین ترجمه رو در قسمت msgstr برابر با “سلام” قرار بدید.

حالا کدهای زیر رو درون فایل index.php در بیرون از پوشه ی locale قرار بدید و ذخیره کنید:

حالا فایل index.php رو اجرا کنید تا نتیجه ی ترجمه رو ببینید   کاربرانی که از ویندوز استفاده میکنن مکنه ترجمه ی فارسی رو نبینن و خود کلمه ی hello رو ببینن این به خاطر سیستم عامل ویندوز است که از فارسی ساپورت نمیکند اما اگه روی لینوکس تست کنید مشکلی نداره , ترجمه رو روی en_US قرار بدید سپس وب سرور خودتون رو restart کنید و سپس فایل index.php رو اجرا کنید تا ترجمه ی انگلیسی رو ببینید. (این ترجمه رو همه ی سیستم عامل ها میبینن).

اگر متوجه شده باشید می بینید که روش دوم  برای ساخت سایت چند زبانه با php حرفه ای تر و بهتر از روش اول است که باعث حفظ نطم کد های php و ساختار استاندارد زبان ها مختلف سایت است که cms های معروفی مثل وردپرس و پلاگین های معروفش به این روش کار می کنند و پیشنهاد میشود به این صورت عمل کنید

اگه میخواید ترجمه های شما در تمامی سیستم عامل ها پشتیبانی بشه میتونید از کتابخانه ی gettext (کلیک کنید) استفاده کنید که قابلیت های بیشتری در اختیار شما قرار میده. سورس کد نمونه مثال های این اموزش به همراه poEdit رو میتونید از انتهای همین مقاله آموزشی دانلود و استفاده کنید.

دانلود نرم افزار Poedit از نت پارادیس

برای دانلود فایل های پروژه استفاده شده در این آموزش از قسمت زیر اقدام کنید

هرگونه سوال و یا مشکلی درباره پیاده سازی و ساخت سایت چند زبانه با php داشتید از قسمت نظرات ارسال کنید در کمترین زمان ممکن جواب سوال خود را خواهی گرفت

موفق و پیروز باشید

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۲۰)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. محمد ۲۵ مرداد ۱۳۹۹

    چطور میتونم از این کتابخوانه استفاده کتم؟

    پاسخ
    1. حسن شفیعی ۲۵ مرداد ۱۳۹۹

      از اینجا کتابخانه را مستقیما دانلود و استفاده کنید
      https://github.com/php-gettext/Gettext
      یا اینکه اگر کامپوزر دارید مستقیما با دستور composer require gettext/gettext نصب کنید :
      https://netparadis.com/what-composer-in-php/

      پاسخ
      1. محمد ۲۶ مرداد ۱۳۹۹

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

        پاسخ
      2. حسن شفیعی ۲۶ مرداد ۱۳۹۹

        تو صفحه اصلی https://github.com/php-gettext/Gettext کامل تمام موارد رو با مثال و ساده نشون داده که میتونید از کد سمپل استفاده کنید.

        پاسخ
      3. محمد ۲۶ مرداد ۱۳۹۹

        با تشکر

        پاسخ
      4. آرش کاظمی ۱۳ آذر ۱۳۹۹

        با سلام ببخشید میشه دقیقا بگید الان برای رفع مشکل gettext با فارسی داخل ویندوز چیکار باید کرد؟
        خداوکیلی نگید از کتابخانه استفاده کن اصلا داکیمونشن نداره فقط کد نوشته. گذاشتن اسم فایل ها و مثال از کد که داکیومنشن نمیشه آخه. شما لطف کن فقط یه توضیح بده

        پاسخ
      5. حسن شفیعی ۱۴ آذر ۱۳۹۹

        سلام. به اینصورت استفاده کنید:
        ابتدا باید این تابع تعریف بشه:

        function Utf8Encode( $text )
        {
        if ( mb_check_encoding($text, “utf8”) == TRUE ){
        return $text;

        return utf8_encode($text);
        }

        و بعد به این طریق از gettext استفاده کنید تا مشکل فارسی حل بشه :

        $translation = gettext($singular);
        $encoded = Utf8Encode($translation);

        امیدوارم متوجه شده باشید که به چه صورت استفاده شد.
        ما یک تابع برای اینکد کردن رشته تعریف کردیم و بعد خروجی gettext را به تابع اینکد دادیم و داخل متغییر $encoded ذخیره شد.

        موفق باشید.

        پاسخ
      6. آرش کاظمی ۱۴ آذر ۱۳۹۹

        خیلی ممنون از پاسختون ولی کمکی نکرد. بنده از کتابخانه استفاده کردم و درست شد ولی مشکل اصلی این است که بنده برای performance بهتر میخواستم از این روش استفاده کنم. به صورت عادی از لحاظ رم کمتر خیلی بهتر از روش های دیگه است ولی متاسفانه وقتی از کتابخانه استفاده میکنم چندین برابر بیشتر از استفاده از آرایه یا ثابت ها از رم استفاده میکند و اصلا بهره وری خوبی نداشت. ولی روی سرور لینوکس مشکلی ندارد. خیلی ممنون که وقت گذاشتید.
        نتایج تست به شرح زیر شد اگر دوستان خواستن استفاده کنن و امیدوارم که درست تست کرده باشم و نتایج درست باشد:
        —————————————
        Array:
        زمان اجرا: ۰٫۰۰۰۶۴۶۱۱۴۳۴۹۳۶۵۲۳
        رم: ۲۴,۵۰۴ bytes
        ————————————
        Define:
        زمان اجرا: ۰٫۰۰۱۶۳۹۱۲۷۷۳۱۳۲۳۲
        رم: ۱۰,۹۶۰ bytes
        ———————————–
        gettext بدون کتابخانه:
        زمان اجرا: ۰٫۰۰۰۲۷۴۸۹۶۶۲۱۷۰۴۱
        رم: ۴۱۶ bytes
        ———————————-
        gettext با کتابخانه (PHP-gettext 1.0 (https://launchpad.net/php-gettext):
        زمان اجرا: ۰٫۰۱۲۶۴۲۱۴۵۱۵۶۸۶
        رم: ۱۰۶,۹۷۶ bytes

        پاسخ
  2. محمد ۲۵ مرداد ۱۳۹۹

    سلام ببخشید در مورد مشکل ویندوز با فارسی به جز کتابخوانه gettext چه کار میشه کرد؟

    پاسخ
    1. حسن شفیعی ۲۵ مرداد ۱۳۹۹

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

      پاسخ
  3. bhr ۴ شهریور ۱۳۹۸

    سلام
    وقت بخیر
    ممنون از آموزش مفیدتون
    مشکلی که من با این مثال دارم این هست که وقتی زبان رو روی انگلیسی قرار میدم باز همون سلام به فارسی رو خروجی میده. وب سرور هم ریستارت کردم
    راهنمایی می فرمایید؟

    پاسخ
    1. حسن شفیعی ۴ شهریور ۱۳۹۸

      سلام ممنون. خوشحالیم که مفید واقع شده.
      از کدام روش استفاده می کنید ؟ از روش اول یا روش po ؟
      همچنین احتمالش هست که یک مورد رو اشتباه انجام دادید بنابراین از سورس کد آخر این پست استفاده کنید

      پاسخ
      1. bhr ۴ شهریور ۱۳۹۸

        ممنونم.
        از روش po استفاده کردم. دقیقا کد شما رو کپی کردم.فولدرهام هم دقیقا به همون شکلی هست که فرمودید. ممکنه ارتباطی به تنظیمات وب سرور یا ویندوز داشته باشه؟ ممنون
        // $language = “fa_IR”;
        $language = “en_US”;
        putenv(“LANG=”.$language);
        setlocale(LC_ALL, $language);
        $domain = “messages”;// name of PO file
        bindtextdomain($domain, “locale”);
        textdomain($domain);
        echo gettext(“hello”);

        پاسخ
      2. حسن شفیعی ۴ شهریور ۱۳۹۸

        مشکل از تابع setlocale روی سیستم شما هست چرا که اگر پکیج های زبان روی سیستم شما نصب نباشند بدرستی کار نمی کند و زبان را تغییر نمی دهد.
        برای دیدن بهتر نتیجه, روی یک هاست واقعی تست کنید
        موفق باشید.

        پاسخ
  4. USDN ۲ اردیبهشت ۱۳۹۷

    سلام، وقت بخیر
    من میخوام با php یه سایت دو زبانه طراحی کنم(البته تمرینی)
    به طوری که اول کاربر زبان مورد نظرشو انتخاب کنه…به عنوان مثال اگر کاربر گزینه انگلیسی رو انتخاب کرد، با استفاده از Cookie تا ۱ دقیقه بعد اگر سایت رو باز کرد کرد واسش سایت انگلیسی باز بشه.
    میشه راهنمایی کنید. با تشکر.

    پاسخ
    1. حسن شفیعی ۲ اردیبهشت ۱۳۹۷

      سلام . ممنونم.
      میتونید از آموزش
      https://netparadis.com/multi-language-support-to-website-php/
      و
      https://netparadis.com/cookies-in-php
      استفاده کنید.

      موفق باشید.

      پاسخ
  5. زهره ۲۱ آبان ۱۳۹۶

    سلام سوالی در مورد دو زبانه کردن سایت دارم .مثلا من سایتی طراحی کردم که چند صفحه داره و میخوام کاربر در هر صفحه ای که هست با کلیک روی تغییر زبان همان صفحه را انگلیسی یا فارسی کند نه این که با زدن روی لینک به صفحه اول برود . دو صفحه fa و en هم مانند روش اول که توضیح دادین ایجاد کردم سایتم رو هم با php نوشتم . ممنون میشم راهنماییم مکنید

    پاسخ
    1. حسن شفیعی ۲۱ آبان ۱۳۹۶

      سلام . برای اینکار کافیه در صفجه جاری مفدار رو با متد get به همان صفحه ارسال کنید . به اینصورت که مثلا در صفحه news.php هستید لینک مورد نظر را به صورت داینامیک با آرایه $_SERVER و ایندکس SCRIPT_NAME ایجاد کنید و در سورس کد صفحه فعلی خود در اول صفحه که قصد دریافت اطلاعات query string را دارید مقدار زبان که en و یا fa است رو دریافت و فایل مربوطه و رشته های مورد نظر را از فایل زبان نظر فراخوانی کنید.

      موفق باشید

      پاسخ
  6. majid ۲۳ مهر ۱۳۹۶

    درود../
    فیلم آموزشی در این زمینه که به صورت کامل توضیح داده باشه میتونید معرفی کنید؟

    پاسخ
    1. حسن شفیعی ۲۳ مهر ۱۳۹۶

      سلام . متاسفانه فیلمی در این زمینه ندارم . ولی برای ترجمه قالب سایت های وردپرسی می توانید به وفور آموزش های ویدیویی مربوطه رو پیدا کنید.

      هر کجای این آموزش مشکل داشتید از این قسمت ارسال کنید سریعا پاسخگو هستم .

      موفق باشید

      پاسخ
دوره های آموزشی