Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

פרויקטים בלינוקס - Babylon ב-Awesome, ובכלל

Anonymous - 29/01/2009 - 16:56
נושא ההודעה: Babylon ב-Awesome, ובכלל
אהלן,
כתבתי סקריפט פייתון קצרצר שמתממשק לבבילון ומביא את התרגום. אני משתמש בו עם xclip ב-Awesome ככה שאחרי סימון מילה כלשהי, Ctrl+D מדפיס באמצעות Naughty את התרגום.

בגדול, אבל, אפשר להשתמש בו בכל מקום. הסקריפט מקבל מילה באנגלית ומוציא את הערך שלה בעברית.
יש קצת בעיה עם הקידוד, לכן חובה להשתמש ב-iconv להמרה אחרי השימוש בתוכנה.

להלן הקוד:
קוד:
import sys, urllib2
from BeautifulSoup import BeautifulSoup

term = sys.argv[1]
url = 'http://info.babylon.com/cgi-bin/info.cgi?s=educaterra&lang=14&word='+term

code = BeautifulSoup(urllib2.urlopen(url).read())
print code.div.prettify().replace('<div align="right" dir="rtl">\n<font color="BLUE">\n ', '').replace('\n', '').replace('</font>', ' ').replace('<br /><br /></div>', '').replace('<hr /><font color="BLUE"> ', '\n')


