اکثر برنامه ها در زبان انگلیسی نوشته شده و مستند سازی می شود و انگلیسی در زمان اجرا از انها استفاده میشود در صورتی که اکثر مردم با زبان مادری خود راحتتند و ترجیح می دهند که از زبان مادری خود استفاده کنند.
این ابزار امکان استفاده از برنامه های چند زبانه را به برنامه نویسان خواهد داد , بدون اینکه برنامه نویس در گیر کار ترجمه یک پروژه شود
هنگام بحث در مورد پشتیبانی زبان اختصاصی در برنامه ها دو واژه بیشترین کاربرد رو دارن که عبارتند ار جهانی نمودن (internationalization ) و محلی سازی (localization .) که اغلب بجای این لغات از کلمات i18n و l10n اولی برای جهانی سازی و دومی برای محلی سازی استفاده می شود (حدث بزنید این کلمات چه ربطی به کلمات اصلی خود دارند!)
به طور خلاصه جهانی سازی عبارتند از اینکه یه بسته نرم افزاری فابلیت پشتیبانی زبانهای مختلف را داشته باشد و محلی سازی پیاده سازی یکی از زبانها در یک برنامه جهانی شده است .
محلی سازی علاوه بر ترجمه متون برنامه شامل فرمت نمایش تاریخ , اعداد , واحد پول و ... نیز هست
حالا ما تو این مقاله قصد معرفی یکی از این ابزارها به نام gnu gettext را داریم امیدوارم که مفید واقع بشه . البته تمام این مراحل در سیستم عامل لینوکس تست شده ولی می توانید با با مراجعه به آدرس http://www.gnu.org/software/gettext نسخه ویندوزی آنرا دانلود و از آن استفاده کنید.
فایلهای ترجمه
متنهایی که در برنامه می بایست ترجمه شود بایستی در فایلهایی با پسوند .po ذخیره شوند (po = portable object ) این فایلها قابل ویرایش هستند و هر متن قابل ترجمه را به ترجمه آن مرتبط میکند.
اگر برنامه شما از زبانهای زیادی پشتیبانی کند هر زبان دارای حداقل یک فایل po اختصاصی خود زبان هست . این فایلها را می توان بصورت دستی ایجاد کرد ویا از ابزارهایی برای اینکار استفاده کرد که در ادامه توضیح خواهم داد.
فایلهای با پسوند .mo که فایلهای non-portable هستند توسط برنامه خوانده می شوند . چند سیستم نیز قبلا ابزارهایی برای ایجاد فایل mo ایجاد کردند ولی gnu gettext از ابزار اختصاصی خود استفاده می کند و این فایلها با پسوند .mo ذخیره می شوند . توجه کنید این فایلها یعنی فایلهای mo توسط برنامه استفاده شده و فایلهای po را که شما و یا ابزار مورد استفاده شما ایجاد کرده باید توسط ابزاری به فایل mo تبدیل شود تا توسط برنامه قابل استفاده باشد.
فرمت فایلهای
PO
white-space
# translator-comments
#. extracted-comments
#: reference...
#, flag...
#| msgid previous-untranslated-string
msgid "untranslated-string"
msgstr "translated-string"
در قسمت untranslated-string متن اصلی که اغلب به صورت انگلیسی هست نوشته شده و در قسمت translated-string ترجمه متن را نوشته و این کار را برای باقی جملات نیز تکرار می کنیم و این فایل را با پسوند .po ذخیره نمایید . شاید به نظراتان این کار سخت به نظر آید ولی یک راه ساده تر نیز وجود دارد واون استفاده از ابزار xgettext به صورت زیر است که تمامی رشته ها را در یک فایل ایجاد کند.
xgettext [option] [inputfile] ...
xgettext -L PHP -o fa_IR.po test.php
test.php نام فایل برنامه ما است که شامل متون قابل ترجمه است و فایل fa_IR.po فایلی است که این برنامه ایجاد می کند.
حالا شاید بپرسید که این ابزار از کجا بفهمد که چه رشته هایی باید ترجمه شده و چه رشته هایی نبایست. شما در برنامه خودتون هر کجا خواستید خروجی را چاپ کنید که اگر زبانی غیر از انگلیسی هم بو بتوان ان را ترجمه کرد از تابع gettext() و یا _() استفاده کنید ابزار تمامی رشته های داخل این دو تابع را گرفته و در داخل فایل . جمع می کند که شماید بایستی با باز کردن این فایلها توسط ویرایشگرهای ساده متن ویا ابزارهایی که برای اینکار موجود است ترجمه رشته ها را بنویسید.
به طور مثال این متن فایل test.php است که در بالا اشاره شد.
##test.php##
echo _(“ firstname”); // or gettext(“firstname”);
echo _(“Last name”);
printf(_(“My name is %s”),”Alireza meskin malek”);
?>
حال اگر دستور بالا را اجرا کنید برنامه فایلی به نام fa_IR.po ایجاد کرده که حاوی متن زیر است
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-08-04 14:44-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: test.php:2
msgid " firstname"
msgstr ""
#: test.php:3
msgid "Last name"
msgstr ""
#: test.php:4
#, php-format
msgid "My name is %s"
msgstr ""
حال شما باید متنهای ترجمه را در این فایل نوشته و ذخیره کنید متن این فایل بعد از تغییر
"Project-Id-Version: fa_IR\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-08-04 14:44-0600\n"
"PO-Revision-Date: 2007-08-04 14:47-0600\n"
"Last-Translator: root\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: test.php:2
msgid " firstname"
msgstr "نام "
#: test.php:3
msgid "Last name"
msgstr "نام خاونوادگی "
#: test.php:4
#, php-format
msgid "My name is %s"
msgstr "نام من %s است "
البته می توانید برای راحتی کار از ابزاری مثل
Kbabel استفاده کنید.
حال برای تبدیل این فایل به فایلی با پسوند .
mo که قابل فهم توسط برنامه باشد از دستور زیر استفاده کنید:
msgfmt -f fa_IR.po -o test_msg.mo
حال روش استفاده از این فابل در برنامه
معمولا در نوشتن برنامه ها پوشه ای به نام
locale ایجاد کرده و درون این پوشه برای هر یک از زبانهای که پشتیبانی می شود پوشه ای با کد دو رقمی زبان و کشور مثل (
fa_IR ( ایجاد می کنیم و درون این هر یک از این پوشه ها پوشه ای به نام
LC_MESSAGES ایجاد کرده و فایلهای .
mo را درون این پوشه قرار می دهیم توجه کنید برای اجرا نیازی به فایلهای .
po نیست .
پس ما هم برای تست یه پوشه ای به نام
locale ایجاد و درون آن پوشه ای بنام
fa_IR ایجاد کرده , درون این پوشه نیز پوشه ای به نام
LC_MESSAGES ایجاد کرده که فایلهای ترجمه در این پوشه قرار می گیرند و فایل
test_msg.mo را درون آن کپی می کنیم.
برای بهتر منوجه شدن مسیر این پوشه به صورت زیر است
project_folder/locale/fa_IR/LC_MESSAGES/test_msg.mo
حال به مهمترین نقطه کار یعنی قابلیت جهانی سازی برنامه میرسیم . در ابتدا شما باید php_gettext رو فعال کنید البته اگر فعال نباشد. برای اینکار در فایل php.ini ; (سمی کولن) را از جلوی extension=php_gettext.so برداشته و سرور را دوباره راه اندازی کنید.
در ابتدا تابع setlocale
این تابع برای مشخص کردن زبان مورد استفاده برنامه شما است . می توانید این مقدار را در فایلهای config خود ذخیره و از آن استفاده کنید در کد زیر با انتخاب زبان fa_IR برنامه متون را به زبان فارسی نمایش می دهد البته اگر فایلهای این زبان موجود باشد.
setlocale(LC_ALL, 'fa_IR');
تابع بعدی bindtextdomain که با این تابع مسیر و نام فایل رو مشخص می کنید به صورت زیر
bindtextdomain("test_msg", "./locale");
حال با این کار برنامه در مسیر
./locale/fa_IR/ LC_MESSAGES به دنبال فایلی به نام
test_msg.mo می گردد.
در این تابع با مشخص کردن پارامتر دوم که مسیر جستجو برای فایلها ترجمه است برنامه از این پس هرکجا به ترجمه نیاز پیدا کند در پوشه
locale به دنبال ان می گردد و پارامتر اول نام فایل ترجمه است که در مرحله قبل ایجاد کردیم .البته شما می توانید فایلهای مختلفی را ایجاد کنید و با این تابع مسیر هر کدام را معرفی کنید و با تابع
textdomain فایل پیش فرض را انتخاب کنید که در این مثال همان
test_msg است .
توجه کنید این کدها را می بایست در ابتدای فایل
test.php قرار دهید که ما برای قابل فهم تر شدن مرحله قبل آنرا اکنون اضافه می کنیم محتویات این فایل بعد از تغیر به صورت زیر خواهد شد.
##test.php##
setlocale(LC_ALL, 'fa_IR');//defaule language
// Specify location of translation tables
bindtextdomain("test_msg", "./locale");
// Choose domain
textdomain("test_msg");
echo _(" firstname"); // or gettext("firstname");
echo _("Last name");
printf(_("My name is %s"),"Alireza meskin malek");
?>
حال اگر این فایل را اجرا کنید متنها را به صورت فارسی نمایش خواهد داد.
حال موردی را در نظر بگیرید که فایلهای زبان مورد نظر ایجاد نشده باشد در این صورت متنها به همان صورت انگلیسی که در متن برنامه نوشته شده نمایش داده خواهد شد . برای تست در کد بالا بجای
fa_IR کلمه
ar_AR را قرار دهید مشاهده می کنید که خروجی به صورت انگلیسی خواهد بود . البته می توانید مراحل بالا را برای متنهای عربی نیز تکرار کنید تا برنامه شما قابلیت نمایش جملات عربی را نیز داشته باشد.
البته شما بغیر از متن می توانید تاریخ واحد پولی را نیز تغییر دهید. که با جستجو در منوال می توانید به اطلاعات بیشتری دست بیابید.