آموزش ساخت سایت چند زبانه با PHP

خرداد ۷, ۱۳۹۲ توسط : سعید

سلام

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

برای این کار چند روش وجود داره که من یکی از روشها رو براتون توضیح میدم.

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

برای این کار دو فایل با نام fa.php برای ذخیره ترجمه های زبان فارسی و یک فایل با نام en.php برای زبان انگلیسی میسازیم.

در واقع این دو فایل حاوی یک آرایه است که یک کلید برای کلمه مورد نظر و یک مقدار برای ترجمه است.

فایل fa.php

<?php
$lang['hello'] = 'سلام';
$lang['goodbye'] = 'خدانگهدار';
$lang['home'] = 'خانه';
$lang['about'] = 'درباره ما';
$lang['contact'] = 'تماس با ما';
$lang['links'] = 'لینکهای مفید';
$lang['news'] = 'اخبار';

و محتویات فایل en.php :

<?php
$lang['hello'] = 'Hello';
$lang['goodbye'] = 'GoodBye';
$lang['home'] = 'Home';
$lang['about'] = 'About us';
$lang['contact'] = 'Contact with us';
$lang['links'] = 'Link';
$lang['news'] = 'News';

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

خوب حالا دو تا لینک به صورت زیر میذاریم تا کاربر زبان مورد نیازخودش رو انتخاب کنه :

<a href="http://phpro.ir/?lang=fa" >
Farsi
</a>
<a href="http://phpro.ir/?lang=en" >
English
</a>

 

توی این دو تالینک در URL مقدار lang رو برابر با زبان مورد نظر قرار دادیم.حالا برای دسترسی به زبان میتونیم از آرایه $_GET استفاده کنیم :

if(isset($_GET['lang']))
{
    include $_GET['lang'].'.php';
}else 
{
    include 'fa.php'];
}

ابتدا چک میکنیم که آیا مقدار lang در url ست شده یا نه. اگر مقدار داشت فایل مربوط به همون زبان رو include میکنیم اگر مقدار نداشت به فایل fa.php رو include میکنیم که به این معنیه که سایت ما به صورت پیش فرض از زبان فارسی استفاده میکنه.

تقریبا کار ما تمومه و باید از متغیر $lang در جایی که میخوایم استفاده کنیم.

به عنوان مثال :

echo $lang['hello'];

حالا اگر زبان سایت ما فارسی باشه عبارت ” سلام ” و اگر انگلیسی باشه کلمه Hello نمایش داده میشه.

میتونیم کارمون رو یه کم راحت تر کنیم تا لازم نباشه همه جا از دستور echo استفاده کنیم .

برای این کار یک تابع با نام _e میسازیم :

function _e($key){
    echo $lang[$key];
}

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

_e('hello');

تا اینجا کار ما تمومه اما ممکنه گاهی اوقات ما کلیدی رو فراخوانی کنیم که در متغیر $lang وجود نداشته باشه.برای رفع این مشکل یک پارامتر دوم هم برای تابع _e میذاریم که در صورتی که کلید ما در آرایه وجود نداشته باشه مقدار پیش فرض نمایش داده بشه :

function _e($key , $def = ''){
    if(isset($lang[$key]))
          echo $lang[$key];
    else
        echo $def;
}

این تابع نیاز به توضیح زیادی نداره فقط در ابتدا چک کردیم که مقدار $key در آرایه وجود داره یا خیر اگر وجود نداشت مقدار $def رو به کاربر نمایش میدیم :

_e('site_news' , 'اخبار سایت');

این روش به خاطر اینکه از آرایه $_GET استفاده میکنه باید از لحاظ امنیتی هم بررسی بشه که اینکار رو به خودتون واگذار میکنم.در ضمن این یک مثال کامل نیست باید بیشتر روش کار کنید هدف فقط این بود که با این روش آشنا بشید.

موفق باشید

بازدید : ۱۰۶۵۷

خرداد ۷, ۱۳۹۲ @ ۵:۴۳ ب.ظ

