فارسی کردن تاریخ (شمسی) بدون استفاده از ماژول

هر دروپالی به این مشکل بر خورد کرده که نیاز باشد تاریخ دروپال را از حالت پیش فرض که میلادی می باشد به تاریخ شمسی تبدیل نماید و در این راه با مشکلات زیادی روبرو شده است. البته راه حل های خوبی برای این کار موجود است مانند استفاده از ماژول های calender system و ماژول datex که این کار را راحت کرده است. ولی در این آموزش ویدئویی ما روشی را که سایت drupalcms از آن استفاده میکند را آموزش خواهیم داد که بدون استفاده از ماژول صورت میگیرد و تنها با آپلود یک فایل و ویرایش چند فایل دیگر انجام می شود.
می توانید فایل را از قسمت زیر دانلود نمایید:


کدهایی که در این آموزش مورد اتفاده قرار خواهد گرفت:

در ابتدا فايل ضميمه مورد نياز را با نام persiandate.inc را دانلود و در مسير \includes قرار بدهید

براي شناسايي اين فايل توسط دروپال در فايل bootstrap.inc در مسير \includes عبارت زیر را جستجو

  1. /**
  2. * Regular expression to match PHP function names.
  3. *
  4. * @see " title="<a href="http://php.net/manual/en/language.functions.php
  5. ">http://php.net/manual/en/language.functions.php
  6. */

">http://php.net/manual/en/language.functions.php
">http://php.net/manual/...

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

  1. @require_once './includes/persiandate.inc';

در فايل common.inc در مسير \includes عبارت زیر را جستجو

  1. $format = preg_replace(array('/\\\\\\\\/', '/(?<!\\\\)([AaeDlMTF])/'), array("\xEF\\\\\\\\\xFF", "\xEF\\\\\$1\$1\xFF"), $format);
  2.  
  3. // Call date_format().
  4. $format = date_format($date_time, $format);

و آنرا به عبارت زیر تبدیل نمایید:

  1. if($langcode == 'fa'){
  2. $otimezone = date_format($date_time, "O");
  3. $format = jdate($format,$otimezone,$timestamp);
  4. }else{
  5. $format = preg_replace(array('/\\\\\\\\/', '/(?<!\\\\)([AaeDlMTF])/'), array("\xEF\\\\\\\\\xFF", "\xEF\\\\\$1\$1\xFF"), $format);
  6.  
  7. // Call date_format().
  8. $format = date_format($date_time, $format);
  9. }

