ترجمه فایل زبان برنامه مانتیس با مترجم گوگل

برنامه مانتیس یه برنامه واسه گزارش مشکلات(Bug Reporting) هست. تو این برنامه شما می تونید به عنوان گزارشگر ثبت نام کنید و bug گزارش بدید، یا می تونید توسعه دهنده نرم افزار باشید و مشکل و پیگیری کنید و رفع کنید و ….

خب این برنامه هم مثل خیلی دیگه از برنامه ها به زبان انگلیسی هست و مثل خیلی دیگه از برنامه های متن باز یه فایل زبان داره که می تونید اونو ترجمه کنید به زبان دلخواه. این فایلها توی فولدر “lang” قرار دارن.

خب من می‌خواستم این برنامه رو به زبان فارسی استفاده کنم و واسش باید یک فایل ۱۵۸۷ خطی رو ترجمه می‌کردم!!
خب این کار هم خیلی زمان‌بر بود هم خیلی سخت! راه دیگه ای که به ذهنم رسید ترجمه توسط یه برنامه بود. اولین چیزی که به ذهنم رسید استفاده از گوگل ترانسلیت بود. اما یه مشکلی وجود داشت! ساختار فایل برنامه به این شکل بود:

.
$s_select_post = 'Select Post';

# news_update.php
$s_news_updated_msg = 'News item updated...';

# news_view_page.php
$s_back_link = 'Back';

# proj_doc_add.php
$s_file_uploaded_msg = 'File upload successful.';

# proj_doc_add_page.php
$s_upload_file_title = 'Upload File';
.

و خیلی منطقی هست که واسه ی گوگل فرقی نداره که اسم متغیر کدوم و رشته ای که باید ترجمه بشه کدوم و هر دو طرف رو ترجمه می کنه. یه راه دیگه این بود که خودم متن رو پردازش کنم و رشته رو به مترجم بفرستم و ازش معنیش رو پس بگیرم. پس دنبال وب سرویس مترجم گوگل گشتم که متاسفانه مجانی نبود!
screen shot
گزینه بعدی این بود که متن رو توی آدرس (https://translate.google.com/#en/fa/hi) واسه مترجم بفرستم و بعد از توی html ترجمه رو بخونم که اونم با توجه به ajax بودن مترجم کار سختی و بعضا این که تشخیص بدی که ترجمه شده متن غیر ممکن هست!
اما نکته همین جاست! درخواست های ترجمه به صورت ajax فرستاده میشن پس با استفاده از افزونه firebug توی فایرفاکس اون آدرسی که مترجم باهاش کار می‌کرد رو پیدا کردم.
screen shot
با توجه به پولی بودن سرویس حتما به هدر های این درخواست هم احتیاج بود.
بعد از آزمایش کردن این آدرس دیدم که نتیجه یه فایل باینری هست، کمی توی اینترنت گشتم و با توجه به هدر درخواست حدس زدم باید یه فایل gzip باشه. بعد فایل رو باز کردم و به یه رشته json رسیدم که نتیجه دلخواه من توش بود

و در نهایت اینم شده برنامه‌ای که این کار رو برام انجام میده :)

#!/usr/bin/python3.2

from urllib import request as urll
import json,gzip,urllib

urlBase='https://translate.google.com/translate_a/t?client=t&sl=en&tl=fa&hl=en&sc=2&ie=UTF-8&oe=UTF-8&ssel=0&tsel=0&'

rf=open('strings_english.txt','r')
wf=open('strings_persian.txt','a+')

fileLen= len(rf.readlines())

rf.seek(0)

counter=0
for l in rf.readlines():
        counter+=1
        print(counter, ' line from ', fileLen, ' lines')
        if l[:1]=='$':

                where=l.index('=')
                name=l[:where]
                string=l[where+1:]
                where=string.find('#')
                if where>0 :
                        string=string[:where]
                string=string.strip()
                string=string.replace(';','')
                string=string.replace("'",'')
                tmp=urllib.parse.urlencode({'q':string})
                tmp=tmp.replace("+","%20")
                url=urlBase+tmp

                req = urll.Request(url)
                req.add_header('Accept',        'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
                req.add_header('Accept-Encoding',       'gzip, deflate')
                req.add_header('Accept-Language',       'en-US,en;q=0.5')
                req.add_header('Connection',    'keep-alive')
                req.add_header('Cookie',        '***********************')
                req.add_header('Host',  'translate.google.com')
                req.add_header('Referer',       'https://translate.google.com/')
                req.add_header('User-Agent',    'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130917 Firefox/17.0 Iceweasel/17.0.9')

                html = urll.urlopen(req)
                html = gzip.GzipFile(fileobj=html)
                html = html.read()
                data=html.decode('utf8')
#               while data.find(',,')>0 :
#                       data=data.replace(',,',',"",')

                print(data)
                js = json.loads(data)

                val= js[0][0][0]
                print (name , ' => ' , val)
                wf.write(name+" = '"+val+"';\n")
                wf.close()
                wf=open('strings_persian.txt','a')
        else:
                pass

چند تا نکته
اول اینکه اگه توی گوگل لاگین هستین لاگوت کنید و بعد کوکی رو کپی کنید. چون این احتمال وجود داره که به دلیل درخواستهای زیاد شما به صورت خودکار از طرف گوگل بن بشید.
دوم اینکه کتابخانه json تو پایتون دو کامای پشت سر هم رو به عنوان مقدار خالی در نظر نمی گیره و ارور میده پس با این جایگزینشون کنید (,””,)