اختاپوس خسته

یادداشت‌هایی پیرامون کد، زندگی و دوستان

فارسی کردن بلاگ

قبلاً گفتم که سیستم مورد استفاده در این وبلاگ اوکتوپرس هست. متأسفانه تاریخ‌ها و تمام جزئیات مربوطه روی سیستم Georgian بود و به شکل انگلیسی نمایش داده میشد. امروز این مشکل رو حل کردم {کف مرتب} این‌جا می‌نویسم شاید به درد کسی بخوره.

اول از همه باید ببینیم که تاریخ‌ها چطور و توسط چه کسی ساخته میشن. تاریخ‌ها رو خود برنامهٔ اوکتوپرس از روی پست مارک‌داون تولید می‌کنه. بعدش تگ‌های HTML به این صورت داخل صفحه درج میشه:

1
2
3
<time datetime="2013-09-16T13:39:00+04:30" pubdate data-updated="true">
Sep 16<span>th</span>, 2013
</time>

الان باید ببینیم که دقیقاً کدوم اسکریپت هست که این فایل رو تولید می‌کنه. بعد از یکمی گشت و گذار می‌بینیم که اسکریپت date.rb داخل پوشهٔ plugins مسئول تولید کد برای تاریخ‌ها هستش. الآن می‌دونیم باید چی‌کار کنیم. هدف اینه که اون کدها طوری تغییر داده بشن که تاریخ‌ها به صورت جلالی نشون داده بشه. برای این کار دو تا چیز لازم داریم. یکی پیاده‌سازی تاریخ جلالی در زبان روبی و دیگری روشی برای این که تگ‌های <time> پروتکل HTML رو مجبور کنیم که تاریخ جلالی رو قبول کنن. متأسفانه برای دومی کنسرسیوم بین‌المللی وب هنوز راه‌کاری ارائه نداده ولی خوشبختانه پیاده‌سازی تقویم جلالی در روبی موجود هست. دوستان عزیزمون آلن برگی پیاده‌سازی بسیار خوبی رو این‌جا منتشر کردن. این پیاده‌سازی در مخازن gem هم موجوده. خوب شروع می‌کنیم:

1
2
3
4
5
6
7
~$ sudo gem install jalalidate
[sudo] password for soroush:
Fetching: jalalidate-0.3.3.gem (100%)
Successfully installed jalalidate-0.3.3
1 gem installed
Installing ri documentation for jalalidate-0.3.3...
Installing RDoc documentation for jalalidate-0.3.3...

بعدش بررسی می‌کنیم که آیا گِم مورد نظر به‌درستی نصب شده یا نه؟ اگه همه‌چی خوب پیش رفته باشه باید:

1
2
3
4
~$ gem list jalalidate
*** LOCAL GEMS ***

jalalidate (0.3.2)

اگه خیلی پارانویا باشید (مثل من) می‌تونید:

1
ruby -rubygems -e 'require "jalalidate"' # خروجی باید خالی باشه. یعنی بدون ارور

قبل از این‌که بریم سراغ اسکریپت date، باید به jalalidate رو به rake معرفی کنیم. در مورد این کار مشکلات خیلی زیادی داشتم! چون خود اکتوپرس یک گِم هست، تنها اضافه کردن require ‘jalalidate’ به اول Rakefile کفایت نمی‌کنه. خوب من اینو نمی‌دونستم! باید به Gemfile هم چیزهایی رو اضافه کنیم:

1
2
3
4
5
6
7
source "https://rubygems.org"
group :development do
  gem 'rake', '~> 0.9'
  # ....
  gem 'jalalidate' ,'~> 0.3.3'
end
gem 'sinatra', '~> 1.4.2'

مرحلهٔ بعد اضافه کردن jalalidate به Rakefile مون هست. فقط کافیه که یه بعد از آخرین require اضافه کنیم:

1
require "jalalidate"

الان برای تبدیل فرمت نام‌گذاری مارک‌داون‌ها، خطوط زیر رو تغییر می‌دیم. برای این که زیاد شلوغ‌بازی نشه متن اصلی رو نمی‌نویسم. دقیقاً این خط هست.

1
2
filename = "#{source_dir}/#{posts_dir}/#{JalaliDate.new(Date.today)
                 .strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}"

دقت کنید که به بقیهٔ تاریخ‌ها دست نمی‌زنیم! چون بک‌اند اصلی ما تاریخ گریگورین هست. و HTML نمی‌تونه تاریخ دیگه‌ای رو بفهمه. علاوه‌بر این ما در ادامه می‌خوایم اسکریپت تولید تاریخ رو طوری تغیید بدیم که تاریخ پست رو به جلالی تبدیل کنه و بعد داخل کد تولید شده درج کنه. برای این کار همون فایل date.rb رو باز می‌کنیم و این‌جا رو تغییر میدیم:

1
2
3
4
5
6
7
# Returns an ordidinal date eg July 22 2007 -> July 22nd 2007
# now returns 26 شهریور 1392
def ordinalize(date)
  date = datetime(date)
  jd =  JalaliDate.new(date)
  "#{jd.strftime('%e')} #{jd.strftime('%b')} #{jd.strftime('%Y')}"
end

هر فرمت دیگه‌ای هم که بخواید می‌تونید انتخاب کنید. مثلا «سه‌شنبه 26 شهریور 1392». مشکل اصلی که همچنان وجود داره رقم‌ها هستند. من ترجیه میدم که با ارقام فارسی نوشته بشه. مثلاً «سه‌شنبه ۲۶ شهریور ۱۳۹۲». برای حل این مشکل خیلی راحت میشه یه تابع روبی نوشت که ارقام رو جایگزین کنه. خوب اونم نگه می‌دارم واسه بعد :دی چون هنوز روبی رو خوب بلد نیستم. در واقع اصلاً بلد نیستم. این اولین برخوردم بوده.

می‌مونه لینک‌هایی که سیستم تولید می‌کنه. اون‌ها هم کاری ندارن. عین همین کاری که بالا انجام دادم فقط باید پیدا کنید که کی مسئول تولید کدش هست و خفت‌شو بگیرید.

دیدگاه‌ها