یادداشتهای یه برنامه نویس خیلی ^ 100 کوچولو
اکثر برنامه ها در زبان انگلیسی نوشته شده و مستند سازی می شود و انگلیسی در زمان اجرا از انها استفاده میشود در صورتی که اکثر مردم با زبان مادری خود راحتتند و ترجیح می دهند که از زبان مادری خود استفاده کنند.
این ابزار امکان استفاده از برنامه های چند زبانه را به برنامه نویسان خواهد داد , بدون اینکه برنامه نویس در گیر کار ترجمه یک پروژه شود
هنگام بحث در مورد پشتیبانی زبان اختصاصی در برنامه ها دو واژه بیشترین کاربرد رو دارن که عبارتند ار جهانی نمودن (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##
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
#
#, 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
"Language-Team: LANGUAGE
"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:
"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 است "
msgfmt -f fa_IR.po -o 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("test_msg", "./locale");
##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");
?>