שדגשדג
"
היום קיבלתי דוא"ל, שכביכול נשלח מ-Facebook. רציתי להזהיר אתכם מפניו. הדוא"ל מכיל את התוכן הבא:
Dear user of facebook,
Because of the measures taken to provide safety to our clients, your password has been changed.
You can find your new password in attached document.Thanks,
Your Facebook.
לדוא"ל מצורף קובץ zip המכיל קובץ exe בשם "Facebook_Password_4tf52.exe". קובץ exe בשביל שיחזור סיסמא? הממ… משהו מסריח פה. עוד מידע על פעולתו של הסוס הטרויאני הזה, תוכלו לקרוא כאן.
אוסיף עוד שורה וחצ על החשיבה הזהירה שצריכה להנחות את משתמש הדוא"ל הפשוט לפני שהוא מקליק פעמיים על קובץ שהולך למרר לו את החיים במשך שבוע (במקרה הטוב).
כל משתמש WordPress יודע – לא תמיד תוסף זקוק לתרגום לעברית. תוספים שהשימוש בהם פשוט מאוד, או תוספים שהשימוש שלהם אינו דורש כמעט טקסט – פשוט יכולים להשאר בשפת המקור, בתנאי שהיא, כמובן, אנגלית.
אך מה קורה כאשר השפה / המונחים מורכבים מדי למשתמש העברי הממוצע ב-Wordpress ? אז התרגום יכול להיות מאוד מבוקש.
ברשומה זאת נדבר על תרגום ב-Wordpress ועל תרגום תוספים בפרט.
I18n
הכותרת מרמזת על רעיון הבינאום (הפיכה לבינלאומי) והינה בעצם קיצור נחמד למילה Internationalization (שהיא i גדולה, 18 אותיות ואז n בסוף. חמוד, לא?). בקצרה, בינאום הינו שלב אחד לפני תרגום. כדי שאפשר יהיה לתרגם תוסף או אלמנט אחר ב-Wordpress, צריכה להמצא פונקציה שיודעת להבדיל בין קוד לטקסט שאפשר לתרגם אותו, ושתדע להיכן לגשת על מנת לשאוב את המחרוזות המתורגמות.
עכשיו התנצלות קטנה – אני לא מתכנן להקיף את כל מה שקשור לתחום הבינאום והתרגום ב-Wordpress. אני מנסה לתת כלים לתרגום, בלי התיאוריה. שלא תבינו לא נכון, היא מאוד חשובה להבנה נכונה של המערכת. אבל עשו את זה כבר טובים ממני (אמנם באנגלית, אבל לא הבטחתי לתרגם את זה (: ) - למעוניינים להרחיב – I18n for WordPress Developers. אתכם הסליחה.
אבל בכל זאת… קצת מושגים טכניים:
מחרוזת שאינה מוכנה לתרגום, נראית כך:
<code lang="php">echo "my wordpress plugin text";
</code>
על מנת לאפשר בעתיד תרגום של המחרוזת, יש לעטוף את המחרוזת בתוך אחת משתי פונקציות – _e() או __().
ההבדל ביניהן הוא שהראשונה מדפיסה את התוכן למסך (בעצם, תרגום ואז echo), והשנייה רק מתרגמת את המחרוזת. זה נראה הבדל קטן אבל עוד תגלו את השימושים לכל אחד מהם.
אותה מחרוזת שמוכנה לתרגום תיראה כך:
_e("my wordpress plugin text"(;
זוהי כל תורת הבנאום על רגל אחת, אבל בבקשה – אם אתם מגיעים לתוסף לא מוכן לתרגום (לא מבונאם), אל תעשו זאת רק על סמך מה שכתבתי כאן. קראו את כל המאמר על I18n באתר של WordPress, בקישור שלעיל. אנחנו מתמקדים כאן בתרגום ולא בבנאום.
שאלה – איך יודעים אם תוסף כבר מבונאם או לא?
תשובה א' – מחפשים קבצי pot, po ו-mo (עוד מעט ניתן הסבר עליהם, יש להם חשיבות)
תשובה ב' – במידה ואין, עדיין לא אומר שהוא לא מבונאם, פשוט אולי לא תרגמו אותו לשום שפה. פתחו קובץ php מרכזי בתוסף וחפשו מחרוזות שעטופות באחת משתי הפונקציות שהצגנו למעלה. אם יש כאלו, התוסף, ככל הנראה, מבונאם.
עוד כמה הגדרות לפני התרגום
קבצי po – קבצי ה-po הינם בעצם הקבצים המחזיקים את התרגום למחרוזות. כל קובץ מחזיק תרגום לשפה אחת, ואפשר לדעת לאיזו שפה, לפי השם. למשל myplugin-en_BR.po הינו תרגום לאנגלית בריטית, וmyplugin-he_IL.po הינו תרגום לעברית ישראלית. לאט לאט תכירו את השמות הרלוונטיים. קבצים אלו הם קבצים יחסית גדולים בנפח, אותם אפשר לראות בכל עורך טקסט.
קבצי mo - קבצי ה-mo הינם העתק של קבצי ה-po חוץ מעניין אחד קטן – קבצי ה-mo קטנים בהרבה בנפח, דבר שמקל על תעבורת המידע. מסיבה זו את קבצי הmo רק המכונה (מערכת התרגום) יודעת לראות. חשוב להבין שאין לזה ערך לערוך בעורך טקסט את קבצי ה-po ולשנות את התוכן, מכיוון שהם לא ישפיעו כך על קובץ ה-mo. יש רק דרך אחת לעשות זאת כמו שצריך (ואם תעקבו אחר המדריך שתיכף יתחיל, תדעו אותה גם אתם).
קבצי pot - קבצי pot הם בעצם קבצי po ריקים מתוכן מתורגם. עליהם נעשה כל תרגום חדש ולאחר מכן נשמר בתור קבצי mo ו-po חדשים.
Xgettext – תוכנה קטנה ליצירת קבצי pot מתוך קובץ php שבונאם.
POedit – תוכנת GUI ליצירת po ו-mo מתוך קובץ pot.
ועכשיו המדריך. עקבו צעד-אחר-צעד ותגיעו לגביע הקדוש.
שלבי התרגום:
1. מצאתי תוסף שזקוק לתרגום, ושכבר בונאם. איך גיליתי זאת? פתחתי את תקיית התוסף, וראיתי כי קיימים קבצי PO ו MO. היו כאלה אך רק בשפה האיטלקית.
2. התקנת xgettext (בubuntu 9.10 היא "באה לבד").
3. לפתוח טרמינל. להגיע לתקייה של התוסף, ולהקליד את הפקודה כמו שהיא מוסברת כאן. אפשר גם להעתיק את הפקודה מהתמונה של הטרמינל (שם היא ברורה יותר) התמונה מוכיחה שזה עובד, כיוון שהקובץ pot לא היה שם לפני התמונה. שימו לב.
4. לפתוח את POedit ולטעון את קובץ הpot מהתקייה, דרך "קובץ" >> "קטלוג חדש מקובץ pot", להכניס את הפרטים המתאימים תחת הגדרות. הערה: בגדול, התעלמו מהטאבים "נתיבית", ו"מילות מפתח". הערה 2: ברוב התוספים אין צורך לגעת בצורות רבים, ועל כן לא אלאה אתכם בעניין. אם אתם לא התרגום הראשון לתוסף, בידקו מה כתוב תחת plural בקובץ ה-po של תרגום כלשהו.
5. לתרגם את המחרוזות משפת האם.
6. לבדוק שב"עריכה">> "העדפות" >> תחת הטאב "עורך" – כפתור ה-checkbox ליד "הדר לקובץ mo בשמירה אוטומטית" מסומן ב-v.
7. לשמור את הקובץ, ולסגור את POedit. עתה תראו שהתוכנה יצרה את שני הקבצים (mo ו po) אך ללא המזהה של השפה הספציפית , תוכלו להוסיף את המזהה בעצמכם על ידי עריכת שם הקבצים.
זהו זה.
כמובן שיש איפה להסתבך, ויש עוד דברים כמו text-domain ואיך מעדכנים תרגום בלי לתרגם הכל מההתחלה, שלא דיברנו עליהם. אבל על הבסיס דיברנו.
כמובן שאם תהיה התעניינות, זה ידרבן אותי לכתוב בנושא יותר.
עובד במערכת וורדפרס 2.8.6, עם רכיב התרגום Transposh 0.35
לא מזמן פרסמתי רשומה על טיפול בשפות עם כיווניות שונה כאשר משתמשים ברכיב התרגום Transposh 0.33.
זה עבד טוב, עד שבגרסה 0.35 המעקף הפסיק לעבוד, כנראה בגלל שינויים משמעותיים במשתנים הגלובליים.
עכשיו הייתי צריך לעשות הכל מההתחלה, והחלטתי שהפעם אני אשתמש רק בשני קבצי CSS – לRTL ול-LTR.
קובץ ה-CSS הראשי (style.css) יהיה ה-LTR, וקובץ CSS שני יהיה ל-RTL (על אף שהייתי צריך RTL לשתיים השפות וLTR רק לאחת).
הבעיה הראשונה שנתקלתי בה נוצרה מכיוון שהWP הותקן בעברית, מה שגרם לwp_head לדרוש את הקובץ rtl.css בכל הפעלה. את האמת, לא ידעתי כל-כך איך לגשת ולהתנות את הוספת rtl.css ב-wp-head לפי השפות המשתנות של Transposh. אז החלטתי להתעלם ממנו (למחוק את הקובץ בכלל), וליצור קובץ חדש style-rtl.css. אני יודע שזה לא מאוד אלגנטי, אבל זה עושה את העבודה.
עכשיו רק הייתי צריך לגרום ל-head של התבנית הנבחרת להתנות את הופעת קובץ ה-style-rtl.css כאשר המשתמש מחליף את ה-Transposh לשפה שדורשת RTL (כמו עברית, או ערבית).
את רוב הטיפ הבא קיבלתי מהח'ברה ב-Transposh, ומעט שיניתי בעצמי.
target_language,
$GLOBALS['rtl_languages'])) ? ('
') : "";?>
במערך גלובאלי שיצרו ברכיב, שמורות כל השפות שזקוקות לשינוי כיווניות (rtl-languages), ובמערך אחר (my_transposh_plugin) שמורה השפה שאיתה הרכיב עובד ברגע זה (target_language).
ניצור תנאי שאומר: אם השפה בה הרכיב עובד עתה מתאימה לאחת מהשפות במערך השפות שדורשות התאמת rtl, עשה משהו.
במקרה הזה, הפעולה היא להדפיס למסך את קישור טעינת ה-style-rtl.css, ובקובץ זה נמצאות ההגדרות החדשות שדורסות את ההגדרות הישנות של style.css על מנת להתאים לשפת ה-RTL.
זה הכל. פשוט לא?
אני שונא WYAIWYG-ים. באמת שונא אותם. הם תמיד מחרבשים את הטקסט וזה אף פעם לא יוצא כמו שאתה רוצה.
אבל מה לעשות שמשתמשי הקצה לא יודעים לכתוב HTML ושהם מצפים שהכל יעבוד כמו בWord. העניין הוא שהם פשוט לא רואים, אבל גם בWord הכל בבלאגן אטומי. נסו לקחת קטע מWord ולהעתיק אותו לעורך וויזואלי ב-WP. תעבירו את העורך למצב HTML ותראו את הבלאגן ש-Word עושה.
אין ברירה. חייבים להצליח לעבוד איתם, עם ה-WYSIWYG-ים.
בעיה מעצבנת לאללה, שבדרך כלל לא משפיעה על הטקסט כשנשמר (וזה מפתיע באמת…) אבל בזמן העריכה זה מאוד מעצבן, וסבלנותם של משתמשי הקצה עשויה להגמר עוד לפני שיפרסמו את הטקסט הראשון שלהם, ויראו שבסוף זה לא נורא – חלון העריכה מיושר לשמאל (מכוון ללעז), וכמובן שאם לוחצים על ישור לימין, אז עדיין הסמן נמצא בתחילת השורה ולא במקום הראוי לו, והניקוד מופיע גם הוא בתחילת השורה.
הפתרון שעבד לי, בגירסת tinyMCE 3/2.4.1 (לקח לי מלא זמן למצוא את הגרסה, ואני אפילו לא בטוח שזה מעודכן כי זה מאיזו הודעה מהקרביים של קובץ ה-js… אין מה לעשות, התיעוד שלהם חרא), המותקנת לצרכי WordPress, הוא פשוט יחסית:
1. למצוא את קובץ ה-css, בספרייה wp-includes/js/tinymce/themes/advanced/skins/wp_theme, ולהוסיף לאלמנט Body mceContent ולאלמנט #tinyMCE (אם הוא לא קיים, אז ליצור אותו), את התכונה:
text-align:right;
2. היכן שהתוכנה קוראת לtinyMCE היא עושה זאת באמצעות המערך JavaScript שנקרא tinyMCE.init. למערך זה צריך להוסיף את הערך:
directionality: "rtl"
תכנסו ותחפשו, אז תבינו למה הכוונה.
זה הכל.
לקח לי יומיים בערך להפיק קובץ po ריק (שזה בעצם קובץ pot) מתוכנת שורת הפקודה gettext. יש הממממון חומר על זה באינטרנט, ורק 5% אחוזים באמת נותנים דוגמא ממשית (כי זה אמור כאילו להיות פשוט), אבל מה? ה-syntax הוא בלתי ניתן להבנה מהמדריך (רק בניסוי וטעיה) וההערות אודות הטעויות שהתוכנה מחזירה הן פשוט לא קשורות. כל חלק שהתוכנה לא מבינה היא מחזירה:
xgettext: error while opening "blablabla" for reading: No such file or directory
אז אולי יום אחד גם אפרסם מדריך מסודר וארוך על התוכנה הזאת. אבל בינתיים אני מציג כאן את ה-syntax שעבד לי בסופו של דבר, תחת מערכת אובונטו 8.10, עם gettext 0.17.
בטרמינל, הגעתי לספרייה הרלוונטית שבו נמצא הקובץ, ואז הקלדתי:
xgettext -L php *.php –keyword="__" –keyword="_e" –from-code=utf-8 –no-wrap –output=embed-bbpress.po
*שימו לב: לפני כל keyword יש שני מקפים, ולא אחד. מסיבה כלשהי שאינה מובנת לי, העורך הוויזואלי של WP הופך את שני המקפים למקף אחד. חשוב, כיוון שאחרת הפקודה לא תצליח.
זה עבד לי. אם גם לכם יש בעיות, ספרו לי כאן, ואנסה לעזור.
רוצים שכשידלק המחשב, תוכנה מסויימת תופעל אוטומטית? זה מאוד מאוד פשוט.
הולכים למערכת >> העדפות >> תצורת ההפעלה, ובלשונית (Tab) "תוכניות ההפעלה" לוחצים על "הוסף", ומקלידים את הפקודה שתפתח את התוכנה הרצויה (אם אתם לא בטוחים, נסו לפתוח מסוף, ולהקליד את שם התוכנה, 80% סיכוי שזאת היא הפקודה הבסיסית לפתוח את התוכנה).
זהו זה. פשוט, לא?

תוכניות ההפעלה
נבדק תחת אובונטו 8.10 (Intrepid Ibex), אבל אין ספק שזה לא שונה מאוד בכל ההפצות החדשות.