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

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

در بخش قبل شیوه‌ی نصب و فعال سازی کتابخانه intl مربوط به محلی‌سازی داده‌ها در php رو گفتم، در این بخش روش استفاده از اون رو توضیح میدم.

IntlDateFormatter - کلاس کار با تاریخ:

برای شروع ابتدا یک IntlDateFormatter با قوانین محلی‌سازی (که خود یک رشته است، برای مثال 'fa' به عنوان قوانین فارسی‌سازی) ایجاد می‌کنید و از متدهای شیء ایجاد شده برای عملیات مورد نظر استفاده می‌کنید. درصورتی که از روند برنامه‌نویسی Procedural استفاده می‌کنید، هر متد کلاس، یک تابع معادل دارد که اولین پارامتر تابع یک شیء IntlDateFormatter است و بقیه پارامترها، همان پارامترهاییست که متد در شیوه‌ی ObjectOriented می‌گیرد.

ثوابت از پیش تعریف شده.

نام ثابت تاثیر روی مقدار زمان تاثیر روی مقدار تاریخ
IntlDateFormatter::NONE عدم نمایش عدم نمایش
IntlDateFormatter::FULL نمایش کامل نمایش کامل
IntlDateFormatter::LONG نمایش طولانی نمایش طولانی
IntlDateFormatter::MEDIUM نمایش متوسط نمایش متوسط
IntlDateFormatter::SHORT  فقط نمایش بخش‌های لازم فقط نمایش بخش‌های لازم
IntlDateFormatter::TRADITIONAL   تقویم‌های غیر میلادی
IntlDateFormatter::GREGORIAN   تقویم میلادی

 

استفاده:

ایجاد یک شیء از کلاس به این صورت است:

static IntlDateFormatter IntlDateFormatter::create ( string $locale , int $datetype , int $timetype [, string $timezone [, int $calendar [, string $pattern ]]] );
$date_formatter = new IntlDateFormatter ( string $locale , int $datetype , int $timetype [, string $timezone [, int $calendar [, string $pattern ]]] );
IntlDateFormatter datefmt_create ( string $locale , int $datetype , int $timetype [, string $timezone [, int $calendar [, string $pattern ]]] );

$locale: زبان مورد نظر - 'fa' برای فارسی
$datetype, $timetype: یکی از ثابت‌های جدول بالا
$timezone: منطقه زمانی، اگر قید نشود از پیش‌فرض سیستم استفاده می‌شود
$calendar: یکی از دو ثابت ذکر شده در جدول بالا
$pattern: برای اطلاعات بیشتر به  userguide.icu-project.org/formatparse/datetime مراجعه کنید


$date_formatter = new IntlDateFormatter("fa_IR @calendar=persian", 
                              IntlDateFormatter::FULL, 
                              IntlDateFormatter::FULL,
                              'Asia/Tehran',
                              IntlDateFormatter::TRADITIONAL);

فرمت کردن تاریخ با فرمت‌های پیش‌فرض:

print $date_formatter->format(time());

$date = new DateTime('1980-11-11');
print $date_formatter->format($date);

print $date_formatter->format(array('tm_sec'=>3, 'tm_min'=>45, 'tm_hour'=>22, 'tm_mda' => ......);
به دست آوردن گرانول‌های تاریخ به فرمت آرایه‌ای که localtime ارائه می‌کند (tm_mday tm_sec tm_hour ...)

 array IntlDateFormatter::localtime ( string $value [, int &$position ] );

$date_formatter->localtime(time());
$date_formatter->localtime("Wednesday, December 31, 1969 4:00:00 PM PT",0);

ایجاد فرمت دلخواه: اگر نمی‌خواید از فرمت‌های پیش‌فرض استفاده کنید با استفاده از متد setPattern که فرمت‌های ICU را قبول می‌کند، می‌تونید فرمت دلخواه خودتون رو ایجاد کنید (مثلا yyyy یا m-d).

 

$date_formatter = new IntlDateFormatter("fa_IR @calendar=persian", 
                              IntlDateFormatter::FULL, 
                              IntlDateFormatter::FULL,
                              'Asia/Tehran',
                              IntlDateFormatter::TRADITIONAL);
$format_string = 'yyyy';
$datetime = time();
$date_formatter->setPattern('YYYY');
$date_formatter->format($datetime);

IntlDateFormatter::parse یک رشته حرفی شامل تاریخ مورد نظر را می‌گیرد و تاریخ را به فرمت unix timestamp به صورت int برمی‌گرداند.

IntlDateFormatter::getCalendar نوع تقویم فعلی مورد استفاده را برمی‌گرداند. 0 یعنی غیرمیلادی و 1 یعنی میلادی.
IntlDateFormatter::getDateType نوع تاریخ فعلی مورد استفاده را برمی‌گرداند. یکی از ثابت‌های جدول بالا.
IntlDateFormatter::getErrorCode کد خطای آخرین عملیات را برمی‌گرداند (0 یعنی خطایی رخ نداده).
IntlDateFormatter::getErrorMessage پیغام خطای آخرین عملیات را برمی‌گرداند.
IntlDateFormatter::setTimeZone تنظیم منطقه زمانی (Asia/Tehran)
IntlDateFormatter::setCalendar تنظیم نوع تقویم فعلی مورد استفاده. برای مقادیر قابل قبول به جدول بالا مراجعه کنید.

توضیح مختصر در مورد بعضی از کلاس‌های دیگر intl

کلاس Collator:
این کلاس جایگزینیست برای توابع مربوط عملیات رشته‌‌ای تا از حروف غیر انگلیسی پشتیبانی شود.نحوه‌ی ساخت و استفاده از این کلاس تقریبا مشابه IntlDateFormatter است.
نمونه‌ای از متدهای این کلاس:

bool Collator::asort ( array &$arr [, int $sort_flag ] )    //Object Oriented
bool collator_asort ( Collator $coll , array &$arr [, int $sort_flag ] )    //Procedural
bool Collator::sort ( array &$arr [, int $sort_flag ] )    //Object Oriented
bool collator_sort ( Collator $coll , array &$arr [, int $sort_flag ] )    //Procedural
int Collator::compare ( string $str1 , string $str2 )    //Object Oriented
int collator_compare ( Collator $coll , string $str1 , string $str2 )    //Procedural
static Collator Collator::create ( string $locale )    //Object Oriented
Collator collator_create ( string $locale )    //Procedural
string Collator::getErrorMessage ( void )    //OO
string collator_get_error_message ( Collator $coll )    //Procedural
int Collator::getErrorCode ( void )    //OO
int collator_get_error_code ( Collator $coll )    //Procedural

برای لیست کامل متدهای Collator و کاربرد آن‌ها به صفحات راهنمای PHP مراجعه کنید

مثال:

$names = array('کوشا','عرفان','حسین','kamran');
$intl_col = new Collator('fa');
$int_col->sort($names);
 print_r($names);

بعد از Collator می‌رسیم به NumberFormatter
کارای جالبی با NumberFormatter میشه کرد. مثلا تبدیل 0.75 به 75% به صورت خودکار (با قوانین ICU).
مثال:

$fmt = numfmt_create( 'fa', NumberFormatter::TYPE_CURRENCY );
$data = numfmt_format($fmt, 1234567.891234567890000);
echo $data;
$fmt = new NumberFormatter( 'fa', NumberFormatter::DECIMAL );
$fmt->setPattern("#0.# kg");
print $fmt->format(1234567.89100);
$fmt->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "منفی ");
echo $fmt->format(-1234567.891234567890000);

 