אני יודע, זה לא הכי נקי, אבל זה עובד וגם עובד מהר.
כאמור, מריצים כך:
קוד:
bjesus@tilon ~/projects/pytrans % ./pytrans.py hello | iconv -f utf8 -t windows-1252 -c | iconv -f iso88598 -t utf8       
(מ"ק) הלו, היי (ברכת שלום, ברכה בזמן פגישה); הלו! (קריאה למשוך תשומת-לב)
(ש"ע) ברכת שלום, שלום, הלו

Image
Anonymous - 29/01/2009 - 17:50
נושא ההודעה:
מזה Awesome xclip Naughty ?

ואיך זה קשור?
Anonymous - 29/01/2009 - 19:23
נושא ההודעה:
Awesome זה מנהל חלונות - חפש בגוגל את Awesome Window Manager
xclip הוא כלי קטן שעוזר לנהל את ה-clipboard של X - ובעזרת 'xclip -o' אתה יכול לראות את המילה האחרונה שבחרת בעכבר
Naughty היא ספריה ב-Awesome שאחראית על Notifications. אתה יכול למצוא מידע עליה ב-Wiki של Awesome.

כמו שאמרתי, בסופו של דבר הסקריפט בסה"כ מקבל מילה ומביא את התרגום שלה. אתה יכול להשתמש בו איך שאתה רוצה. אני בחרתי להשתמש ב-xclip כדי למצוא איזו מילה מסומנת עכשו, וב-Naughty כדי להעביר את המידע למנהל החלונות שלי - Awesome. וזה גם מה שאתה רואה בתמונה.
bjesus - 30/01/2009 - 08:46
נושא ההודעה:
ורק רציתי להוסיף - אם מישהו יכול להצליח לשחזר את מה שעושה iconv ישירות בפייתון, אני אודה לו מאוד Smile אני מודה שזה נראה קצת צ'יקמוק ככה Embarassed
משה - 30/01/2009 - 09:32
נושא ההודעה:
יש מודול של iconv בפייתון, למה אתה לא משתמש בו?

משה
bjesus - 30/01/2009 - 11:28
נושא ההודעה:
בגדול כי אני מעדיף לממש את זה פשוט בעזרת str.decode ו-str.encode, אבל לא מצליח בזה.

בנוסף, לא רציתי לחייב את המשתמש להתקין את המודול, שאצלי למשל לא מותקן כברירת מחדל במערכת, ואילו iconv כן (אני חושב שזה המצב אצל רוב האנשים). חשבתי שלשחרר את הקוד ככה יהפוך אותו לשמיש אצל יותר אנשים יותר ביתר קלות (לא ש-easy_install זה סיפור, אבל בכל זאת).

יש בעיה תאורטית לממש את ע"י שימוש ב-decode ו-encode של הסטרינג? נראה לי הרבה יותר נכון לעשות את זה ככה, אבל זה לא הולך.
bjesus - 30/01/2009 - 12:08
נושא ההודעה:
הצלחתי. כעת אין צורך ב-iconv (לא התוכנה ולא המודול).

קוד:
#!/usr/bin/env python
# Pytrans is a frontend to babylon
# 0.2
import sys, urllib2, codecs
from BeautifulSoup import BeautifulSoup

term = sys.argv[1]
url = 'http://info.babylon.com/cgi-bin/info.cgi?s=educaterra&lang=14&word='+term

code = BeautifulSoup(urllib2.urlopen(url).read())
result = code.div.prettify().replace('<div align="right" dir="rtl">\n<font color="BLUE">\n ', '').replace('\n', '').replace('</font>', ' ').replace('<br /><br /></div>', '').replace('<hr /><font color="BLUE"> ', '\n').decode('utf8').encode('windows-1252').decode('iso8859-8').encode('utf8')
print result

bjesus - 30/01/2009 - 12:23
נושא ההודעה:
היי, מעכשיו אפשר לחפש כמה מילים יחד, ואם אין תרגום הוא אפילו יגיד Smile

קוד:
#!/usr/bin/env python
# Pytrans is a frontend to babylon
# 0.5
import sys, urllib2
from BeautifulSoup import BeautifulSoup

babylon='http://info.babylon.com/cgi-bin/info.cgi?s=educaterra&lang=14&word='

def translate(term):
    url=babylon+term
    code=BeautifulSoup(urllib2.urlopen(url).read())
    try:
        result = code.div.prettify().replace(
          '<div align="right" dir="rtl">\n<font color="BLUE">\n ', '').replace(
          '\n', '').replace('</font>', ' ').replace('<br /><br /></div>', ''
          ).replace('<hr /><font color="BLUE"> ', '\n').decode('utf8').encode(
          'windows-1252').decode('iso8859-8').encode('utf8')
    except:
        result = "no translation found"
    return result

result = ""
for term in sys.argv[1:]:
    result = result + term + "\n"
    result = result + translate(term) + "\n"

print result


כאמור, אין כבר צורך ב-iconv. לא כמודול ולא בתוכנה עצמה.
bjesus - 05/02/2009 - 01:48
נושא ההודעה:
אמממ... רק בגלל שאין התלהבות, חשבתי לציין שגם מי שלא משתמש ב-Awesome יכול להשתמש בזה בפשטות.
אם יש לכם את הפקודה notify-send (שאצלי ב-Arch מגיעה יחד עם libnotify), למשל, אתם יכולים להריץ את זה פשוט ככה:
קוד:
./pytrans.py hello world | xargs -0I 1 notify-send 1

ולקבל את התרגום, כמו בתמונה הבאה:
Image

בגדול זה יכול להשתלב בכלל סביבת עבודה, ואם תשתמשו ב-xclip ותתנו לזה קיצור במקלדת - אתם מסודרים Wink בהצלחה
Anonymous - 06/02/2009 - 02:00
נושא ההודעה:
זה נשמע לי נהדר, ואני מתלהב מאוד. אני זקוק לדבר כזה בדיוק.
רק מה, בתור בור קצת קשה לי להשתמש בתיאור הגולמי של מה שכתבת. אני לא יודע מה עושה Awsome, מה עושה xclip ואיך מחברים אותם עם הסקריפט שלך. האם תוכל בבקשה לכתוב Howto שיפרט איך להתקין את הסקריפט ולהשתמש בו, כולל התקנת תלויות ועד לרמת קיצור-הדרך במקלדת, בסביבת גנום?
Anonymous - 06/02/2009 - 03:53
נושא ההודעה: גם אני מצטרף לזה שמעליי
אין לי שום מושג במה שקשור לפייתון
מה אני עושה עם זה איך אני מפעיל את הסקריפט? יש ממשק גרפי לדבר? אני על KDE אז איך אני נותן לזה קיצור? או לייתר דיוק המערכת מכירה בזה כתוכנה כדי לתת לזה קיצור?
סליחה על כל השאלות זה אולי הולך להיות הסקריפט הראשון שאני ישים
Anonymous - 06/02/2009 - 09:12
נושא ההודעה:
לא רוצה לקלקל את השמחה אבל יש את stardict ואפשר לשים לו מילון בבילון בעברית. בנוסף המילון מורד למחשב ולא צריך לגשת לאינטרנט בשביל לחפש את המילה (עובד באמת כמו בבילון).
יש ממשק גרפי נחמד וקיצורי מקלדת.

אסף ש.
Anonymous - 06/02/2009 - 13:21
נושא ההודעה:
שינויים קוסמטיים בלבד:
קוד:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib2 import urlopen
from sys import argv

from BeautifulSoup import BeautifulSoup

en_base_url = "http://info.babylon.com/cgi-bin/info.cgi?s=educaterra&lang=14&word='"

def translate(term):
   search_url = "%s%s" % (en_base_url, term)
   page = BeautifulSoup(urlopen(search_url).read())
   try:
      result = page.div.prettify().replace('<div align="right" dir="rtl">\n<font color="BLUE">\n ', '')
      result = result.replace('\n', '')
      result = result.replace('</font>', ' ')
      result = result.replace('<br /><br /></div>', '')
      result = result.replace('<hr /><font color="BLUE"> ', '\n')
      result = result.decode('utf8').encode('windows-1252').decode('iso8859-8').encode('utf8')
      return result
   except:
      return None

if __name__ == "__main__":
   for term in argv[1:]:
      output = translate(term)
      if output:
         print "%s:\n%s" % (term, output)
      else:
         print "No translation found for the term %s" % term

Anonymous - 06/02/2009 - 15:46
נושא ההודעה: מכיר את סטארדיקט
אני מכיר את סטארדיקט, ומסיבות שונות אני מוצא אותו מאוד לא נוח. התגובה שלו איטית מאוד, למרות שמאגר הנתונים שלו מקומי, והוא מקפיץ חלון שלם שצריך לסגור.
שוב, אני מתחנן: אנא הבו לנו מדריך מפורט ליישום הסקריפט המגניב הזה!
Anonymous - 06/02/2009 - 16:26
נושא ההודעה:
מצטער על האוף-טופיק, אבל יש לך טעם מצויין במוזיקה Very Happy
bjesus - 06/02/2009 - 18:37
נושא ההודעה:
היי אורח, תודה, אני מניח שגם לך Wink

בקשר ל-Stardict - אני מכיר את התוכנה, אף כי לא ניסיתי אותה מעולם. בגדול אני מעדיף מאוד להשתמש בסקריפט בעיקר מסיבת משאבים - אני לא אוהב שיש לי ברקע תוכנות שבאותו זמן לא עושות כלום. Stardict היא תוכנת QT שאני מניח שצורכת לא מעט משאבים, בטח שביחס לעובדה שהסקריפט לא צורך משאבים בכלל - הוא נדלק רק כשקוראים לו, ושום פרוסס לא יושב ומחכה. העניין עם האינטרנט הוא נכון, אבל מצאתי שזו לא צרה גדולה כשרובנו מחוברים היום בחיבור מהיר כל הזמן.

אני ממש צפוף בזמנים, אז אין לי כרגע זמן לכתוב (ולוודא) מדריך מפורט לגנום או KDE, אבל אני אגיד שוב בקצרה שאחרי התקנת xclip ו-libnotify (שאני חושב שמגיעה עם רוב ההפצות המודרניות) - זה בסה"כ עניין של הגדרת קיצור במקלדת עבור השורה הבאה:
קוד:
xclip -o | xargs -I $ ./pytrans.py $ | xargs -0I 1 notify-send 1


כאמור xclip -o מביא את המילה(המילים) המסומנת, pytrans.py זה הנתיב לסקריפט שמביא את התרגום, ו-notify-send שולח את התרגום אל libnotify, כמו בסקריפט האחרון.

כשיהיה לי קצת יותר זמן אני אכתוב הוראות מפורטות יותר.
והרבה תודה לאורח על "השינויים הקוסמטיים" Smile

נ.ב.
באשר לשאלה "האם המערכת מכירה בזה כתוכנה?" - אם משהו עושה לך בעיות, נסה לקרוא לקוד עם python קודם. למשל - python thenameofmyscript.py.
Anonymous - 06/02/2009 - 18:56
נושא ההודעה:
תודה רבה - זה עובד נפלא!
כל הכבוד לכל העושים במלאכה.
Anonymous - 07/02/2009 - 02:22
נושא ההודעה:
והנה מגיעות הבקשות.

הסקריפט כבר התחיל לעזור לי. שני דברים קטנים שהייתי רוצה:
1. ניקוי התגיות לא מושלם עדיין. כשמבקשים את ההגדרה למחרוזת faq, למשל, מקבלים כמה תגיות html-יות.
2. הודעות השגיאה לא מושלמות עדיין. כאשר מחפשים מילה אנגלית לא מוכרת מקבלים הודעת שגיאה, אבל כאשר מחפשים צירוף לא מוכר או מילה עברית לא מקבלים כלום. הייתי רוצה לקבל משוב כל פעם שאני מפעיל את הסקריפט. אגב, הייתי שמח גם לקבל שגיאה מיוחדת אם אין שום טקסט ב-x selection, אבל זו כבר באמת התקטננות.
Anonymous - 07/02/2009 - 03:58
נושא ההודעה:
חמוס במשקפיים :
והנה מגיעות הבקשות.

הסקריפט כבר התחיל לעזור לי. שני דברים קטנים שהייתי רוצה:
1. ניקוי התגיות לא מושלם עדיין. כשמבקשים את ההגדרה למחרוזת faq, למשל, מקבלים כמה תגיות html-יות.
2. הודעות השגיאה לא מושלמות עדיין. כאשר מחפשים מילה אנגלית לא מוכרת מקבלים הודעת שגיאה, אבל כאשר מחפשים צירוף לא מוכר או מילה עברית לא מקבלים כלום. הייתי רוצה לקבל משוב כל פעם שאני מפעיל את הסקריפט. אגב, הייתי שמח גם לקבל שגיאה מיוחדת אם אין שום טקסט ב-x selection, אבל זו כבר באמת התקטננות.


אני האורח שביצע את השינויים הקוסמטיים, השעה מאוחרת אבל עם מחר אני אזכור אני אכתוב סקריפט שמתבסס על הרעיון הפשוט פה עם התקנה פשוטה בתור חבילת deb. ואולי נברר גם על מימוש עם מילונים מקומים שאין לי ניסיון איתם אבל עדיין לא הבנתי למה הם כל כך מורכבים.
Anonymous - 07/02/2009 - 15:31
נושא ההודעה:
אחלה, וכל הכבוד!

אם אתה בונה חבילה, חשוב לזכור:
1. גרסאות ל-32 ו-64 ביט.
2. דאגה לתלויות: python, beautiful-soup, libnotify-bin, xclip.
3. הוספה של קיצור-דרך מקלדתי כברירת מחדל במטסיטי, קומפיז, קיי-די-אי.

חזון לגרסה הבאה: ממשק משתמש שיאפשר להגדיר את צירוף המקשים להפעלה ואת המילונים השונים, באונליין ובאוף-ליין, שבהם ייעשה הסקריפט שימוש.

חזון לגרסה שאחרי הבאה: הסקריפט יבין לבד אם הטקסט עברי, ואז יציג תרגום אנגלי, או עברי, ואז יציג תרגום אנגלי.
חמוס_במשקפיים - 08/02/2009 - 03:24
נושא ההודעה:
ניקוי קטן של המחרוזת הסופית:

קוד:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib2 import urlopen
from sys import argv

from BeautifulSoup import BeautifulSoup

en_base_url = "http://info.babylon.com/cgi-bin/info.cgi?s=educaterra&lang=14&word='"

def translate(term):
   search_url = "%s%s" % (en_base_url, term)
   page = BeautifulSoup(urlopen(search_url).read())
   try:
      result = page.div.prettify().replace('\n<font color="BLUE">\n ', '')
      result = result.replace('\n', '')
      result = result.replace('</font>', ' ')
      result = result.replace('<br /><br /></div>', '')
      result = result.replace('<div align="right" dir="rtl">', '')
      result = result.replace('<hr /><font color="BLUE"> ', '\n')
      result = result.decode('utf8').encode('windows-1252').decode('iso8859-8').encode('utf8')
      return result
   except:
      return None

if __name__ == "__main__":
   for term in argv[1:]:
      output = translate(term)
      if output:
         print "%s:\n%s" % (term, output)
      else:
         print "No translation found for the term %s" % term


עם הגירסה הזאת, אין תגיות html שמשתרבבות להגדרות המופקות מר"ת באנגלית כמו faq או hp.
Anonymous - 08/02/2009 - 07:40
נושא ההודעה:
מה עם גרסה שמשתמשת בויקימילון
בתור מילון עברית-עברית?
bjesus - 09/02/2009 - 17:59
נושא ההודעה:
היי, ממש מגניב שאנשים עושים שיפוצים בקוד. תודה Smile

אני שולח עוד תיקון לגירסה האחרונה של חמוס במשקפיים, שמשום מה נותנת ל<hr /> לעבור.
קוד:

#!/usr/bin/env python
# -*- coding: utf-8 -
#
# Pytrans is a frontend to babylon
# 0.8
from urllib2 import urlopen
from sys import argv
from BeautifulSoup import BeautifulSoup

en_base_url = "http://info.babylon.com/cgi-bin/info.cgi?s=educaterra&lang=14&word='"

def translate(term):
    search_url = "%s%s" % (en_base_url, term)
    page = BeautifulSoup(urlopen(search_url).read())
    try:
        result = page.div.prettify().replace('\n<font color="BLUE">\n ', '')
        result = result.replace('\n', '')
        result = result.replace('</font>', ' ')
        result = result.replace('<br /><br /></div>', '')
        result = result.replace('<div align="right" dir="rtl">', '')
        result = result.replace('<hr />', '\n')
        result = result.decode('utf8').encode('windows-1252').decode('iso8859-8').encode('utf8')
        return result
    except:
        return None

if __name__ == "__main__":
    for term in argv[1:]:
        output = translate(term)
        if output:
            print "%s:\n%s" % (term, output)
        else:
            print "No translation found for the term %s" % term
    if len(argv) == 1:
        print "What do you want to translate?"

זה אמור לפתור את זה.

לגבי כל הבקשות:
- העניין המילונים המקומיים נראה לי מסובך. העפתי מבט קצר בקבצי מילון של בבילון, וזה נראה לי מורכב מדי להשקיע בזה. בסופו של דבר זה גם בטח לא חוקי להפיץ את קבצי המילון (בטח שלא אם נעשה בהם שינויים), אז אני לא בטוח שיש בזה טעם, מה גם שהשרת של בבילון עונה מהר.
- חמוס_במשקפיים תיקן את רוב (כל?) בעיות התגיות שהתפלחו לתרגום. תודה.
- הסקריפט נותן עכשו תשובה תמיד (?), גם אם הוא לא מקבל שום בקשה לתרגום.
- לגבי ממשק משתמש - אין לדעתי טעם לשלב כזה בסקריפט. שוב, אם מישהו רוצה ליצור deb שמגדיר את המקשים, מה טוב. בהנחה ש notify-send עובד גם ב-KDE וגם בגנום, זה גם לא צריך להיות מורכב מדי.
- תרגום עברי-אנגלי / אנגלי-עברי לפי ההקשר - לא צריך להיות מסובך בכלל. אני חושב שאת התרגום אפשר להשיג באותו אופן מהאתר של בבילון, ואז נשאלת רק השאלה של איך מאתרים את השפה? יש למישהו רעיון? אולי איזה ביטוי רגולרי?
- ויקימילון נראה לי עדיין קצת חסר, לא? כמו שאני זוכר יש לבבילון מילון עברי-עברי, אני לא בטוח אם יש לו ממשק אינטרנטי. צריך לבדוק.

שוב תודה לכל מי שתרם/תורם וגם לכל מי שמשתמש Wink
חמוס_במשקפיים - 09/02/2009 - 20:09
נושא ההודעה:
אכן, שמתי לב שה-hr התפלק... הקדמת אותי בתיקון.

לגבי תרגום עברי-אנגלי, הזיהוי באמת צריך להיות פשוט. לא מתעסקים כאן עם טקסטים מעורבים אז בסך הכל צריך ביטוי רגולרי שיבדוק אם יש אחת מבין האותיות אבגדהכלמנסעוזחטיפצקרשת. לצערי אינני מתכנת כך שאיני יודע ליישם את זה כאן.

האם אתה יודע מהו קוד השפה של בבילון לתרגום עברי-אנגלי? אם כן, אז היישום המלא קרוב מאוד! Smile
bjesus - 10/02/2009 - 00:46
נושא ההודעה:
היי, יש עכשו תמיכה בתרגום עברי-אנגלי, ואפילו זיהוי של השפה Wink

מצאתי ממשק נוח יותר למאגר של בבילון, בכתובת הזו: http://translation.babylon.com/post_post.php
הוא מקבל POST עם lps כקוד של שפת המקור, lpt כשפת היעד, ו-mytextarea1 כמילה לתרגום. יש להם שם תמיכה בהמון, המון שפות. זה נחמד, ואם מישהו מבין קצת בביטוים רגולרים הוא יכול בקלות להוסיף גם תמיכה בערבית, צרפתית, וכו'.

בכל אופן הקוד קצת מבולגן, אבל אני סומך על המתקנים הקוסמטיים כאן Smile תהנו:


קוד:
#!/usr/bin/env python
# -*- coding: utf-8 -
#
# Pytrans is a frontend to babylon
# Version 0.9
from urllib2 import urlopen
from urllib import urlencode
from sys import argv
from re import compile
from BeautifulSoup import BeautifulSoup

base_url = "http://translation.babylon.com/post_post.php"
english = compile("[A-z]")
def translate(term):
    if english.search(term):
        params = urlencode(dict(lps=0, lpt=14, mytextarea1=term))
    else:
        params = urlencode(dict(lps=14, lpt=0, mytextarea1=term))
    page = BeautifulSoup(urlopen(base_url, params).read())
    try:
        result = ""
        for div in page.findAll("div", {"class": "definition"}):
            try:
                result = result + div.span.span.renderContents().replace("\n","")
            except:
                result = result + div.span.renderContents().replace("\n","")
            try:
                result = result + div.span.nextSibling.renderContents().replace("\n","")
            except:
                result = result + div.span.nextSibling.replace("\n","")
            result = result + "\n"
        result = result.replace("  ","")
        return result
    except:
        return None

if __name__ == "__main__":
    for term in argv[1:]:
        output = translate(term)
        if output:
            print term
            print output
        else:
            print "No translation found for the term '%s'" % term
    if len(argv) == 1:
        print "What do you want to translate?"

חמוס_במשקפיים - 10/02/2009 - 05:51
נושא ההודעה:
נראה מגניב, אבל לא מצליח לתרגם לי עברית. כשאני מבקש ממנו, למשל, לתרגם את המילה "יש", אני מקבל:
קוד:
No translation found for the term 'u05d9u05e9'

מבדיקה שערכתי, מסתבר שהבעיה היא עם xclip שהופך, לפחות באובונטו אינטרפיד, טקסט עברי גאה ב-utf8 לטקסט לועזי מקודד ב-ISO-8859-1. יש דיווח של הבעיה ופאץ', שכביכול כבר נכנס לאפסטרים, בקישור הבא:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=380392
אבל בתיעוד הודעות השחרור של חבילת xclip באובונטו לא מצויין שום פאץ' כזה, והאפשרות המתוארת בקישור להריץ עם הפרמטר -utf8 לא עובדת אצלי.

האם אצלך התרגום מעברית לאנגלית עובד? אם כן יכול להיות שזה תלוי בגירסת ה-x. באיזו הפצה אתה משתמש? בכל אופן זה מסבך את העניינים - אפשר בקלות לזהות את המספרים בקלט ולהניח כתוצאה מכך שהמחרוזת היא עברית, אבל אני לא יודע אם ואיך אפשר לקודד אותה בחזרה ל-utf8 לפני המשלוח לבבילון.
חמוס_במשקפיים - 10/02/2009 - 15:38
נושא ההודעה:
אוקיי - יש! האח הידד!

צריך להשתמש בגירסה 0.11 ומעלה של xclip כדי שהתרגום מעברית יעבוד, ואין צורך בשום פרמטר נוסף. אנשי פדורה החביבים העלו פאץ' שמומש, סוף סוף, באפסטרים. ניתן להוריד מכאן: http://sourceforge.net/projects/xclip ולהדר. צריך להתקין את חבילות הפיתוח של xorg.

באובונטו, למרבית הצער, גירסת xclip אינה עולה 0.8. אני אנסה לבקש יפה בפורומים שלהם לייבא את הגירסה החדשה לפחות לג'אונטי.
bjesus - 10/02/2009 - 19:32
נושא ההודעה:
הי חמוס, אני שמח לשמוע שזה מסתדר בשבילך.

חשבתי - אולי אפשר להוסיף איזה דגל לסקריפט - '--ubuntu' למשל, שידע לקבל את הסטרינג בקידוד הדפוק? סה"כ זה לא צריך להיות מסובך מדי להמיר אותו, לא?
אין לי איזה מחשב אובנטו באזור אז אין לי איך לבדוק, אבל אם יש לך אולי תוכל לעשות איזה ניסוי בהמרת הקידוד (אם תמצא איך, אני אוכל להוסיף את הדגל).

תודה וערב טוב.
bjesus - 12/02/2009 - 11:47
נושא ההודעה:
עוד עדכון! Smile
מעכשו הסקריפט לא מחפש בנפרד כל ערך שאתם מעבירים לו, אלא במידה ויש כמה מילים הוא מחפש אותם יחד - כמשפט או כביטוי. נראה לי יעיל יותר.

בנוסף נפרדנו מהתלות מ-BeautifulSoup, עכשו הכל פייתון טהור.
כאמור, הסקריפט מזהה עם הערך שלכם הוא עברי או אנגלי ומתרגם בהתאם.

קוד:
#!/usr/bin/env python
# -*- coding: utf-8 -
#
# Pytrans is a frontend to babylon
# Version 1.0
from urllib2 import urlopen
from urllib import urlencode
from sys import argv
from re import compile, sub

base_url = "http://translation.babylon.com/post_post.php"
english = compile("[A-z]")

def strip(s):
    intag = [False]
    def chk(c):
        if intag[0]:
            intag[0] = (c != '>')
            return False
        elif c == '<':
            intag[0] = True
            return False
        return True

    return ''.join(c for c in s if chk(c))

def translate(term):
    if english.search(term):
        params = urlencode(dict(lps=0, lpt=14, mytextarea1=term))
    else:
        params = urlencode(dict(lps=14, lpt=0, mytextarea1=term))
    page = urlopen(base_url, params).read()
    return strip(page).replace("\n", '').replace("&nbsp;", "\n").replace("  ", "")
   
if __name__ == "__main__":
    if len(argv) == 1:
        print "What do you want to translate?"
        exit()
    term = " ".join(argv[1:])
    output = translate(term)
    print term
    print output


מישהו יכול לעזור לי לזהות טקסט בערבית? איזה ביטוי רגולרי עולה על זה?

תודה ותהנו (הנה, אני מצרף תמונה מסך של תרגום משפט בעברית).
Image
yp - 12/02/2009 - 20:32
נושא ההודעה:
נחמד ,עוד כמה כמוך ואנחנו מסודרים!

מעניין שאצלי צריך
קוד:

xclip -o | xargs -I $ python pytrans.py $ | xargs -0I 1 notify-send 1


כאילו ./pytrans.py עושה בעיות מעניין למה??? (רק באובנוטו עדיין לא נסיתי בשאר ההפצות אצלי)
קוד:

yy@yy-desktop:~$ xclip -o | xargs -I $ ./pytrans.py $ | xargs -0I 1 notify-send 1
from: can't read /var/mail/urllib2
from: can't read /var/mail/urllib
from: can't read /var/mail/sys
from: can't read /var/mail/re
./pytrans.py: line 12: base_url: command not found
./pytrans.py: line 13: syntax error near unexpected token `('
./pytrans.py: line 13: `english = compile("[A-z]")'

bjesus - 13/02/2009 - 00:46
נושא ההודעה:
אממ... יכול להיות ש
קוד:
/usr/bin/env python
לא עונה כמו שצריך אצלך? מה הפלט שלו?
בנוסף, ווידאת שלסקריפט יש הרשאות ריצה, נכון?

בגדול השורה הראשונה בסקריפט אמורה להגיד ל-shell שלך למי לתת להריץ אותו, ובמקום פייתון הוא מעביר אותו ל-sh (נראה לי). בטוח שהעתקת את השורה הראשונה כמו שהיא?

זה כל מה שאני יכול לחשוב עליו... כך-או-כך זה עניין של ה-shell, לא של הסקריפט עצמו. אבל זה גם לא נורא, רק כמה תווים יותר בהקלדה Wink
bjesus - 13/02/2009 - 02:49
נושא ההודעה:
אהלן, עוד עדכון.
מעכשו הסקריפט מזהה טקסט גם בערבית, ולא משתמש יותר בביטויים רוגלרים.

אם יש בעיות דווחו לי בבקשה, נראה לי אבל שזיהוי השפה טוב יותר ככה (זה פועל על התו הראשון במחרוזת).

קוד:
#!/usr/bin/env python
# -*- coding: utf-8 -
#
# Pytrans is a frontend to babylon
# Version 1.1
from urllib2 import urlopen
from urllib import urlencode
from sys import argv

base_url = "http://translation.babylon.com/post_post.php"

def strip(s):
    intag = [False]
    def chk(c):
        if intag[0]:
            intag[0] = (c != '>')
            return False
        elif c == '<':
            intag[0] = True
            return False
        return True
    return ''.join(c for c in s if chk(c))

def translate(term):
    if term[0] == '\xd7':
        params = urlencode(dict(lps=14, lpt=0, mytextarea1=term))
    elif term[0] in ['\xd9','\xd8']:
        params = urlencode(dict(lps=15, lpt=14, mytextarea1=term))
    else:
        params = urlencode(dict(lps=0, lpt=14, mytextarea1=term))
    page = urlopen(base_url, params).read()
    return strip(page).replace("\n", '').replace("&nbsp;", "\n").replace("  ", "")
   
if __name__ == "__main__":
    if len(argv) == 1:
        print "What do you want to translate?"
        exit()
    term = " ".join(argv[1:])
    output = translate(term)
    print term
    print output

חמוס_במשקפיים - 13/02/2009 - 04:18
נושא ההודעה:
עובד נהדר! איזה כיף!
עוד משאלות:
1. משום מה, כאשר מקבלים תרגום מערבית לעברית דרך libnotify, הן הכותרת הערבית והן ההגדרה העברית מיושרות לשמאל דווקא. הבעייה הזו לא קיימת בתרגום מאנגלית לעברית ולהיפך - שם תמיד העברית מיושרת לימין והאנגלית לשמאל, לא משנה מי בכותרת ומי בהגדרה. אולי צריך להכניס איזה תו בקרה לפני המחרוזת שמתקבלת מהמילון הערבי?
2. אפשר גם רוסית? מן הסתם גם לשפה זו יש מרווח תווים משלה. אני לא יודע, בעצם - יש לבבילון מילון רוסי?
3. יהיה נחמד לשלוט על שפת היעד הראשית של הסקריפט דרך פרמטר חיצוני. ככה אחמד מדמשק יוכל לכוון את הסקריפט לתרגם לו מאנגלית ומעברית לערבית, ומערבית לאנגלית, בלי לנבור בתוכו פנימה.
יש מצב?
(איזה מגניב זה קוד פתוח!)
Anonymous - 13/02/2009 - 15:01
נושא ההודעה:
סקריפט מדהים.
אני משתמש בסביבה של GNOME ומצאתי דרך לשלוף את הטקסט המסומן דרך הסקריפט, עם הקטע קוד הבא.

קוד:

import gtk

clipboard = gtk.clipboard_get(selection = "PRIMARY")
    term = clipboard.wait_for_text()


אלי
yp - 14/02/2009 - 20:37
נושא ההודעה:
תודה...מה שקרה זה שהיה שורה רווח בתחילת הקוד
כנראה מקופי פסט שעשיתי מהאתר ,לא חשבתי שזה יכול לגרום לבעיות ,איזה ילד אני Embarassed
השלב הבא זה לנסות למצוא פעולה יותר נוחה להפעלת הסקריפט ,חשבתי משו עם העכבר
שוב תודה ,באמת סקריפט מוצלח ,ועובד מהר בצורה די מפתיעה
חמוס_במשקפיים - 14/02/2009 - 20:49
נושא ההודעה:
yp :
תודה...מה שקרה זה שהיה שורה רווח בתחילת הקוד
כנראה מקופי פסט שעשיתי מהאתר ,לא חשבתי שזה יכול לגרום לבעיות ,איזה ילד אני Embarassed
השלב הבא זה לנסות למצוא פעולה יותר נוחה להפעלת הסקריפט ,חשבתי משו עם העכבר
שוב תודה ,באמת סקריפט מוצלח ,ועובד מהר בצורה די מפתיעה

אם אתה משתמש בקומפיז אין בעיה להגדיר הרצה בעזרת הזזת העכבר אל אחת מפינות המסך.
Ddorda - 14/02/2009 - 23:01
נושא ההודעה:
באמת אם כבר עוסקים בבאבילון, אולי כדאי כבר לפתח יישום פתוח לשימוש מלא בבאבילון? (נמאס לעבוד עם סטארדיקט)
iceman23 - 14/02/2009 - 23:04
נושא ההודעה:
חמוס_במשקפיים :
אוקיי - יש! האח הידד!

צריך להשתמש בגירסה 0.11 ומעלה של xclip כדי שהתרגום מעברית יעבוד, ואין צורך בשום פרמטר נוסף. אנשי פדורה החביבים העלו פאץ' שמומש, סוף סוף, באפסטרים. ניתן להוריד מכאן: http://sourceforge.net/projects/xclip ולהדר. צריך להתקין את חבילות הפיתוח של xorg.

באובונטו, למרבית הצער, גירסת xclip אינה עולה 0.8. אני אנסה לבקש יפה בפורומים שלהם לייבא את הגירסה החדשה לפחות לג'אונטי.


אפשר בבקשה הסבר לאיך להתקין xclip 0.11 הורדתי והסתבכתי..
אחרי
קוד:
./configure

אני לא מצליח לעשות לא make ולא make install
אני יודע שאני מפספס משהו..

תודה Smile
Anonymous - 15/02/2009 - 03:46
נושא ההודעה:
iceman23 :
חמוס_במשקפיים :
אוקיי - יש! האח הידד!

צריך להשתמש בגירסה 0.11 ומעלה של xclip כדי שהתרגום מעברית יעבוד, ואין צורך בשום פרמטר נוסף. אנשי פדורה החביבים העלו פאץ' שמומש, סוף סוף, באפסטרים. ניתן להוריד מכאן: http://sourceforge.net/projects/xclip ולהדר. צריך להתקין את חבילות הפיתוח של xorg.

באובונטו, למרבית הצער, גירסת xclip אינה עולה 0.8. אני אנסה לבקש יפה בפורומים שלהם לייבא את הגירסה החדשה לפחות לג'אונטי.


אפשר בבקשה הסבר לאיך להתקין xclip 0.11 הורדתי והסתבכתי..
אחרי
קוד:
./configure

אני לא מצליח לעשות לא make ולא make install
אני יודע שאני מפספס משהו..

תודה Smile


צריך את הפלט של ./configure בכדי לעזור לך.
חמוס_במשקפיים - 15/02/2009 - 06:25
נושא ההודעה:
iceman23 :
חמוס_במשקפיים :
אוקיי - יש! האח הידד!

צריך להשתמש בגירסה 0.11 ומעלה של xclip כדי שהתרגום מעברית יעבוד, ואין צורך בשום פרמטר נוסף. אנשי פדורה החביבים העלו פאץ' שמומש, סוף סוף, באפסטרים. ניתן להוריד מכאן: http://sourceforge.net/projects/xclip ולהדר. צריך להתקין את חבילות הפיתוח של xorg.

באובונטו, למרבית הצער, גירסת xclip אינה עולה 0.8. אני אנסה לבקש יפה בפורומים שלהם לייבא את הגירסה החדשה לפחות לג'אונטי.


אפשר בבקשה הסבר לאיך להתקין xclip 0.11 הורדתי והסתבכתי..
אחרי
קוד:
./configure

אני לא מצליח לעשות לא make ולא make install
אני יודע שאני מפספס משהו..

תודה Smile

אייסמן, ככל הנראה חסרה לך החבילה xorg-dev. כמו כן וודא שמותקנת אצלך החבילה build-essentials.
iceman23 - 15/02/2009 - 11:57
נושא ההודעה:
חמוס_במשקפיים :

אייסמן, ככל הנראה חסרה לך החבילה xorg-dev. כמו כן וודא שמותקנת אצלך החבילה build-essentials.


זה מה שפיספסתי תודה.
MBD - 15/02/2009 - 21:45
נושא ההודעה:
ראיתי היום את
http://www.tirgumit.co.il/Translate.asp
ואני חושב שהוא די חדש. מישהו מרים את הכפפה להתממשקות אליו? מצטער, אבל פשוט אני ממש עסוק לאחרונה...
bjesus - 16/02/2009 - 02:05
נושא ההודעה:
זה לא אמור להיות מסובך בכלל, אבל - למה? מה הוא מציע שאין בממשק של בבילון?
Ddorda - 17/02/2009 - 19:26
נושא ההודעה:
bjesus :
זה לא אמור להיות מסובך בכלל, אבל - למה? מה הוא מציע שאין בממשק של בבילון?
יש בבילון ללינוקס?
חמוס_במשקפיים - 18/02/2009 - 00:47
נושא ההודעה:
Ddorda :
bjesus :
זה לא אמור להיות מסובך בכלל, אבל - למה? מה הוא מציע שאין בממשק של בבילון?
יש בבילון ללינוקס?

עכשיו, בזכות הסקריפט הזה, יש.
MBD - 19/02/2009 - 20:42
נושא ההודעה:
bjesus :
זה לא אמור להיות מסובך בכלל, אבל - למה? מה הוא מציע שאין בממשק של בבילון?

זה נקרא "אי תלות בספק יחיד"
Ddorda - 20/02/2009 - 23:45
נושא ההודעה:
אולי אפשר לבנות לזה GUI, כדי שנוכל להשתמש בזה כתוכנה לכל דבר?
ובכלל אני בעד שיהיה כבר תחליף הולם לתוכנת באבילון בעולם הקוד הפתוח, ואם אלה יהיו ישראלים שיבנו את התוכנית - כבוד לנו Smile
חמוס_במשקפיים - 02/03/2009 - 20:37
נושא ההודעה:
שלום bjesus,

שוב תודה רבה על הסקריפט. אני משתמש בו בעזרת שורת ההפעלה שניסחת:

xclip -o | xargs -I $ ~/Software/scripts/pytrans.py $ | xargs -0I 1 notify-send 1

באובונטו ג'אונטי יש בעיה: היא מיישמת מערכת הודעות חדשה. במערכת הזו, כותרת ההודעה מקוצצת כדי להתאים לגודל התיבה. גוף ההודעה (שנכתב בפונט קטן יותר) יכול להיות ארוך הרבה יותר. הפעולה המתבקשת היא להציב את המונח לתרגום בשדה הכותרת (Summary) ואת התרגום בשדה הגוף (Body). למרבית המזל, notify-send תומכת בזה מצוין: הארגומנט הראשון שלה מעביר טקסט לכותרת, והשני - לגוף. את הסקריפט שכתבת כמעט אין צורך לשנות: יש רק להסיר את print term לפני הסוף. עם זאת, עם שורת ההפעלה אני מסתבך. אני פשוט לא מתמצא מספיק בדקויות של פייפינג ואקס-ארגס. האם אוכל לבקש ממך לשנות את השורה הזו כך שתעביר לנוטיפיי-סנד את הפלט של xclip -o בתור ארגומנט ראשון ואת הפלט של pytrans.py (שקיבל גם הוא את xclip -o כקלט) בתור ארגומנט שני?

בתודה מראש,
יותם
Anonymous - 03/03/2009 - 10:51
נושא ההודעה:
נו בערך עוד אפשר לעבוד על זה:

קוד:

import pygtk
pygtk.require('2.0')
import gtk, gobject
import urllib2
from urllib import urlencode
import re

base_url = "http://translation.babylon.com/post_post.php"

def strip(s):
    intag = [False]
    def chk(c):
        if intag[0]:
            intag[0] = (c != '>')
            return False
        elif c == '<':
            intag[0] = True
            return False
        return True

    return ''.join(c for c in s if chk(c))


class gtranslator:
    def translate(self,term):
        if term[0] == '\xd7':
            params = urlencode(dict(lps=14, lpt=0, mytextarea1=term))
        elif term[0] in ['\xd9','\xd8']:
            params = urlencode(dict(lps=15, lpt=14, mytextarea1=term))
        else:
            params = urlencode(dict(lps=0, lpt=14, mytextarea1=term))

        page = urllib2.urlopen(base_url, params).read()
        return strip(page).replace("\n", '').replace("&nbsp;", "\n").replace("  ", "")

    def fetch_clipboard_info(self):
        self.clipboard.request_text(self.clipboard_text_received)
        return True
   
    def clipboard_text_received(self, clipboard, text, data):
   if not text or text == '':
            return
        if self.term==text:
            return

   self.textentry.set_text (text)   
   t=self.translate (text)
   self.textbuffer.set_text (t)
        self.term=text

    def enter_callback (self, widget, entry):
   term=entry.get_text ()
   if term=='':
      return         
   t=self.translate (term)
   self.textbuffer.set_text (t)
        self.term=term
   
    def __init__(self):
        self.window = gtk.Window()
        self.window.set_title("Babylon")
        self.window.connect("destroy", lambda w: gtk.main_quit())

        vbox = gtk.VBox()
        vbox.show()
   self.textentry = gtk.Entry()
   self.textentry.connect("activate", self.enter_callback, self.textentry)
   self.textentry.show()
   vbox.pack_start(self.textentry)

   scrolledwin = gtk.ScrolledWindow()
        scrolledwin.show()

        self.textview = gtk.TextView()
        self.textview.show()
        self.textview.set_size_request(275,150)
        self.textview.set_wrap_mode(gtk.WRAP_CHAR)
        self.textbuffer = self.textview.get_buffer()
   scrolledwin.add(self.textview)

   vbox.pack_start(scrolledwin)
        self.window.add(vbox)
        self.window.show()

   self.clipboard = gtk.Clipboard(display=gtk.gdk.display_get_default(), selection="PRIMARY")
        self.clipboard.request_text(self.clipboard_text_received)
   self.term = ''
        self.clipboard.wait_for_text()

def main():
    gtrans = gtranslator ()
    gtk.main()
    return 0

if __name__ == '__main__':
    main()

חמוס_במשקפיים - 03/03/2009 - 15:33
נושא ההודעה:
תודה רבה על העבודה!
הקוד החדש לא עובד לי. כשאני מריץ אותו מהטרמינל עם "test" כארגומנט אני מקבל:
קוד:

/home/yotam/Software/scripts/pytrans.py: line 2: syntax error near unexpected token `'2.0''
/home/yotam/Software/scripts/pytrans.py: line 2: `pygtk.require('2.0')'


אני מניח שמדובר בתלות שאינני מבין.

מה השיפורים בקוד החדש? מהצצה של בור עושה רושם שהוא משתמש עכשיו בתיבות טקסט של gtk. זה דווקא מאוד בלתי-רצוי מבחינתי. השימוש בהודעות מערכת הוא הרבה יותר קליל ואלגנטי, גם בגלל הפורטביליות וגם משום שהודעות מערכת נסגרות בעצמן, לא גונבות פוקוס מחלונות אחרים וכן הלאה. מעבר לכך, אני רואה שהסקריפט החדש משתמש ב-clipboard של gtk. אם פירוש הדבר הוא שצריך עכשיו לגזור או להעתיק את הטקסט לפני תרגומו, הרי שגם זו נסיגה בשימושיות. עם xclip צריך רק לסמן את הטקסט.

בכל אופן, הבעיה שלי אינה נעוצה בסקריפט כי אם בשורת ההפעלה שלו (ר' מעלה), שאמורה לעשות אינטגרציה עם xclip ועם notify-send. אני צריך להשתמש בפלט של xclip -o פעמיים, פעם כארגומנט עבור הסקריפט עצמו ופעם כארגומנט ראשון עבור notify-send (כשאת הארגומנט השני מספק הסקריפט).

אולי אפשר יהיה להכין גירסה של הסקריפט שתשלב בתוכה את הקריאות ל-xclip (כדי לשאובאת המונח\ים לתרגום) ול-notify-send (כדי לשלוח את המונח ואת הגדרתו כפלטים), כך שלא יהיה צריך לתחזק שורות הפעלה מסובכות? מבחינתי זה יהיה בדיוק מה שאני צריך.
queency - 03/03/2009 - 20:55
נושא ההודעה:
אחלה סקריפט (המקורי כמובן) עובד בלי בעחות באובונטו
חמוס_במשקפיים - 04/03/2009 - 01:07
נושא ההודעה:
יש התקדמות!
חבר'ה, אתם מכריחים אותי ללמוד פייתון! Very Happy

הגירסה הנוכחית של הסקריפט שולחת את הפלט כהודעת מערכת דרך פייתון, כך שהיא לא זקוקה לחבילה libnotify-bin. המונח לתרגום מופיע ככותרת באותיות גדולות, והתרגום -בקטנות. עם זאת, יש צורך (במפתיע) בחבילה python-notify. זו גירסה די מלוכלכת (אין הפרדה בין הקריאה מבבילון ובין משלוח הודעת המערכת, וכמובן שאין מימוש של מחלקות - פעם ראשונה שאני נוגע בפייתון), אבל עובדת. אם מישהו רוצה לנקות, תבוא עליו הברכה.

מכיוון שאין כבר צורך בפקודה החיצונית notify-send, פקודת ההפעלה של הסקריפט פשוטה יותר:
קוד:
xclip -o | xargs -I $ ./pytrans.py $


והנה הסקריפט עצמו:

קוד:
#!/usr/bin/env python
# -*- coding: utf-8 -
#
# Pytrans is a frontend to babylon
# Version 1.2
# Change from 1.1: using pynotify to send a system notification instead of just printing the result. Requires pynotify

from urllib2 import urlopen
from urllib import urlencode
from sys import argv
import pynotify

base_url = "http://translation.babylon.com/post_post.php"

def strip(s):
    intag = [False]
    def chk(c):
        if intag[0]:
            intag[0] = (c != '>')
            return False
        elif c == '<':
            intag[0] = True
            return False
        return True
    return ''.join(c for c in s if chk(c))

def translate(term):
    if term[0] == '\xd7':
        params = urlencode(dict(lps=14, lpt=0, mytextarea1=term))
    elif term[0] in ['\xd9','\xd8']:
        params = urlencode(dict(lps=15, lpt=14, mytextarea1=term))
    else:
        params = urlencode(dict(lps=0, lpt=14, mytextarea1=term))
    page = urlopen(base_url, params).read()
    return strip(page).replace("\n", '').replace("&nbsp;", "\n").replace("  ", "")

if __name__ == "__main__":
    if len(argv) == 1:
        print "What do you want to translate?"
        exit()
    term = str(" ".join(argv[1:]))
    translation = str(translate(term))
    if not pynotify.init("Basics"):
        sys.exit(1)
    n = pynotify.Notification(term, '\n' + translation)
    if not n.show():
        print "Failed to send notification"
        sys.exit(1)


לצערי, עוד לא הצלחתי לגשת לקליפבורד של x כדי לחלץ ממנו את הטקסט הנבחר דרך פייתון. אין טעם להריץ את הפקודה xclip או xsel מתוך הסקריפט בעזרת Popen או Pexpect, מפני שהיא רצה בקונטקסט פנימי ואין לה גישה ל-x שמסביבה. הדרך הנכונה לעשות זאת היא במסגרת הצימודים של פייתון ל-x, מה שנקרא python-xlib, אבל אני עדיין לא סגור על הדרך שבה עושים את זה. שוב, כל הצעה תקבל בברכה.
queency - 04/03/2009 - 10:56
נושא ההודעה:
אשמח לקבל הסבר מה זה בדיוק הפקודה הבאה
xclip -o | xargs -I $ ./pytrans.py $
זה דוגמת הרצה בווינדוס ? או דוגמת הרצה דרך X ?
אם זה דרך X איך עושים את זה ?

אצלי אני מריץ דרך טרמינל BASH רושם PYTHON ואת שם הקובץ וארגומנט
עכשיו עם הודעת המערכת הוא גם סידר לי מימין לשמאל שלא מסודר בטרמינל
לא רע אפילו מGNUV
חמוס_במשקפיים - 04/03/2009 - 12:56
נושא ההודעה:
queency :
אשמח לקבל הסבר מה זה בדיוק הפקודה הבאה
xclip -o | xargs -I $ ./pytrans.py $
זה דוגמת הרצה בווינדוס ? או דוגמת הרצה דרך X ?
אם זה דרך X איך עושים את זה ?

אצלי אני מריץ דרך טרמינל BASH רושם PYTHON ואת שם הקובץ וארגומנט
עכשיו עם הודעת המערכת הוא גם סידר לי מימין לשמאל שלא מסודר בטרמינל
לא רע אפילו מGNUV


הפקודה הזו עובדת רק עם x, והיא משתמשת בתוכנה xclip. אם אתה על אובונטו צריך להוריד ולהדר את xclip מסורספורג', כי הגרסה שבאה עם אובונטו ישנה ולא תומכת ביוניקוד.

הפקודה xclip -o נותנת את הטקסט המסומן כרגע, המצוי תמיד בזכרון המטמון של x. אותו מעבירים בעזרת pipe אל הסקריפט, והסקריפט מתרגם אותו ושולח את התוצאה כהודעת מערכת. אם אתה משתמש בשורת ההפעלה שציינתי למעלה אתה לא צריך להעביר ארגומנט לתרגום; הטקסט המסומן הוא הטקסט שיתורגם.
מאוד שימושי להגדיר את השורה הזו כפעולה של צירוף מקשים ברמת מטאסיטי או קומפיז. אני משתמש ב-ctrl+D.
Anonymous - 09/03/2009 - 04:10
נושא ההודעה: גירסה חדשה
במזל טוב, גירסה חדשה ל-pytrans.
שינויים מהגירסה הקודמת:
1. בוטלה התלות ב-xclip ובמקומה יש להתקין את xsel. היתרון הוא בכך ש-xsel תומכת ביוניקוד גם בגרסאותיה היציבות, ולא צריך לקמפל אותה באובונטו - מספיק להתקין מהמאגרים.
2. נוספה הודעת שגיאה למקרה ששום טקסט לא נבחר.
3. חשוב מכל: קריאת הטקסט הנבחר עבור הקלט מתבצעת כעת בתוך הסקריפט. פירוש הדבר שאין עוד צורך בקלט חיצוני: מספיק להריץ את הסקריפט, והוא יוציא הודעת מערכת גרפית נאה עם תרגום הטקסט הנבחר.

הוראות שימוש:
1. התקינו את החבילות xsel, python-notify
2. צרו קובץ בשם ~/.pytrans.py והעתיקו לתוכו את הסקריפט
3. הצמידו את הפקודה ~/.pytrans.py לצירוף מקשים (כגון Ctrl+d) בהגדרות מנהל החלונות שלכם (קומפיז, מטסיטי וכו')
4. ומכאן ניתן לסמן כל מילה בעברית, אנגלית וערבית ולתרגמה בהנפת מקש.

ושוב תודה ל-bjesus על העבודה החשובה!

קוד:
#!/usr/bin/env python
# -*- coding: utf-8 -
#
# Pytrans is a frontend to babylon
# Version 1.3
# Change from 1.1: using pynotify to send a system notification instead of just printing the result. Requires pynotify
# Change from 1.2: using xsel in-line so no need for complex activation line - just run the script. also added notification when no text is selected.

from urllib2 import urlopen
from urllib import urlencode
import pynotify
import subprocess

base_url = "http://translation.babylon.com/post_post.php"

def strip(s):
    intag = [False]
    def chk(c):
        if intag[0]:
            intag[0] = (c != '>')
            return False
        elif c == '<':
            intag[0] = True
            return False
        return True
    return ''.join(c for c in s if chk(c))

def translate(term):
    if term[0] == '\xd7':
        params = urlencode(dict(lps=14, lpt=0, mytextarea1=term))
    elif term[0] in ['\xd9','\xd8']:
        params = urlencode(dict(lps=15, lpt=14, mytextarea1=term))
    else:
        params = urlencode(dict(lps=0, lpt=14, mytextarea1=term))
    page = urlopen(base_url, params).read()
    return strip(page).replace("\n", '').replace("&nbsp;", "\n").replace("  ", "")

def get_x_selection():
    """Get X selection"""
    proc = subprocess.Popen(['xsel', ], stdout=subprocess.PIPE)
    x_selection = proc.stdout.read()
    proc.stdout.close()
    proc.wait()
    return x_selection

if __name__ == "__main__":

    if not pynotify.init("Basics"):
        sys.exit(1)

    term = str(get_x_selection())
    if len(term) < 1:
        n = pynotify.Notification('No text selected', '')
    else:
   translation = translate(term)
        n = pynotify.Notification(term, '\n' + translation)

    if not n.show():
        print "Failed to send notification"
        sys.exit(1)
[/code]
ZooZ - 09/03/2009 - 12:37
נושא ההודעה:
תיקון לשגיאת הזחה:

קוד:

#!/usr/bin/env python
# -*- coding: utf-8 -
#
# Pytrans is a frontend to babylon
# Version 1.3
# Change from 1.1: using pynotify to send a system notification instead of just printing the result. Requires pynotify
# Change from 1.2: using xsel in-line so no need for complex activation line - just run the script. also added notification when no text is selected.

from urllib2 import urlopen
from urllib import urlencode
import pynotify
import subprocess

base_url = "http://translation.babylon.com/post_post.php"

def strip(s):
    intag = [False]
    def chk(c):
        if intag[0]:
            intag[0] = (c != '>')
            return False
        elif c == '<':
            intag[0] = True
            return False
        return True
    return ''.join(c for c in s if chk(c))

def translate(term):
    if term[0] == '\xd7':
        params = urlencode(dict(lps=14, lpt=0, mytextarea1=term))
    elif term[0] in ['\xd9','\xd8']:
        params = urlencode(dict(lps=15, lpt=14, mytextarea1=term))
    else:
        params = urlencode(dict(lps=0, lpt=14, mytextarea1=term))
    page = urlopen(base_url, params).read()
    return strip(page).replace("\n", '').replace("&nbsp;", "\n").replace("  ", "")

def get_x_selection():
    """Get X selection"""
    proc = subprocess.Popen(['xsel', ], stdout=subprocess.PIPE)
    x_selection = proc.stdout.read()
    proc.stdout.close()
    proc.wait()
    return x_selection

if __name__ == "__main__":

    if not pynotify.init("Basics"):
        sys.exit(1)

    term = str(get_x_selection())
    if len(term) < 1:
        n = pynotify.Notification('No text selected', '')
    else:
        translation = translate(term)
        n = pynotify.Notification(term, '\n' + translation)

    if not n.show():
        print "Failed to send notification"
        sys.exit(1)

Anonymous - 20/03/2009 - 09:35
נושא ההודעה:
אפשר בבקשה הסבר לזה: Embarassed

ציטוט:
. הצמידו את הפקודה ~/.pytrans.py לצירוף מקשים (כגון Ctrl+d) בהגדרות מנהל החלונות שלכם (קומפיז, מטסיטי וכו')

איך עושים את זה באבונטו 8.10?
תודה
חמוס_במשקפיים - 20/03/2009 - 17:39
נושא ההודעה:
Anonymous :
אפשר בבקשה הסבר לזה: Embarassed

ציטוט:
. הצמידו את הפקודה ~/.pytrans.py לצירוף מקשים (כגון Ctrl+d) בהגדרות מנהל החלונות שלכם (קומפיז, מטסיטי וכו')

איך עושים את זה באבונטו 8.10?
תודה

אם אתה משתמש בקומפיז (אפקטי תלת מימד):
1. התקן את החבילה compizconfig-setting-manager והפעל אותה דרך preferences.
2. לחץ על Commands (מימין למעלה). בשדה Command Line 0 הזן:
קוד:
~/.pytrans.py

3. עבור ללשונית Key Binding. בשדה Run Command 0 לחץ על הכפתור disabled, שנה הגדרה ל-enabled, לחץ על Grab key combination ואז על ctrl+d.
4. צא, וזה אמור לעבוד.
אם אתה משתמש במטסיטי:
1. מתפריט preferences בחר keyboard shortcuts.
2. בחר Add. בשדה name הזן Babylon translation, או מה שבא לך. בשדה command הזן
קוד:
~/.pytrans.py
ולחץ על apply.
3. לחץ על הכיתוב disabled מימין לצירוף החדש ולחץ על ctrl+d.
4. צא, וזה אמור לעבוד.
Anonymous - 20/03/2009 - 20:22
נושא ההודעה:
תודה חמוס, אבל זהו שאין לי קומפיז, אני על גנום נקי Smile
חמוס_במשקפיים - 20/03/2009 - 20:39
נושא ההודעה:
אם כך השתמש בהוראות למטסיטי (מנהל החלונות הילידי של גנום) שהובאו בחלקה השני של ההודעה.
נ.ב. אם זה לא עובד נסה להזין כפקודה:
קוד:
python ~/.pytrans.py

Anonymous - 21/03/2009 - 11:15
נושא ההודעה:
טוב, לקח לי כמה זמן עד שמצאתי מה זה "מטסיטי" Embarassed
את האופציה של קיצורי המקלדת אני מכירה, אבל לא מצאתי את האפשרות להוסיף קיצור חדש.
אז גיגלתי ומצאתי את זה
http://www.gsmblog.net/lang-en/linux-howtos/41-linux-howtos/84-adding-universal-shortcuts-in-ubuntugnome.html

ביצעתי את ההוראות, אבל בהרצת הפקודה אני מקבלת את זה
ציטוט:
ארעה שגיאה בהפעלת "pytrans.py":
כשלון בהרצת תהליך ילד "pytrans.py" (No such file or directory).

Anonymous - 21/03/2009 - 20:55
נושא ההודעה:
תודה רבה, זה ממש נוח Very Happy
כל הזמנים הם GMT + 2 שעות