خیلی عالی و کاربردی بود

پاسخ دادن
حامد
خرداد ۸, ۱۳۹۲ @ ۱۲:۳۰ ب.ظ

سعید جان کاکو از i18n استفاده کن راحتتره . تو گوگل یه سرچ بزن

پاسخ دادن
    سعید
    خرداد ۸, ۱۳۹۲ @ ۲:۴۲ ب.ظ

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

    پاسخ دادن
خرداد ۸, ۱۳۹۲ @ ۱۱:۰۸ ب.ظ

سلام استاد سعید. خیلی خوب و مفهومی توضیح داده بودین و واقعا راه انداز. ارادت داریم
ایوب

پاسخ دادن
H0sse!n
خرداد ۱۳, ۱۳۹۲ @ ۵:۴۸ ب.ظ

سلام من تازه کارم آخر متوجه نشدم چجوری از این کد ها استفاده کنم میشه فایل آمادش رو بذارین ممنون و ارادتمند.

پاسخ دادن
تیر ۴, ۱۳۹۲ @ ۷:۲۳ ب.ظ

عالی بود دنبال چنین موضوعی می گشتم
موفق باشید

پاسخ دادن
مرداد ۷, ۱۳۹۲ @ ۱۱:۳۱ ق.ظ

خوب یه روش به روز تر رو توضیح بدین! این روش اصلاً خوب نیست و فقط به درد سایتای خیلی کوچیک می خوره

پاسخ دادن
مرداد ۹, ۱۳۹۲ @ ۲:۳۳ ب.ظ

سلام
می خواستم یه پیشنهاد بهت بدم اگه میشه آموزش هایی که می دی ذو با یک فایل دمو همراه کن تا درک بهتری برای خواننده داشته باشه

موافق باشی

پاسخ دادن
دی ۱۱, ۱۳۹۲ @ ۱۱:۵۸ ق.ظ

سلام
ببخشید همچین کد هایی رو متوجه نشدم باید در چه جایی قرار بدم :
_e(‘site_news’ , ‘اخبار سایت’);
if(isset($_GET[‘lang’]))
{
include $_GET[‘lang’].’.php’;
}else
{
include ‘fa.php’];
}
لطف میکنید یک نمونه کلی قرار بدید
یا فایل های کلی رو برای دانلود قرار بدید
چون خیلی دنبال این روش هستم
هر سایتی رو میگردم از اینجا کپی کردن ولی توضیح بیشتری ندادن .

پاسخ دادن
    دی ۱۳, ۱۳۹۲ @ ۹:۴۱ ق.ظ

    ببخشید میتونید کمکی به من بکنید
    خیلی دنبال این مطلب بودم ، ولی حالاکه پیدا کردم ، نصفه هست و کامل توضیح داده نشده .

    پاسخ دادن
      سعید
      دی ۱۳, ۱۳۹۲ @ ۲:۳۴ ب.ظ

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

      پاسخ دادن
        دی ۱۳, ۱۳۹۲ @ ۴:۵۰ ب.ظ

        لطف میکنید ، خواهشا فایل کلی رو برای دانلود قرار بدید
        مثلا فایل fa.php و en.php و یه فایل دیگه که از این ها استفاده شده .

        چون الان نمیدونم این رو باید کجا بکار ببرم :

        function _e($key , $def = ”){
        if(isset($lang[$key]))
        echo $lang[$key];
        else
        echo $def;
        }

        پاسخ دادن
اسفند ۱۰, ۱۳۹۲ @ ۱۲:۴۶ ب.ظ

سلام.ممنون از آموزشتان.
چطور می توانیم با تغییر زبان یکسری استایل هم تغییر بدیم مثلا فونت و جهت نوشتار؟