در فايل comment.module در مسير modules\comment\ عبارت زیر را جستجو کرده

  1. if (!empty($form_state['values']['cid'])) {
  2. // Verify the name in case it is being changed from being anonymous.

و در زیر آن عبارت زیر را اضافه نمایید:

  1. global $language;
  2. if($language->language == 'fa'){
  3. $form_state['values']['date'] = drupalcms_node_date($form_state['values']['date']);
  4. }

در فايل node.module در مسير modules\node\ عبارت زیر را جستجو کرده

  1. // Validate the "authored on" field.

و در زیر آن عبارت زیر را اضافه نمایید:

  1. global $language;
  2. if($language->language == 'fa'){
  3. $node->date = drupalcms_node_date($node->date);
  4. }

در همین فایل دوباره عبارت زیر را جستجو نمایید:

  1. $node->created = !empty($node->date) ? strtotime($node->date) : REQUEST_TIME;

و عبارت زیر را بالای آن اضافه نمایید:

  1. global $language;
  2. if(!empty($node->date) && $language->language == 'fa'){
  3. $node->date = drupalcms_node_date($node->date);
  4. }

در فايل form.inc در مسير \includes عبارت زیر را جستجو نمایید:

  1. $options = drupal_map_assoc(range(1900, 2050));

و آنرا با عبارت زیر جایگزین نمایید:

  1. global $language;
  2. if($language->language == 'fa'){
  3. $options = drupal_map_assoc(range(1300, 1400));
  4. }else{
  5. $options = drupal_map_assoc(range(1900, 2050));
  6. }

و آخرین فایل در فايل install.core.inc در مسير includes\ عبارت زیر را جستجو کرده:

  1. $tasks = array(

و در بالای آن عبارت زیر را اضافه نمایید.

  1. global $install_state;
  2. if(!isset($install_state['parameters']['locale'])){
  3. $install_state['parameters']['locale'] = 'fa';
  4. $reverse_locale = true;
  5. }
  6.  
  7. if($install_state['parameters']['locale'] == 'fa'){
  8. drupal_add_css(path_to_theme() . '/style-rtl.css', array('group' => CSS_THEME));
  9. }
امتیاز دهی: 
Average: 3.3 (62 votes)

نظرات

با سلام
من در زمينه دروپال يك مبتدي هستم و اگر آموزش هاي شما و چند آموزش ديگه توي وب نبود هرگز نمي تونستم با دروپال كار كنم واقعا اگر چند نفر مثل شما دانششون رو در اختيار بقيه مي گذاشتن پيشرفت هاي زيادي حاصل مي شد من تنها مي تونم تشكر كنم.
يك درخواست داشتم ميشه آموزش اين دكمه انتخاب دسته بندي و منوي اون ،تو صفحه اصلي همين سايت رو هم بزارين آيا ميشه بجاي نوشته دكمه ، تصوير قرار داد

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

سلام

ممنون از آموزش خوبتون
مزایا و معایب این روش را اگر ذکر کنید ممنون میشیم.

در مورد این روش تنها معایب که میدونم این هست با بروز رسانی هسته دروپال این تنظیمات از بین میرود و باید دوباره انجام شود.
البته باز هم یک جستجو میکنم و معایب و مزایا رو به محتوا اضافه میکنم.

سلام

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

سلام. ممون. روش خوبی بود. اما وقتی ماژول date نصب کردم پاپ آپ همچنان از میلادی استفاده می کنه. راه حل چیه؟ 

با سلام

بعد از اعمال کدهای فوق در دروپال 7 ، تمامی تاریخ ها به درستی به شمسی تبدیل شدند.

اما در ماژول commerce هنگامی که یک سفارش را ویرایش می کنیم، خطا می دهد و از فیلد created خطا می گیرد.

متن خطا :

exception 'PDOException' with message 'SQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column 'created' at row 1'
in /home/opt/cms/includes/database/database.inc:2173

لطفا راهنمایی بفرمایید.

با سلام

مشکلی که تغییر تاریخ شمسی در ماژول commerce ایجاد می کند. به شیوه زیر قابل حل است.(لطفا به اشتراک بگذارید.)

زمانی که به شیوه فوق تاریخ شمسی را تغییر می دهیم ، باید در ماژول commerce و در فایل  commerce_order.forms.inc در مسیر sites\all\modules\commerce\modules\order\includes نیز تغییر ایجاد کنیم.

باید خط زیر

$order->created = !empty($form_state['values']['date']) ? strtotime($form_state['values']['date']) : REQUEST_TIME;

با کد زیر جایگزین شود :

global $language;
      if(!empty($form_state['values']['date']) && $language->language == 'fa'){
      $calendar = drupalcms_node_date($form_state['values']['date']);
      }
            drupal_set_message($calendar);
  $order->created = !empty($calendar) ? strtotime($calendar) : REQUEST_TIME;

بدین ترتیب ویرایش سفارشات در ماژول commerce دیگر خطا نخواهد داشت.

سلام و ممنون از آموزش مفیدتون. من در قالبی که دارم تمام این بخش‌ها رو با راهنمایی شما درست کردم و مشکلی نداره. تمام ماژول‌ها در صفحات داخلی و اول کاملاً‌ تاریخ شمسی شدن همه به جز مطالب اصلی. یعنی بر فرض یک لینک در صفحه اول با تاریخ شمسی است و وقتی روی آن مطلب تک‌صفحه‌ای می‌رویم تاریخ میلادی است. خیلی هم در includes و ماژول‌ها گشتم پیدا نکردم. ممنون از راهنمایی شما.

سلام خسته نباشید

میشه از این تاریخ شمسی یرای ویو استفاده کرد

یعنی براساس فایل تاریخ شمسی فیلتر کنیم 

آیا برای دروپال 8 راهکاری دارید؟

برای دروپال ۸ میتوانید از ماژول هایی که برای این کار ایجاد شده اند استفاده نمایید مانند:

https://www.drupal.org/project/persiantools

در دروپال 8 هم جواب میده؟

بهتر هست از ماژول ها استفاده کنید

نظر را فراموش نکنید

مطالب مرتبط

برای اطلاعات بیشتر تماس بگیرید: ۰۹۳۹۷۶۹۴۹۰۹ ارتباط با ما
برو بالا