اگر از cms وردپرس استفاده می کنید مطمینا افزونه های رایگان و تحاری زیادی را می توانید پیدا کنید که با کمترین زحمت سایت شما را چند زبانه کرده و در اختیاز شما قرار می دهد ولی اگر در حال طراحی سایت اختصاصی خود هستید و یا از cms های آماده استفاده نمی کتید و پروژه هایی که می نویسید و سایت هایی که طراحی می کنید مثل تیم نت برنامه نویسی نت پارادیس , ممطمینا نیاز خواهید داشت که این قابلیت چند زبانه را به صورت دستی و با برنامه نویسی به پروژه خودتان اضافه کنید .
برای ساخت سایت چند زبانه با php تکنیک های مختلفی وجود دارد که به بررسی انها میپردازیم , به هرحال دقت کنید که ایجاد یک سایت چند زبانه صرفا ترجمه ی سایت به زبان های مختلف نیست بلکه واحدهای استفاده شده در سایت نیز باید به زبان مقصد تغییر فرمت داده شوند که این واحدها شامل واحد پول , فرمت زمان میشود.
روش هایی که در اینجا برای ایجاد سایت های چند زبانه شرح میدهیم به صورت زیر هستند :
- استفاده از آرایه ها
- استفاده از تابع gettext
در اینجا به توضیح موارد بالا در PHP میپردازیم :
استفاده از آرایه ها برای ایجاد سایت چند زبانه در PHP :
با استفاده از آرایه های انجمنی (associative) میتوان ترجمه ی سایت را انجام داد. بدین صورت که برای هر کلمه از زبان پایه (زبان پیش فرض سایت) ترجمه ی ان را در نظر میگیرم و ترجمه های مربوط به هر زبان را درون فایل جداگانه قرار میدهیم. به مثال زیر دقت کنید تا متوجه بشید:
1 2 3 4 5 |
<?php /* en.php - english language file */ $messages['hello'] = 'Hello'; $messages['signup'] = 'Sign up for free'; ?> |
ترجمه ی بالا برای حالتی است که سایت به زبان انگلیسی نمایش داده میشود حال به زبان دیگر ترجمه را انجام میدهیم:
1 2 3 4 5 |
<?php /* fa.php - farsi language file */ $messages['hello'] = 'سلام'; $messages['signup'] = 'عضویت در سایت'; ?> |
ترجمه ی بالا برای حالتی است که سایت قرار است در حالت فارسی نمایش داده شود. حال برای استفاده از هر زبان کافیست که فایل ترجمه را به صفحه اضافه کنید و مورد استفاده قرار دهید:
1 2 3 4 5 |
<?php require('fa.php'); echo($messages['hello']); echo($messages['signup']); ?> |
این روش ساده ترین روش برای ایجاد سایت چند زبانه است که سالها مورد استفاده قرار میگیرد.
استفاده از تابع gettext برای ایجاد سایت چند زبانه :
برای ایجاد ترجمه های مختلف میتوان از فایل های po و mo استفاده کرد. این همان کاری است که CMS های بزرگ از جمله وردپرس انجام میدهند. مراحل استفاده از این فایل ها را به صورت زیر شرح میدهیم :
- ایجاد دایرکتوری مناسب
- ایجاد فایل های ترجمه
- استفاده از فایل های ترجمه
برای استفاده از فایل های po یا mo ابتدا باید یک مسیر به صورت تصویر زیر ایجاد کنید :
در اینجا قصد داریم سایتی به دو زبان انگلیسی و فارسی بسازیم. حالا نیاز داریم که فایل های po و mo را ایجاد کنیم. برای ایجاد این فایل ها نیاز به نرم افزار poEdit دارید که میتونید اون رو از اینجا دانلود و نصب کنید.
بعد از دانلود و نصب این نرم افزار آن را باز کنید و از منوی فایل گزینه ی new را بزنید سپس زبان مورد نظر خود را بر روی english(united states) قرار دهید و ok را بزنید. سپس از نوار بالایی گزینه ی save را بزنید (یا کلید های cntrl + s را از روی صفحه کلید بزنید) و محل قرار گیری فایل را درون پوشه ی en_us/LC_MESSAGES که در مرحله ی قبل ایجاد کردید مشخص کنید. فایل های ایجاد شده به صورت زیر خواهند بود:
حالا فایلی که پسوند ان po است را با یک ویرایشگر (مثلا نت پد) باز کنید , کدهای این فایل به صورت زیر خواهند بود :
در فایل ایجاد شده دقت کنید که قسمت language باید به صورت چیزی که در عکس میبینید باشد اگر بدین صورت نیست ان را ویرایش کنید و به حالت en_US قرار دهید. حال به صورت تصویر زیر ترجمه های خودمون رو به این فایل اضافه میکنیم:
در تصویر بالا به دو خط انتهایی که به کدها اظافه کردیم دقت کنید قسمت msgid یک کلمه را مشخص میکند و قسمت msgstr ترجمه ی ان کلمه را مشخص میکند. میتوانید کلمات یا جملاتی قرار بدید و ترجمه ی انها را نیز مشخص کنید. توجه کنید که به ازای هر msgid در خط زیرین ان باید یک msgstr به عنوان ترجمه قرار بگیرد. حال فایل را ذخیره کنید سپس روی فایل دوتا کلیک کنید تا توسط poEdit باز بشه و دکمه ی save را بزنید تا فایل mo نیز تغییر پیدا کند. الان ترجمه ی انگلیسی شما اماده است. همین کار رو میتونید انجام بدید و زبان رو روی persian (iran) قرار بدید همچنین ترجمه رو در قسمت msgstr برابر با “سلام” قرار بدید.
حالا کدهای زیر رو درون فایل index.php در بیرون از پوشه ی locale قرار بدید و ذخیره کنید:
1 2 3 4 5 6 7 8 9 10 |
<?php $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"); ?> |
حالا فایل index.php رو اجرا کنید تا نتیجه ی ترجمه رو ببینید کاربرانی که از ویندوز استفاده میکنن مکنه ترجمه ی فارسی رو نبینن و خود کلمه ی hello رو ببینن این به خاطر سیستم عامل ویندوز است که از فارسی ساپورت نمیکند اما اگه روی لینوکس تست کنید مشکلی نداره , ترجمه رو روی en_US قرار بدید سپس وب سرور خودتون رو restart کنید و سپس فایل index.php رو اجرا کنید تا ترجمه ی انگلیسی رو ببینید. (این ترجمه رو همه ی سیستم عامل ها میبینن).
اگر متوجه شده باشید می بینید که روش دوم برای ساخت سایت چند زبانه با php حرفه ای تر و بهتر از روش اول است که باعث حفظ نطم کد های php و ساختار استاندارد زبان ها مختلف سایت است که cms های معروفی مثل وردپرس و پلاگین های معروفش به این روش کار می کنند و پیشنهاد میشود به این صورت عمل کنید
اگه میخواید ترجمه های شما در تمامی سیستم عامل ها پشتیبانی بشه میتونید از کتابخانه ی gettext (کلیک کنید) استفاده کنید که قابلیت های بیشتری در اختیار شما قرار میده. سورس کد نمونه مثال های این اموزش به همراه poEdit رو میتونید از انتهای همین مقاله آموزشی دانلود و استفاده کنید.
دانلود نرم افزار Poedit از نت پارادیس
برای دانلود فایل های پروژه استفاده شده در این آموزش از قسمت زیر اقدام کنید
هرگونه سوال و یا مشکلی درباره پیاده سازی و ساخت سایت چند زبانه با php داشتید از قسمت نظرات ارسال کنید در کمترین زمان ممکن جواب سوال خود را خواهی گرفت
موفق و پیروز باشید
چطور میتونم از این کتابخوانه استفاده کتم؟
از اینجا کتابخانه را مستقیما دانلود و استفاده کنید
https://github.com/php-gettext/Gettext
یا اینکه اگر کامپوزر دارید مستقیما با دستور composer require gettext/gettext نصب کنید :
https://netparadis.com/what-composer-in-php/
نه منظورم استفاده از توابع و کلاس های داخل کتابخانه هست.
تو صفحه اصلی https://github.com/php-gettext/Gettext کامل تمام موارد رو با مثال و ساده نشون داده که میتونید از کد سمپل استفاده کنید.
با تشکر
با سلام ببخشید میشه دقیقا بگید الان برای رفع مشکل gettext با فارسی داخل ویندوز چیکار باید کرد؟
خداوکیلی نگید از کتابخانه استفاده کن اصلا داکیمونشن نداره فقط کد نوشته. گذاشتن اسم فایل ها و مثال از کد که داکیومنشن نمیشه آخه. شما لطف کن فقط یه توضیح بده
سلام. به اینصورت استفاده کنید:
ابتدا باید این تابع تعریف بشه:
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 ذخیره شد.
موفق باشید.
خیلی ممنون از پاسختون ولی کمکی نکرد. بنده از کتابخانه استفاده کردم و درست شد ولی مشکل اصلی این است که بنده برای performance بهتر میخواستم از این روش استفاده کنم. به صورت عادی از لحاظ رم کمتر خیلی بهتر از روش های دیگه است ولی متاسفانه وقتی از کتابخانه استفاده میکنم چندین برابر بیشتر از استفاده از آرایه یا ثابت ها از رم استفاده میکند و اصلا بهره وری خوبی نداشت. ولی روی سرور لینوکس مشکلی ندارد. خیلی ممنون که وقت گذاشتید.
نتایج تست به شرح زیر شد اگر دوستان خواستن استفاده کنن و امیدوارم که درست تست کرده باشم و نتایج درست باشد:
—————————————
Array:
زمان اجرا: ۰٫۰۰۰۶۴۶۱۱۴۳۴۹۳۶۵۲۳
رم: ۲۴,۵۰۴ bytes
————————————
Define:
زمان اجرا: ۰٫۰۰۱۶۳۹۱۲۷۷۳۱۳۲۳۲
رم: ۱۰,۹۶۰ bytes
———————————–
gettext بدون کتابخانه:
زمان اجرا: ۰٫۰۰۰۲۷۴۸۹۶۶۲۱۷۰۴۱
رم: ۴۱۶ bytes
———————————-
gettext با کتابخانه (PHP-gettext 1.0 (https://launchpad.net/php-gettext):
زمان اجرا: ۰٫۰۱۲۶۴۲۱۴۵۱۵۶۸۶
رم: ۱۰۶,۹۷۶ bytes
سلام ببخشید در مورد مشکل ویندوز با فارسی به جز کتابخوانه gettext چه کار میشه کرد؟
سلام. مورد دیگه ای رو بنده تست نکردم و همین کتابخانه استفاده شده.
سلام
وقت بخیر
ممنون از آموزش مفیدتون
مشکلی که من با این مثال دارم این هست که وقتی زبان رو روی انگلیسی قرار میدم باز همون سلام به فارسی رو خروجی میده. وب سرور هم ریستارت کردم
راهنمایی می فرمایید؟
سلام ممنون. خوشحالیم که مفید واقع شده.
از کدام روش استفاده می کنید ؟ از روش اول یا روش po ؟
همچنین احتمالش هست که یک مورد رو اشتباه انجام دادید بنابراین از سورس کد آخر این پست استفاده کنید
ممنونم.
از روش 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”);
مشکل از تابع setlocale روی سیستم شما هست چرا که اگر پکیج های زبان روی سیستم شما نصب نباشند بدرستی کار نمی کند و زبان را تغییر نمی دهد.
برای دیدن بهتر نتیجه, روی یک هاست واقعی تست کنید
موفق باشید.
سلام، وقت بخیر
من میخوام با php یه سایت دو زبانه طراحی کنم(البته تمرینی)
به طوری که اول کاربر زبان مورد نظرشو انتخاب کنه…به عنوان مثال اگر کاربر گزینه انگلیسی رو انتخاب کرد، با استفاده از Cookie تا ۱ دقیقه بعد اگر سایت رو باز کرد کرد واسش سایت انگلیسی باز بشه.
میشه راهنمایی کنید. با تشکر.
سلام . ممنونم.
میتونید از آموزش
https://netparadis.com/multi-language-support-to-website-php/
و
https://netparadis.com/cookies-in-php
استفاده کنید.
موفق باشید.
سلام سوالی در مورد دو زبانه کردن سایت دارم .مثلا من سایتی طراحی کردم که چند صفحه داره و میخوام کاربر در هر صفحه ای که هست با کلیک روی تغییر زبان همان صفحه را انگلیسی یا فارسی کند نه این که با زدن روی لینک به صفحه اول برود . دو صفحه fa و en هم مانند روش اول که توضیح دادین ایجاد کردم سایتم رو هم با php نوشتم . ممنون میشم راهنماییم مکنید
سلام . برای اینکار کافیه در صفجه جاری مفدار رو با متد get به همان صفحه ارسال کنید . به اینصورت که مثلا در صفحه news.php هستید لینک مورد نظر را به صورت داینامیک با آرایه $_SERVER و ایندکس SCRIPT_NAME ایجاد کنید و در سورس کد صفحه فعلی خود در اول صفحه که قصد دریافت اطلاعات query string را دارید مقدار زبان که en و یا fa است رو دریافت و فایل مربوطه و رشته های مورد نظر را از فایل زبان نظر فراخوانی کنید.
موفق باشید
درود../
فیلم آموزشی در این زمینه که به صورت کامل توضیح داده باشه میتونید معرفی کنید؟
سلام . متاسفانه فیلمی در این زمینه ندارم . ولی برای ترجمه قالب سایت های وردپرسی می توانید به وفور آموزش های ویدیویی مربوطه رو پیدا کنید.
هر کجای این آموزش مشکل داشتید از این قسمت ارسال کنید سریعا پاسخگو هستم .
موفق باشید