محلی سازی / فارسی سازی در PHP - بخش یک

شمسی کردن تاریخ php

برای تاریخ شمسی در دروپال از ماژول Datex استفاده کنید.

بخش دوم مقاله‌ی فارسی سازی و محلی سازی در php را اینجا بخوانید

یکی از آرزوهای برنامه‌نویسان فارسی زبان هنگام توسعه برنامه‌ها و اسکریپت‌ها، پشتیبانی آسان از تاریخ شمسی هست. از جمله مشکلات توابع و کلاس‌های فارسی‌ساز که توسط خود ما برنامه‌نویسان ایرانی توسعه یافته‌اند فارسی نکردن بخش‌هایی است که خود از توابع و کلاس‌های داخلی زبان مورد نظر استفاده می‌کنند. برای نمونه ماژول Calendar در دروپال که از Date API استفاده می‌کند.

اما خبر خوب: در پی‌اچ‌پی ورژن ۵.۲ به بعد، یک کتابخانه از طریق PCEL در دسترس است که به طور کامل از محلی سازی پشتیبانی می‌کند. در اینجا استفاده از اون رو آموزش میدم.
اگرچه فعلا مشکل گفته شده رو حل نمی‌کنه یعنی کدهای داخلی پروژه‌ها از این کتابخانه استفاده نمی‌کنند و نیاز به دستکاری مستقیم توسط خود ما هست ولی خودش امیدوار کنندست، با پیگیری مستمر شاید بتونیم کاری کنیم از این کتابخانه استفاده بیشتری شود.
از جمله مشکلاتی که تابع setlocale() دارد، نیاز به نصب بودن زبان مورد نظر روی سیستم مورد استفاده است، اما توابع Intl هیچ ارتباطی با زبان نصب روی سیستم ندارد و دردسر مدیریت زبان‌های سیستم رو کمتر می‌کند. Intl از دستورات ICU نیز پشتیبانی می‌کند بنابراین امکان استفاده از دستوراتی مثل numbers=roman وجود دارد (roman numbers: i ii iii ix xi x).

توضیح در مورد ICU/UCA در این مقاله نمی‌گنجه ولی اگر گوگل رو بگردید مقالات جالبی پیدا می‌کنید. مثلا می‌تونید برای اعداد خاصی، تلفظ‌های خاصی تعیین کنید (به طوری که عدد ۳/۱۴ به کلمه دروپال تبدیل شود یا ۳۶۵ به تبریک).

نصب:

Archlinux
pacman -S php-pear

Ubuntu/Debian
apt-get install php-pear

CentOS/Fedora
yum install php-pear

سپس:

pecl install intl

راهنمای نصب در ویندوز.

سپس باید با حذف علامت ; از فایل php.ini در قسمت extension=intl.so و ری‌استارت کردن Apache اون رو فعال کنید. با چک کردن خروجی تابع phpinfo می‌تونید از فعال شدن intl مطمئن شوید (admin/reports/status/php در دروپال). در نهایت این تابع خروجی مشابه این خواهد داشت:

کتابخانه intl شامل این بخش‌هاست:

  • Collator: کلاس مربوط به کار با رشته‌های حرفی (مقایسه و مرتب‌سازی رشته‌ها).
  • Number Formatter: کلاس مربوط به کار با اعداد (تبدیل رشته‌های عددی به عدد، نمایش اعداد به صورت محلی‌سازی شده و ...).
  • Message Formatter: کلاس مربوط به ساخت پیغام‌های محاوره‌ای برای کاربر نهایی که شامل اعداد و تاریخ محلی‌سازی شده است.
  • IntlDateFormatter: کلاس مربوط به فرمت کردن تاریخ در زبان موردنظر (شامل تاریخ شمسی).
  • Normalizer:کلاس تبدیل رشته به فرم نرمال یونیکد.
  • Locale

فارسی سازی تاریخ در دروپال:
برای فارسی‌سازی تاریخ در دروپال به وسیله این کتابخانه پس از فعال‌سازی این کتابخانه به روش گفته‌شده، patch داده شده رو باید اعمال کرد. برای اعمال patch پس از نصب git باید به روش زیر عمل کنید
البته این patch فقط برای تست اولیه ایجاد شده و در حال تکمیل اون هستیم. پس از تکمیل می‌تونید اون رو تحت ماژول datex دانلود کنید.

git apply --stat drupal-add_persin_date_support_1_1.patch
OR
patch -p1 < drupal-add_persin_date_support_1_1_0.patch

چنانچه نتوانستید patch را اعمال کنید کافیست در فایل common.inc دنبال عبارت زیر بگردید:

$format = date_format($date_time, $format);

و عبارت زیر را دقیقا بعد از آن اضافه کنید

//does _format_date_callback translate? if so we dont need it, our formatter
//is less costly
static $ir_frmater;
if ($langcode == 'fa') {
    if (!$ir_frmater) {
        $ir_frmater = new IntlDateFormatter("fa_IR@calendar=persian",
            IntlDateFormatter::MEDIUM,
            IntlDateFormatter::SHORT,
            $timezone,
            IntlDateFormatter::TRADITIONAL);
    }
    dpm(datefmt_get_error_code ( $ir_frmater));
    return $ir_frmater->format(intval($timestamp));
}

پ.ن: با تشکر ویژه از oops‌ بابت معرفی این function

بخش دوم مقاله‌ی فارسی سازی و محلی سازی در php را اینجا بخوانید

فایل ضمیمه: 

پیوستاندازه
فایل drupal-add_persin_date_support_1_1.patch958 بایت

تگ های مطلب: 

دیدگاه‌ها

سلام

سلام اگر امکانش هست کمی بیشتر توضیح میدادید. و در اخر ایا برای تاریخ شمسی به ماژول datex که نیازی نیست؟

