ביקשו ממני שאני אסביר את התהליך של תרגום תוכנות בתוכנה חופשית. כיוון שאין לי על מה לרדת השבוע (טוב יש עוד פוסט בנושא “אני שונא לינוקס” שמתבשל אבל אני צריך לחקור עוד קצת לפני שאני מפרסם), אני אעתר לבקשת הקוראים ואנסה להסביר. שימו לב, זה מתויג בתור “דברים עובדים בלינוקס”, כי אני די מרוצה מהמנגנון הזה, לפחות איך שהוא ממומש בשרתים של KDE.
אני אתעלם מהרבה פרטים בהסברים פה, אין טעם לסבך את הקוראים בפרטים הטכנים כאשר אני מנסה רק להסביר רעיון כללי. מי שרוצה, שישאל בפרטי. אם אני לא אתעצל ותהיה לי סיבה טובה לענות – אני אענה על שאלות.
שלום עולם
נתחיל מתוכנית פשוטה:
int main()
{
printf( tr( "Hello world" ) ) ;
return 0;
}
עכשיו, בעזרת הפקודה xgettext נוציא מתוך הקובץ את התבנית לתרגום, קובץ myfile.pot . כדי ליצור את התרגום, נעתיק את הקובץ אל קובץ חדש בשם myfile-he.po (שימו לב, בלי t בסוף). אותו נתרגם בעזרת kbabel. יפה, שלב ראשון הבנו.
נעים להכיר
טוב, יצאה גרסה שנייה לתוכנית שלנו, ונוספה מחרוזת חדשה.
int main()
{
printf( tr( "Hello world" ) ) ;
printf( tr( "Nice meeting you" ) ) ;
return 0;
}
עכשיו בקובץ שלנו חסר לו תרגומים. כאשר נייצר את התבנית, נגלה שיש לה שתי מחרוזות ואילו בתרגום שלנו יש רק אחת. בעייה, איך ממזגים?
בגדול, מייצרים את התבנית מחדש, ואז משתמשים בתוכנית msgmerge. אם מעבירים לה פרמטרים נכונים, היא תעדכן את הקובץ המתורגם שלנו ותוסיף לשם מחרוזת ריקה שצריך לתרגם. מפעילים את kbabel ומסיימים את התרגום. יפה, שלב שני הבנו . אנחנו חכמים.
אופס…
מי שיודע “טיפה” C, ישים לב שהתוכניות הללו די שבורות, הן למעשה מדפיסות את הטקסט באותה שורה ושתי הטקסטים יוצאים צמודים בלי רווח ביניהם. אני רציתי שיהיה מעבר שורה ביניהם. גרסה שלישית לתוכנה שלי.
int main()
{
printf( tr( "Hello world\n" ) ) ;
printf( tr( "Nice meeting you\n" ) ) ;
return 0;
}
עכשיו, כאשר נייצר את התבנית נקבל שתי מחרוזות. אבל, הן לא אותן מחרוזות שיש בתרגום שלנו. מה יקרה כאשר נמזג?
מה שיקרה, זה שמערכת המיזוג תשים לב שהמחרוזות שיש בקובץ המתורגם “מספיק דומות”, ותסמן את התרגומים בתור “פאזי” – fuzzy (לפי דעתי פאוזי היה צריך לנצח שנה שעברה, ולכן אני אשאיר את זה בעברית – פאזי). במחרוזת : "Hello world\n"
תשתמש בתרגום של "Hello world"
והמחרוזת תסומן בתור פאזי. טוענים את התרגום החדש אל kbabel ומתקנים את הפאזי – מוסיפים מעבר שורה בסוף כל מחרוזת שיש בקובץ.
יש עוד סיבות יצירה של פאזים. בתחילתכל מחרוזות יש הערה שאומרת מאיזה קובץ נלחקה המחרוזת. היא עוזרת כאשר התרגום לא ברור – והדרך היחידה היא לגשת לקוד של התוכנה כדי להבין מה זאת המחרוזת הזאת. אם ההערה תשתנה יותר מדי (למשל המחרוזת עברה לקובץ C אחר) המערכת לא תזהה את המחרוזת המקורית, ובתור ניחוש תשאיר אותה בתור פאזי.
עוד סיבה היא ניחושים. המערכת מכילה בסיס נתונים של תרגומים, ואם היא מצאה מילה מתאמה היא תשלים אותה עבור המתרגם, אבל תסמן בתור פאזי. אף פעם, לא לסמוך על החלטה של מכונה בתחום הזה, תמיד לבדוק.
אפשרות נוספת היא המתרגם. נניח יש מחרוזת שהוא לא ברור לגביה – לפעמים הוא יתרגם וייסמן בתור פאזי. מין תזכורת “יא טמבל, אל תשכח את זה”.
המשך
בגדול, גדול מאוד, זה התהליך שבו נוצרים תרגומים. השמטתי הרבה פרטים, כדי להבהיר את שיטת העבודה מצד המתרגם. מי שמפתח – שישבור את הראש ויקרא מדריכים אודות gettext, הבלוג הזה קצר מכדי להסביר אפילו בקצרה איך המערכת הזאת עובד.
בהמשך, עבודה עם kbabel. יש כמה טריקים שחייבים להעביר.