i18n
شاید ساده‌ترین کار در توسعه‌ی برنامه‌های چندزبانه ترجمه‌ی واژه‌ها و جمله‌های به‌کاررفته در نرم‌افزار باشد، بخش مهم‌تر شیوه‌ی کدنویسی چنین سیستمی است. به گونه‌ای که توسعه و تغییر در کوتاه‌ترین زمان و به ساده‌ترین شکل امکان‌پذیر باشد.

برای ایجاد برنامه‌هایی با مفهوم چندزبانه دو پیش‌نیاز وجود دارد. نخست آنچه به «عمومی سازی» یا «Internationalization» یا به شکل کوتاه «I18n» مشهور است.
I18n به صورت کوتاه به کارهایی گفته می‌شود که رفتارهای ورودی و خروجی نرم‌افزار را با نیازهای زبان‌های مختلف سازگار می‌کند. مثلا یکی از این نیازها، «عدم وابستگی به یک تقویم خاص»، «امکان تایپ راست به چپ و چپ به راست»، «پشتیبانی از نویسه‌های یونی‌کد»، «پشتیبانی واحدهای پولی و اعداد متفاوت» و از این دست است.

پس از آنکه پیش‌نیازهای ایجاد یک نرم‌افزار چندزبانه آماده شد و مراحل I18n به درستی در نرم‌افزار اعمال شد، نوبت به مرحله‌ی «بومی‌سازی» یا «Localization» یا به شکل کوتاه «L10n» می‌رسد.
این مرحله، انجام کارهای مورد نیاز برای اضافه کردن یک زبان تازه به نرم‌افزاری است که پیش‌نیازهای I18n در آن وجود دارد. کارهایی که در این مرحله ممکن است انجام شوند عبارتند از: «ترجمه‌ی واژه‌ها و جمله‌های نرم‌افزار به زبان تازه»، «اضافه کردن یک تقویم جدید به نرم‌افزار» و مانند آن.

برخی از واژه‌ی «Globalization» یا «جهانی‌سازی» برای اشاره به دو فرآیند گذشته استفاده می‌کنند.

کارهای لازم برای «عمومی‌سازی» یک نرم‌افزار متغیر و گاهی بسیار سخت و زمان‌بر است. در این مقاله بیش از این وارد جزئیاتش نمی‌شویم. در عوض به یک بخش از «بومی‌سازی» یعنی استفاده از واژه‌های ترجمه‌شده در نرم‌افزار با کمک GNU gettext می‌پردازیم.

gettext ابزاری است که کار شناسایی واژه‌های به‌کاررفته در نرم‌افزار و رابط ترجمه‌ی آن‌ها را برعهده دارد. نخستین بخش در به‌کارگیری gettext، واسط قراردادن این ابزاری برای نمایش رشته‌های خروجی نرم‌افزار است. به این معنی که هر رشته‌ی به کاررفته در خروجی نرم‌افزار باید از واسط gettext عبور کند تا امکان ترجمه و تغییر آن فراهم شود.

برای نمونه در زبان php این کار با قطعه کد زیر به انجام می‌رسد:

<?php
	$locale = 'fa_IR';
 
	@putenv( "LC_ALL={$locale}" );
	@setlocale( LC_ALL, $locale );
 
	$domain = 'amib';
	bindtextdomain( $domain, './lang' );
	textdomain( $domain );
 
	echo gettext( 'Hello World' );
?>

مهم‌ترین بخش در قطعه کد بالا، تابع gettext است که برای ترجمه‌ی متن به زبان هدف استفاده شده است.
عملکرد قطعه کد بالا به پیش‌نیازهایی وابسته است. نخست، نصب بودن افزونه‌ی gettext روی php و بعد وجود فایل‌های ترجمه در شاخه‌ی «lang».
برای فعال کردن افزونه‌ی gettext در Wamp، روی آیکون برنامه در Tray کلیک کنید و از مسیر PHP > PHP Extensions، افزونه‌ی موردنظر را تیک بزنید
مشهورترین ابزار برای شناسایی واژه‌های قابل ترجمه، Poedit است. این برنامه، فایل‌های سورس شما را جستجو می‌کند و پس از شناسایی عبارت‌های قابل ترجمه، رابطی برای انجام این کار در اختیار شما قرار می‌دهد.

gettext برای عملکرد صحیح نیازمند قرارگیری فایل‌های ترجمه در شاخه‌هایی ویژه است. این ساختار برای نمونه کد بالا به شکل زیر است:

./lang/fa_IR/LC_MESSAGES/amib.mo

بخش‌های «lang»، «fa_IR» و «amib.mo» متغیرهایی است که توسط برنامه‌نویس تعیین می‌شوند و قرارگیری آن‌ها با این ساختار در کنار هم از قانون‌های تعریف‌شده در gettext است.

اگر با برنامه‌نویسی WordPress آشنایی داشته باشید، این نرم‌افزار از دستوراتی شبیه gettext استفاده می‌کند که ساختار فایلش با آنچه در بالا مشاهده می‌کنید تفاوت دارد. WordPress از کتابخانه‌ای سفارشی برای بازخوانی و پردازش فایل‌های mo استفاده می‌کند که به دلیل اجرا در محیط php کارایی کمتری دارد.

تنها نکته‌ی باقیمانده در اجرای کد بالا اشکال cache است که در هنگام استفاده از php module و نه CGI رخ می‌دهد. این شیوه‌ی ارتباطی بین php و Apache در Wamp و XAMPP استفاده شده است. به این معنی که تغییر دادن فایل‌های ترجمه در شاخه‌ی lang اثری در خروجی نرم‌افزار ندارند و برای بازخوانی فایل‌ها لازم است تا کارساز آپاچی راه‌اندازی مجدد شود.

۴ نظر در مورد «آشنایی با برنامه‌نویسی چند زبانه و شیوه‌ی به‌کارگیری gettext»

  • با تشکر از مطلب خوب شما
    من برنامه ای دارم که از همین روش برای تبدیل زبان استفاده می کند ولی وقتی wamp 2.5 را نصب کردم
    فایل های ترجمه در خروجی اثری ندارد لطفا راهنمایی فرمائید
    با تشکر

    • امیرمسعود ایرانی می‌گوید:

      با سلام
      ابتدا بررسی کنید که ساختار شاخه‌ها را به درستی ایجاد کرده‌اید
      در مرحله‌ی بعدی به این نکته توجه کنید که پس از تغییر دادن فایل‌های ترجمه، در Wamp ( همون طور که در انتهای نوشته ذکر شده ) لازمه که سرور رو Restart کنید تا Cache فایل‌ها بازسازی بشه

دیدگاهتان را بنویسید

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