منظورتان از این جمله چیه:

منظورتان از این جمله چیه: (اگرچه مشکل گفته شده رو حل نمی‌کنه ولی خودش امیدوار کنندس). یعنی تاریخ شمسی نمیشه؟

تاریخ دروپال شمسی میشه اما با

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

سلام

سلام باید ما از شما تشکر کنیم برای پیگیریتان و حتماً اگر بیشتر پیگیر باشید به منابع بهتری دست پیدا خواهید کرد. و حالا که مسیری که شما قصد پیمودن آن را دارید به این طریق است بهتر است برنامه خود را به شکلی بنویسید که هم نوع تاریخ‌های دیگر را پوشش دهد و هم اگر زمانی شما تمایل به ادامه نداشتید موضوع و کار شما آنقدر جذاب باشد که از طرف شخص دیگری حال با هر زبان و ملیتی قابل پیگیری باشد. در صورتی هم که اینگونه باشد شاید اینکار آنقدر اعتبار بگیرد که شرکت آکوییا آن را وارد هسته دروپال کند. هرچند این کار خیلی دیر دارد صورت می‌گیرد اما در کویر هم با اینکه خیلی با فاصله باران می‌بارد اما پس از هر باران کویر دشتی از گل‌ها می‌شود امیدوارم عمل شما همین باران باشد و کار شما گل کند. اگر می‌خوای خرس شکار کنی باید با همان تیر اول آن را از پای در‌آوری که اگر او فقط زخمی‌شود خیلی عصبانی شده، جان خودتان را به خطر می‌اندازید. کار شما هم باید ریشه‌ایی باشد تا جلب نظر کند وگرنه این موضوع دباره فراموش خواهد شد. نکته دوم: چرا وقتی وارد این سایت می‌شوی همه جیز اینقدر به هم ریخته است. ویرایشگر در ویرایشگر باز می‌شود نوار ابزار برهم ریخته است خلاصه داستانی است. یک برسی بکن مدیر سایت، یک فایل راست به چپ رای نوار ابزار ویرایش کردم که بد نیست چرا که فایل خود دروپال درست نیست این را با فایل خود دروپال جایگزین کن لطفاً (گذاشتمش در مسیر sites\default\files با نام toolbar-rtl.rar) وقتی وارد می‌شوی بیشتر سایت شکل یک سایت تمرینی را دارد تا سایت یک گروه متخصص

 

 سلام خسته نباشیددر کادر سوم گزینه ICU DATE VERSION 50.1 هم باید نصب بشه؟الان مال بنده رو نصب کردند ولی گزینه دوم نیست؟  یعنی تاریخ شمسی نصب است.

@#4 من الان از این کد در یکی

@#4 من الان از این کد در یکی از بلوکها هم استفاده میکنم و تاریخ شمسی است. اما نمیدانم چرا کدی که شما در این مقاله نوشتید کار نمیکند. یعنی محتوا اصلا باز نمیشود. format(time()) . "\n"; ?>

 

 @#4.1  اینم کدی که در بلوک ایجاد شده شمسی نشون میده <?php $fmt = new IntlDateFormatter("fa_IR@calendar=persian", IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Asia/Tehran', IntlDateFormatter::TRADITIONAL); echo " " . $fmt->format(time()) . "\n"; ?>

این برنام شما کی آماده میشه؟

این برنام شما کی آماده میشه؟ آیا پولی است با اوپن سورس؟

@#7 ماژول تقریبا آماده شده.

@#7 ماژول تقریبا آماده شده. امیدواریم با ارائه این ماژول مشکل تاریخ شمسی در دروپال به صورت کلی حل شود.ماژول کاملا متن باز ارائه میشه و در سایت دروپال هم قرار خواهد گرفت 

نصب intl

میشه لطف کنید روش نصب php-pear و intl را در ویندوز هم توضیح بدهید. اینجوری که متوجه شدم ماژول datex به این وابسته هستش، کلی تو سایت php گشتم چیزی دستگیرم نشد. ممنون از زحماتتون.

سلام، برای کار کردن datex

سلام، برای کار کردن datex نیازی به وجود  PHP-Intl نیست، بدون اون هم روی حالت Fallback کار می‌کنه،در مورد ویندوز باید توی گوگل جست و جو کنم یا توی سایت php.org چک کنم. شما خودتون جست‌وجو کنید من هم به زودی آموزشش رو اضافه می‌کنم.

فارسی کردن تاریخ در ماژول های دروپال

با سلام و تشکر ماژول datex ماژول بسیار خوبی است و بسیاری از مشکلات تاریخ شمسی را حل می کند. ولی این ماژول برای تاریخ هایی که در بعضی از ماژول ها استفاده شده است کار نمی کند. اگر امکان دارد یک راهنمایی جهت ایجاد تغییرات در ماژول ها برای تبدیل تاریخ میلادی به شمسی ارائه فرمایید. با تشکر

دیدگاه جدیدی بگذارید

آخرین ارسال ها

محتواهای محبوب

درباره ما

Author
اینجا دروپال یعنی همه چیز. در مورد دروپال صحبت میکنیم. ماژول هامون رو به اشتراک میزاریم در مورد قالب دروپال ، فروشگاه دروپال، دروپال فارسی و تاریخ شمسی دروپال صحبت میکنیم و هرچیزی که در مورد طراحی سایت با دروپال میدونیم به هم انتقال میدیم. دروپالیون یک سایت شخصی نیست. ما دست همه کسانی که برای پیشرفت دروپال تلاش میکنند رو میفشاریم و با آغوش باز اونها رو در این سایت میپذیریم.

تماس با ما

با ما تماس بگیرید.

logo-samandehi