تگ های مطلب: 

دیدگاه‌ها

سلام آفرین کلمه دیگری حالا

سلام آفرین کلمه دیگری حالا ندارم که بگم اول چقدر باعث خوشحالی است این مقاله دو چیز را به اثبات می‌کند اول اینکه شما پیگیر هستید دوم اینکه بالاخره یکی این کار را به سرانجام خواهد رساند. امروز به علت آنکه نتوانستم با فردی که این کار را بر روی برنامه توسعه وب در سیستم من انجام داد ارتباط برقرار کنم می‌خواستم برنامه مورد نظر را در یک فایل زیپ برای شما ارسال کنم که البته نمی‌دانم چقدر از برنامه را به درستی از سیستم استخراج کرده و به دست شما می‌رساندم اما حالا با این مقاله و پیگیری شما دیگر نیازی نیست. تا جایی که من در این زمانی که با این مطلب آشنا شدم منظورم همین قابلیت تبدیل php و این پکیج intl است مطلبی فارسی در این ارتباط حداقل به این کاملی البته نسبتاً نه خوانده و نه دیده‌ام امیدوارم بتوانیم تا چند وقت دیگر از هاست گروه شما استفاده کنیم بدون آنکه دغدغه تاریخ و اینگونه چیزها را داشته باشیم و حتماً گروه شما پایه گذار این عمل در میان جامعه فارسی زبان‌ها به خصوص ایران خواهد بود. فقط یک سوال؛ این مطالبی که عنوان شد برای دروپال گفته شد یا فقط برای اطلاع از کلاس‌های این پکیج بود چون در قسمت اول کدها عنوان می‌کنید مقدارهای تاریخ، اختلاف زمانی، منطقه و… باید تعیین شود در حالی که این مقدارها را ما در همان ابتدای راه‌اندازی دروپال مشخص می‌کنیم.

@#1 هاست ما همین الان هم با

@#1 هاست ما همین الان هم با intl کار میکنه 

@#2 سلام هاست شما رو از کجا

@#2 سلام هاست شما رو از کجا میشه خرید بصورت آزمایشی این تاریخ شمسی رو هم امتحان کنیم. خوب بود ادامه بدیم

@#2.1 سایت هاستینگ h4d.ir هست

@#2.1 سایت هاستینگ h4d.ir هست اما خرید اینترنتی هنوز فعال نیست دلیلش هم مشکلات امنیتی whcms هست که داریم یک فکرایی براش میکنیم. اما در حال حاضر میتونید با ابنتخاب یکی از پنل ها و ارسال یک ای‌میل به پشتیبانی یک هاست خریداری کنید. 

20

براساس گفته های شما با این

براساس گفته های شما با این برنامه میشه اعداد انگلیسی را هم در سایت فارسی نمایش داد اینقابلیت در برنامه داتکس شماهم هست یا باید خودمان این قابلیت را در بپی اچ پی فعال کنیم؟

@#4  بله درسته میتونه اعداد و

@#4  بله درسته میتونه اعداد و فرمت پول و هر چیز دیگری مربوط به محلی سازی رو فارسی کنه اما ما در ماژول datex فقط روی قسمت تاریخ اون داریم کار میکنیم 

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

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

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

درباره ما

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

تماس با ما

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

logo-samandehi