پاسخ دادن
    سعید
    اسفند ۱۱, ۱۳۹۲ @ ۸:۵۸ ق.ظ

    سلام خدمت شما . برای تغییر استایل میتونید یک فایل با نام مثلا rtl.css بسازید که استایل های مربوط به زبان های راست به چپ باشه. هنگامی که زبان رو چک کردید اگر مثلا فارسی بود این فایل رو هم توی پروژه اضافه کنید.

    پاسخ دادن
sadegh shafizadeh
آبان ۷, ۱۳۹۳ @ ۶:۴۴ ب.ظ

agha damet kheily garm
mersi
khoda kheiret bedeh

پاسخ دادن
sadegh shafizadeh
آبان ۷, ۱۳۹۳ @ ۶:۵۷ ب.ظ

خیلی ممنون از آموزشتون
فقط من ی سوال برام پیش اومده
با این روش اگه کاربر یکجا و بدون رفرش صفحه چند بار زبان سایت رو عوض کنه مشکلی پیش نمیاد ؟
منظورم اینه که هر دوتا فایل اینکلود میشن بعد کدومشون echo میشه ؟

پاسخ دادن
    Saeed Moqadam
    آبان ۸, ۱۳۹۳ @ ۱۰:۴۰ ب.ظ

    سلام
    نه دیگه. زبان سایت توی آدرس مشخص میشه که اگه ست نشده بود به صورت پیش فرض زبان فارسی لود میشه.نمیتونه همزمان دوتارو باهم لود کنه

    پاسخ دادن
بهمن ۸, ۱۳۹۳ @ ۱۱:۵۸ ق.ظ

سلام. خیلی خوب بود ولی اونجا که یک فانکشن می سازیم بعد فراخوانی می کنیم دیگه کار نمی کنه !! مطمئتید شکل دستوریش درسته ؟؟

پاسخ دادن
بهمن ۸, ۱۳۹۳ @ ۱:۰۰ ب.ظ

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

پاسخ دادن
    Saeed Moqadam
    فروردین ۳۱, ۱۳۹۴ @ ۹:۲۳ ق.ظ

    منظورتون رو دقیق متوجه نشدم!!؟

    پاسخ دادن
amir
مرداد ۲, ۱۳۹۴ @ ۲:۴۳ ب.ظ

سلام ، وقتی از _e(‘hello’ , ‘اخبار سایت’); استفاده میکنم همون اخبار سایت چاپ میشه در صورتیکه توی لیست زبان من موجوده

پاسخ دادن
واحد
فروردین ۸, ۱۳۹۵ @ ۸:۰۱ ب.ظ

سلام.
سایتتون خیلی خوبه ولی هیچ نکته امنیتی رو اشاره نمی کنید چرا ؟!!!
خب همین کد شما رو میشه خیلی ساده هک کرد ! یه کوئری ساده میشه روی همین کد شما زد، حلقه رو بست و با یه دستور Get ساده ، تمام فایل های شما رو فراخوانی کرد ! دقیقا هم فایل های PHP !!! بعد هم یه شل بزنیم روی سایت هم که کل سرور فنا میشه !
خب قربانت، روش هایی رو آموزش بدین که ما تازه کار ها، موقع استفاده به مشکلات امنیتی برخورد نکنیم !

پاسخ دادن
    Saeed Moqadam
    فروردین ۱۷, ۱۳۹۵ @ ۱:۳۴ ب.ظ

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

    این روش به خاطر اینکه از آرایه $_GET استفاده میکنه باید از لحاظ امنیتی هم بررسی بشه که اینکار رو به خودتون واگذار میکنم.در ضمن این یک مثال کامل نیست باید بیشتر روش کار کنید هدف فقط این بود که با این روش آشنا بشید.

    نکته ای رو هم که باید دوستان تازه کار در نظر داشته باشن اینه که آموزشهای این سایت یا هر منبع دیگه ای فقط بهشون یه خط فکری میده و برای کامل کردنش باید خودشون دنبالش برن و کاملش کنن.
    بازم ممنونم به خاطر نکته ای که گفتید
    موفق باشید

    پاسخ دادن

پاسخ دهید

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


*