בדיקת תרגום אוטומטית
נכתב ב-19 במאי 2007, 13:01 | על-ידי לירון | קטגוריות: כללי
6
מי מאיתנו שמתרגם תוכנות (בעיקר חופשיות, אבל אני מניח שגם קנייניות) נתקל בוודאי בבעיית ווידוא השלמוּת – יוצאת גרסה חדשה של התוכנה, והגיע הזמן לעדכן את התרגום. מה עושים?
אז אם זאת תוכנה שמשתמש ב-gettext, אז יש תוכנות כמו poEdit שעושות את העבודה בשבילך, אבל לצערינו, הרבה מאוד תוכנות, בעיקר webיות, משתמשות בפורמטים משל עצמן בשביל קבצי תרגום, בין אם קבצי טקסט בתבנית כלשהי, או קבצים של סקריפט בשפה שהתוכנה כתובה (JavaScript, PHP, Perl וכו') שמכניסים את ערכי השפה כקבועים. אז מה עושים?
אני נתקלתי בבעיה הזו ב-TinyMCE, שהיא רכיב פופולרי לעריכה עשירה בווב (שאגב, גם וורדפרס משתמשת בו), שכתוב ב-JavaScript ולכן גם קבצי השפה שלו הם קבצי JS. הפתרון: לכתוב תוכנה!
אז כתבתי סקריפט, שקראתי לו TinyMCE Translation Checker (או TMTC בקיצור), שעובר על קבצי התרגום ובודק, בגדול, שני דברים:
- מבנה – שהקובץ בנוי נכון מבחינת שפת התכנות, שאין איזה פסיק שלא צריך או משהו. הבדיקה הזו לא מושלמת – היא באה רק לתפוס טעויות נפוצות.
- שכל מונחי התרגום המצאים שם, ורק הם – הסקריפט משווה מול שפת המקור (אנגלית), כדי לבדוק אם תרגמת את כל הערכים שקיימים, שם, וכ"בונוס" בודק גם שאין ערכים מיותרים שתורגמו (למשל, מונח שהיה בשימוש בגרסה הקודמת ובוטל).
למה זה מעניין אתכם? אני מניח שאף אחד לא ירצה לתרגם את TinyMCE שוב לעברית, ומתרגמים לשפות אחרות לא ימצאו את הטקסט העברי פה בבלוג שלי. מה שכן יכול להיות מעניין, זה התאמה של הסקריפט שלי למערכות אחרות.
מכיוון שכמעט כל הבדיקות נעשות בעזרת Regular Expressions למציאת המחרוזות המתאימות, אני חושב שבלא-יותר-מדי עבודה אפשר להתאים את הסקריפט לבדיקה של קבצי שפה של הרבה תוכנות אחרות. אני אפילו אשים כאן לינק לדף של מיקרוסופט של RegEx ב-VBScript, שיהיה לכם קל. אני רק מבקש שתספרו לי מה עשיתם, ואם זה עזר לכם. בהצלחה!
אפשר קצת פירוט לגבי מבנה הקובץ של התוכנה?
כשאין כלים מתאימים, אני משתמש בעיקר ב־diff, זה עושה את העבודה מצויין, ומאפשר להשוות אפילו בין גירסאות שונות של קובץ המקור. אני משתמש ב־meld כי הוא עושה את העבודה צבעונית וברורה.
מבנה הקובץ של איזו תוכנה? של TinyMCE? תוריד אותה מהאתר שלה ותראה שם…
ולגבי הסקריפט שלי, הוא די ברור, אני חושב, יש שם הערות בקוד והכל. כמובן שאני אשמח לענות על שאלות, אם יש.
עד שכתבתי אותו, שיטת העבודה שלי היתה כזו:
1. לפתוח את הגרסה החדשה של התוכנה, עם קבצי השפה החדשים באנגלית.
2. להשוות עם WinMerge בין קבצי האנגלית החדשים לאלה בגרסה האחרונה שתרגמתי.
3. לעדכן את קבצי התרגום העברי בהתאם.
הבעיה בשיטה הזו היא שאתה עלול לפספס קבצים שהפסיקו להשתמש בהם ולהשאיר אותם בתרגום שלך, וגם שאם אתה "מתרשל" ולא מתרגם כמה גרסאות, אתה עלול לשכוח מול איזו גרסה אנגלית להשוות את הגרסה העברית שלך. חוץ מזה, היא פשוט מסורבלת… אתה בעצם בודק משהו שקשור רק בעקיפין לקובץ שאתה עובד עליו, במקום לבדוק ישירות אם בקובץ שאתה עובד עליו יש את כל הערכים שצריכים להיות בו.
לדעתי ניתן לחלק את קבצי התירגום למספר סוגים עיקריים:
קוד – המחרוזות מוצבות לתוך משתנים, והתוכנה פונה אל המשתנים לצורך הצגת המחרוזות. אפשר לחלק את השיטה לשני סוגים – מחלקת תרגום ומשתנים עצמאיים. tinymce עובד עם מחלקה, בעוד קיימות לא מעט תוכנות שעובדות בצורה השנייה.
קובץ תרגום – קובץ נפרד שמתלבש על המחרוזות הקיימות. קיימים סוגים רבים למבנה הקובץ, החל מקבצי po של gettext, ועד קבצי dtd של מוזילה.
אם תתמוך בתרגום על בסיס קוד, בשתי הצורות שציינתי תכסה את מרבית התוכנות הקיימות בסביבת ג'אווה־סקריפט.
כדאי גם שתכניס לתסריט הכנסת הערות בראש הקובץ, כדי שהמתרגם יוכל לדעת ישר לאיזו גירסה של התוכנה מתאים הקובץ, מי תירגם ומתי, ואיך אפשר להשיג אותו.
אני לא רואה את הבעיות שתיארת בשימוש של diff. אני עושה diff לתיקיות שלמות, ואז רואה קבצים שהוסרו, קבצים שהשתנו (גם קבצי תמונה לצורך העניין), ואת המחרוזות שצריך לעדכן. ברגע שעושים diff לשתי גירסאות מקור, אפשר לזהות באופן מהיר את השינויים שבוצעו במקור עצמו, ולהתאים את התירגום אל המקור המחודש. אני לא מכיר דרך פשוטה יותר לזהות שצריך לעדכן מחרוזות בתירגום מבלי לעשות השוואה בין גירסאות מקור.
meld מאפשר לעשות השוואה על שלושה קבצים במקביל, ובכך להשוות שתי גירסאות מקור לגירסה המתורגמת. באופן דומה אפשר לעשות diff משולש גם על תיקיות, ולראות ישר איפה צריך להשקיע עבודה.
הסקריפט שלי די בסיסי – הוא לא יודע על איזו גרסה של התוכנה מדובר, וזה לא משהו שאפשר להשיג באופן גנרי עבור כל תוכנה, ואני לא רוצה להתאים אותו ידנית עבור המון תוכנות. אולי רק אלו שאני אתרגם… מה שכן, אולי כדאי לי לבנות אותו כך שהוא יהיה יותר ידידותי לשינוי ע"י מתרגמים אחרים.
אני לא חושב שאני אעשה תמיכה מראש בתרגום על בסיס קוד, בעיקר כי אין לי סבלנות לכתוב את ה-Regexים המגעילים האלה.
אם תשים לב, בגרסה הזו הסתמכתי על מבנה מסוים של קבצי התרגום, עם מגבלות שלא מגיעות דווקא מ-JS אלא מאיך שהמתכנת בנה את קבצי הדוגמא, ובאותו אופן, לא בדקתי את כל התחביר של הקובץ, אלא רק את "נקודות התורפה" שבהן מתרגמים עלולים ליפול (ז"א באזורים שהמתרגם עורך, ולא באזורים שהוא לא נוגע בהם).
לגבי diff וכו', כנראה שאנחנו פשוט עובדים עם זה שונה…
ואגב, שני דברים שיכולים להיות ממש מגניבים:
1. עורך כמו poEdit שפשוט יזהה מחרוזות בקבצי שפה ויתן לך לתרגם אותן ואז ישמור את התוצאה לקבצים באותו מבנה עם שם אחר. זה די גנרי, מתאים כמעט לכל תוכנה שלא משתמשת ב-po.
2. דבר ממש שווה יהיה אם תהיה תוכנה כלשהי שתוכל לתרגם איתה יישומי ווב דרך הממשק – היא תחליף את כל המחרוזות במזהים יחודיים שלה, ואז בדפדפן היא תחליף אותם בחזרה בעזרת JS לטקסט האנגלי. כשתלחץ עליו, תיפתח תיבת טקסט שבה תוכל למלא את הערך בשפה שלך. ככה תימנע בעיית ה"תרגום בקונטקסט" שגורמת לדברים כמו פעלים במקום שמות, וכו'.
השני לא צריך להיות קשה במיוחד בבסיסו, אבל יש יותר מדי באגים פוטנציאליים מכדי שאני ארצה להכנס לזה. פשוט להריץ החלפת RegEx על כל ה-DOM אחרי שהוא גמר להטען (כולל כל JS שהוא שאמור לעלות), דרך תוסף לשועל, למשל.
הרעיון השני מצויין, אבל אני לא יכול לחשוב על תוכנות שיכניסו עבורן קוד כדי להקל את זיהוי המחרוזות במקור.
אולי אפשר לפתור את זה בשיטת Google Notes – להציג חלון קטן על הדף, כאשר באמצעות לחיצה על הטקסט בדף הוא יועתק למקום כלשהו במסך התירגום, ויאפשר לתרגם תוך־כדי צפייה במחרוזת המקור בדף. לאחר מכן, התוכנה "תלחים" את המחרוזות המתורגמות למקום מתאים בקובץ התירגום.
זה מסובך מידי. קח משהו פשוט שגם יעבוד טוב. תוסיף לתסריט שלך אפשרות לעבור על כל המחרוזות ולהוסיף להן מספר רץ שיאפשר את זיהוי המיקום שלהן בתוכנה ("{42} ביטול (Ctrl-Z)"), וכך אפשר יהיה לזהות איפה המחרוזת נמצאת בשימוש בתוכנה.
זה יאפשר זיהוי קל יותר, נכון, אבל זה עדיין מסורבל. צריך משהו שיהפוך את זה לאוטומטי איכשהו, אם רוצים לעשות משהו באמת חדשני.
אפשר לעשות סקריפט שיקח את כל המחרוזות מהקובץ, יחליף אותן במזהה יחודי כלשהו, ויפלוט את זה לקובץ של מזהה=מחרוזת מקור. אחרי שתעלה כל "מסך" של התוכנה, תלחץ על איזה כפתור בשועל שיחליף בחזרה את המחרוזות, עם לינקי JS שיעדכנו את התרגום בעזרת AJAX. כמו שאמרת, זה מסובך, אבל זה יכול להיות ממש שווה.