Gezer/דגשים/WineOld

מתוך ויקי עמותת המקור

מדריך התרומה והעריכה של Wine

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

מהי Wine?

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

Wine מספקת פתרון להרצת תכניות Windows כחלק מסביבת העבודה הלינוקסית שלך (ולמגוון מערכות נוספות), כלומר שהחלונות יופיעו אולי בעיצוב קצת שונה אבל יתפקדו בדומה לשאר החלונות בסביבת העבודה שלך (גרפית כמובן :) ).

ניהול הקוד של Wine

Wine מנוהלת במערכת גרסאות מסוג Git ואינה מקבלת Patches ו־Commit באופן אוטומטי, לכן עלינו להכין Patch כפי שיוסבר במדריך זה ולשלוח אותו לרשימת התפוצה המיועדת לכך לסקירה.

ה־Patches נסקרים ונבדקים על ידי מנהל המיזם אלכסנדר ג׳וליארד (Alexandre Julliard) ונוספים לעץ הפיתוח בהתאם להחלטתו.

לצפייה בקוד דרך מערכת מבוססת דפדפן ניתן לבקר בכתובת: http://source.winehq.org/git/wine.git/

כדי לעבוד על קוד המקור של Wine עלינו להוריד אותו למחשב, במסוף ניגש לתיקייה שתחתיה נרצה לעבוד על Wine ונפעיל את הפקודה הבאה:

לאחר מספר דקות (בהתאם למהירות החיבור) תופיע התיקייה wine תחת התיקייה עליה אתם עובדים כעת ובה קוד המקור.

מומלץ להדר (compile) את קוד המקור מיד לאחר ההורדה כדי לאפשר הידור מהיר יותר לשם בקרת איכות.

ניתן לעשות זאת באמצעות רצף הפקודות:
(יש להתעלם מהשורה הראשונה אם כבר נכנסתם לתיקיית קוד המקור)

$ cd wine
$ ./configure
$ make

את התכניות והספריות שיש לתרגם ניתן למצוא בשתי תיקיות:

  1. programs
  2. dlls

חלק מהתכניות צריכות להישאר בלתי מתורגמות, בגדול כל המחרוזות המיועדות להצגה במסוף אמורות להישאר לא מתורגמות (על אף שמסוף wineconsole תומך בעברית), ניתן לצפות ברשימה המלאה בכתובת: http://source.winehq.org/transl/lang.php?branch=master&lang=00d%3A01

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

לאחר שבחרנו משאב שתרגומו חלקי או חסר עלינו להביט ברשימה בנתיב המלא של היישום:

programs/notepad

יימצא בתיקייה notepad שתחת programs וכן הלאה.

מהות קובצי ה־RC

התוכנות ב־Wine משתמשות בקובצי RC לצורכי הצגת מנשקים (בתכניות ‎.NET‎ משתמשים במבנה קובץ אחר שנקרא ResX).

קובצי ה־RC מכילים מספר הגדרות:

  1. ממדי ותכונות החלון והפקדים
  2. הטקסט שיופיע על כל אחד מאלה

קובץ RC יכול להכיל הנחיות למספר חלונות גם יחד.

טיפול בקובצי RC

קובץ RC יכול להופיע בשתי צורות:

  1. ‎<appname>_Xx.rc
  2. Xx.rc

כאשר <appname> הוא שם ייצוגי של התכנה (לא תמיד השם הרשמי) ו־Xx הוא קוד השפה לפי תקן ISO-639-2, כאשר הקוד לשפה העברית הוא He, לצורך הבדלה הקוד המייצג את השפה האנגלית הוא En.


במדריך זה נדון במנשק המשתמש של התכנית Help Viewer (מציג העזרה — winhlp32) של Wine ובאמצעותה נדגים כיצד יש לתרגם תכנה לעברית.

את הקובץ ניתן למצוא כאן או בתיקייה programs/winhlp32/‎ בקוד המקור שהורדנו.

כדי לעבוד על עותק עברי של הקובץ אנו נעתיק את En.rc ל־He.rc (ניתן באמצעות הפקודה cp En.rc He.rc במסוף כאשר נמצאים בתיקייה הרלוונטית).

ראשית עלינו לפתוח את קובץ ה־He.rc שהעתקנו מהגרסה האנגלית בעורך המועדף עליכם (המועדף עלי הוא gedit).

ובכן במבט חטוף על הקובץ מיד ניתן להבחין שהוא מתחיל בהערה:

/* 
* HTML Help resources
* English Language Support
*
* Copyright 2005 James Hawkins
*

כאן כבר מופיעים מספר נתונים מעניינים — ראשית: שם התכנית, היכרות עם הקובץ תעזור לנו בתרגומו מכיוון שפעולתו מובנת לנו.

לאחר מכן בשורה השלישית מופיע שם השפה, כיוון שאנחנו מתרגמים לשפה זרה עדיף שנשנה את זה לשפה אליה אנחנו מתרגמים, במקרה זה — Hebrew.

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

דוגמה לאחר השינויים המבוקשים:

/* 
* HTML Help resources
* Hebrew Language Support
*
* Copyright 2005 James Hawkins
* Copyright 2010 Yaron Shahrabani <[email protected]>
*

המשך ההערה הוא הכרזת ה־GPL (לא הרישיון עצמו) ולאחריו השורות הבאות:

#include "resource.h"
 
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
  • שורת ה־#include בעצם מאפשרת לקובץ המשאבים לגשת לספריות הקוד של השפה שבה הוא נכתב (C במקרה הזה), לנו כמתרגמים זה לא רלוונטי ואין לשנות שורה זו.
  • לאחר שורת ה־#include עלינו להוסיף שורה שמכריזה על קידוד הקובץ הנ״ל, במקור חלק מהתכניות ב־Windows נכתבו בקידוד cp1255/Windows-1255 אך כדי להרחיב את התמיכה והתאימות הוחלט ב־Wine שכל התכניות יתורגמו ביוניקוד כדי לאפשר תאימות מלאה בין השפות.
  • כדי להכריז על הקידוד בו אנו רוצים להשתמש נוסיף את השורה ‎#pragma code_page(65001)‎ בין השורות האלו ולשם האסתטיקה מומלץ להוסיף רווח לפני השורה ולאחריה.
  • בשורה הבאה מופיעה הכרזת השפה של המשאב, ההגדרה LANGUAGE מגדירה את השפה עצמה ואילו SUBLANG מגדירה ניב של השפה, לדוגמה: פורטוגזית ברזילאית. במקרים מסוימים מדובר בהבדלים בין מערכות הכתב של השפות, לדוגמה: סרבית קירילית או סינית מסורתית.

כיוון שעברית מדוברת היא אחידה נוכל להשתמש בצורות: SUBLANG_DEFAULT או SUBLANG_NEUTRAL המגדירות את התרגום שלנו לכל צורות העברית באשר הן (אם יתווספו ניבים בעתיד אלו יושפעו גם כן מהתרגום הזה).

עלינו לשנות את השורות בהתאם באופן הבא:

#include "resource.h"
 
#pragma code_page(65001)
 
LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT

עברנו את שורות הכותרת, כעת נעבור לקוד.

STRINGTABLE
BEGIN
    IDS_CONTENTS     "&Contents"
...

STRINGTABLE כשמה כן היא טבלת מחרוזות, BEGIN היא ההכרזה על תחילת הטבלה ובשורה שלאחריה מופיעה המחרוזת הראשונה שעלינו לתרגם: ‎&Contents, ב־Wine (ובתכניות Windows רבות) תו הסימון למקשי האצה הוא &, מקש זה יופיע עם קו תחתי, לפרטים נוספים ניתן לקרוא את המדריך על מקשי האצה.

בהמשך מופיעות מחרוזות באותו האופן,יש לתרגם באותה השיטה.

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

בחרתי ביישום wineboot שנמצא תחת programs/wineboot/‎ וניתן לצפות בו דרך כאן.

נדלג על שורות הכותרת ונעבור את הגדרת השפה עד שנגיע להגדרת החלון הראשונה שמופיעה מיד לאחר מכן:

IDD_ENDTASK DIALOG  0, 0, 186, 71
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Waiting for Program"
FONT 8, "MS Shell Dlg"
BEGIN
    DEFPUSHBUTTON   "Cancel",IDCANCEL,129,49,50,15
    PUSHBUTTON      "Terminate Process",IDOK,51,49,71,15
    LTEXT           "A simulated log-off or shutdown is in progress, but this program isn't responding.",
                    IDC_STATIC,7,7,172,19
    LTEXT           "If you terminate the process you may lose all unsaved data.",
                    IDC_STATIC,7,28,172,15
END

נראה מעט מפחיד לא? מיד יתבהר הכול.

  • השורה הראשונה לא מעניינת אותנו במיוחד, לאחריה מופיע שורת הסגנון, בשורה זו (הנפתחת במילה STYLE) מופיעות כל מיני הגדרות חזותיות לחלון (האם הוא ימורכז, האם תהיה לו כותרת, האם זהו חלון מערכת וכן הלאה).
  • השורה הבאה היא שורת הכותרת הנפתחת במונח CAPTION, מה שמופיע בין המירכאות יופיע בשורת הכותרת של החלון.
  • בשורה שלאחריה נוכל לראות את הגדרת הגופן לחלון, FONT 8 משמעו שהגופן שישמש להצגת הטקסט בחלון יהיה בגודל 8, במירכאות שלאחר מכן מצוין שם הגופן, חשוב מאוד לא לשנות זאת על אף תקלת העברית הקיימת נכון לכתיבת שורות אלו ולו כדי לשמור על אחידות עם שפות זרות.
  • השורה הבאה דומה לשורה שראינו קודם ב־STRINGTABLE והיא BEGIN המציינת תחילת הגדרת פריט (במקרה שלנו).
  • השורה הבאה כבר אחראית להצגת לחצן הביטול, ניתן לתרגם את המילה Cancel המופיעה בין המירכאות, לאחר המירכאות מופיעות הגדרות חזותיות של גודל הלחצן ומיקומו בחלון, ב־Wine הנחו אותי מפורשות שלא לגעת בזה, יתכן שיש לכך סיבה מספיק טובה.
  • נחזור על השיטה עד ל־END וחוזר חלילה.

דבר מיוחד שעלינו לעשות לחלונות אלו לעומת רוב השפות הוא להוסיף הגדרת שיקוף החלון ל־RTL, את ההגדרה הזו עלינו להוסיף לאחר שורת ה־STYLE ובמקרים בהם שורת ה־STYLE מתפרסת לשתי שורות אז לאחריהן.

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

הגדרת השיקוף ל־RTL עבור החלון נראית כך:

EXSTYLE WS_EX_LAYOUTRTL

לכן לאחר השינוי השורות אמורות להיראות כך:

IDD_ENDTASK DIALOG  0, 0, 186, 71
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_LAYOUTRTL
CAPTION "Waiting for Program"


לאחר שסיימנו את המחרוזות (כמעט לגמרי) נבחין כי אחת השורות האחרונות של הקובץ היא:

LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL

בשביל מה צריך להכריז שוב על השפה? מוזר, נכון? אל חשש, יש הסבר, קודם לכן במסמך דנו ב־SUBLANG רק שבשורה הנדונה הופיע: SUBLANG_DEFAULT ולא SUBLANG_NEUTRAL כמו כאן, אם כן לשורה זו יש תפקיד שונה.

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

כיוון שיש הבדל בין המילה Favorite ל־Favourite נוספה לקובץ הגדרת שפה שמתמודדת עם הבעיה הזאת ומציגה לכל דובר את המילה המועדפת עליו לפי בחירתו.

מה כדאי לעשות עם השורה הזאת? פשוט מאוד, יש למחוק את השורה כולל כל השורות שלאחריה ללא שום הסתייגויות.

כעת נוכל לשמור את הקובץ.

סיימתי לתרגם את ה־RC, מה עכשיו ?

מספר דברים, הבה ונמנה אותם:

  1. הוספת השפה ל־Makefile.in.
  2. הידור קובץ ה־RC, כדי לבדוק שהתחביר והקידוד תקינים.
  3. הידור כללי כדי לבצע אבטחת איכות.
  4. הרצה כדי לוודא שהקובץ אכן מתורגם ועובד כמצופה.
  5. הכנת Patch.
  6. שליחת ה־ Patch בחזרה למיזם.

הוספת השפה ל־Makefile.in

נאתר את הקובץ בתיקייה בה תרגמנו את ה־RC ונפתח בעורך הטקסט המועדף עלינו (במקרה הזה המועדף עלי הוא nano, חסכוני בצורה מסוימת).

ניתן לראות את קובץ ה־Makefile.in של wineboot כאן.

נחפש את הביטוי RC_SRCS = \‎, לאחריו מופיעים שמות קובצי ה־RC של השפות השונות, כיוון שהתרגום לעברית הוא חדש לגמרי יש להוסיף אותו במקום הראוי לפי סדר האלפבית.

בקובץ המקושר העברית מופיעה בין צרפתית לאיטלקית (Fr ו־It).

הידור קובץ ה־RC

ישנן מספר שיטות:

  1. להדר את קובץ ה־RC באמצעות הפקודה make <appname>_He.res או make He.res, נא לשים לב כי הסיומת היא res ולא rc.
  2. להדר את היישום כולו על ידי הפעלת make בתיקייה המיועדת.
  3. להדר את כל wine על ידי הקלדת הפקודה make בתיקייה הראשית של wine.

השיטה השלישית היא המומלצת ביותר, במיוחד למחשבים מהירים.

הידור כללי לביצוע אבטחת איכות

צעד זה אינו מחייב אך כדאי לבצע אותו אם נרצה לבצע אבטחת איכות לתרגום.

נא לשים לב שאם כבר הידרתם את כל Wine בשלב הקודם אין טעם בביצוע פעולה זו.

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

הרצה לאבטחת איכות

כדי לבדוק את התרגום שזה עתה הידרנו נוכל להשתמש בגרסה עליה אנו עובדים של Wine, כלומר שיש לנו אפשרות להריץ את גרסת ה־Wine מולה אנו עובדים גם מבלי להתקין אותה ובאמצעותה לבדוק את התרגומים.

לאחר שהידרנו, נוכל להפעיל את התכנית שתרגמנו בעזרת ה־Wine שהידרנו מקוד המקור, בתיקיית היישום המתורגם.

כדי לעשות זאת נפתח את המסוף ונגיע לתיקיית השורש של קוד המקור של Wine ונקליד את הפקודה הבאה:

$ LANG=he_IL.utf8 ./wine path/to/file.exe.so

כאשר path/to/file.exe.so יוחלף במקרה של Winhlp32 ל־programs/winhlp32/winhlp32.exe.so, לכל יישום יש את קובץ ה־exe.so משלו ויש לברר מהו ומה מיקומו לפני הפעלת הפקודה.

כאשר התרגום עדיין מופיע באנגלית משמעות הדבר היא שה־locale בשם he_IL.utf8 אינו קיים במחשב שלכם, תקלה זו נגרמת כאשר חבילת השפה העברית אינה מותקנת, כדי לתקן זאת ניתן להתקין את חבילת השפה העברית או להקליד את הפקודה:

$ locale-gen he_IL.utf8

לאחר יצירת ה־locale נוכל לשוב ולהפעיל את פקודת הפעלת ה־exe.so.

הכנת Patch

לאחר שסיימנו וראינו שהכול עובד ושהתרגום מובן ותקני עלינו לשלוח את התרגומים בחזרה, כפי שנאמר קודם לכן, אין אפשרות להשתמש ב־push כדי לעשות זאת כיוון שרק לאלכסנדר יש הרשאות ולכן ניאלץ ליצור Patch.

כיוון שביצענו שינויים בקובץ ה־Makelfile.in נוסיף אותו ל־commit (מסירה) ולאחריו נוסיף את קובץ ה־RC (הסדר אינו מחייב כלל) באופן הבא:

$ git add Makefile.in
$ git add {<appname>_He|He].rc

במקרה של winhlp32 שם הקובץ יהיה: He.rc ואילו במקרה של wineboot יהיה שם הקובץ: wineboot_He.rc.

אחת הדרישות של צוות Wine היא לא לשלוח יותר מקובץ אחד ב־commit, המקרה של הוספת שפה הוא מקרה חריג בו מותר לשלוח שני קבצים יחד אבל לא יותר מזה, בעת עדכון קובצי שפה יש לשלוח כל עדכון לקובצי ה־RC ב—patch נפרד.

לאחר שעשינו את שתי הפעולות האלה כל שנותר לנו הוא להכין את ה־commit ואת ה־patch, הפקודה להכנת ה־commit היא:

$ git commit -m "appname: Added Hebrew translation."

הפרמטר ‎-m מציין את הערת ה־commit, היא תופיע לאחר מכן בעץ ה־git (במידה שיאושר).

שאר הפרמטרים כמו ‎--author=‎ יושלמו אוטומטית ושמכם יופיע בעץ לאחר השחרור (השם מוגדר כבררת מחדל ב־git והוא זה שיופיע בהשלמה האוטומטית).

כעת נכין את ה־patch באמצעות הפקודה:

$ git format-patch --keep-subject -o out origin

קובץ ה־patch יופיע בתוך התיקייה out תחת התיקייה הנוכחית, בתיקייה out יופיעו כל ערכות ה־commit שלא מוזגו עם העץ.

שליחת ה־Patch בחזרה למיזם

הערה: כיוון שכל התרגומים נערכו על ידי עד כה אבקש להתייעץ אתי לפני השליחה כדי שנוכל לתאם מונחים ותקינה מגדרית ובכך לשמור על האחידות.

את ה־patch יש לשלוח לרשימה המקבלת אותם, אך לפני כן יש להירשם אליה כי אחרת ההודעות שלכם לא יתקבלו באופן מיידי וידרשו אישור מנהל, לכן מומלץ להירשם דרך כאן ורק לאחר מכן לשלוח את ה־patch לכתובת [email protected].

לסיום

נסקור בקצרה את השלבים שביצענו:

  1. הורדנו את עץ הפיתוח (אם עוד לא עשינו זאת)/עדכנו את עץ הפיתוח (אם כבר הורדנו אותו בעבר)
  2. בחרנו תכנית לתרגום
  3. תרגמנו את קובץ ה־RC שלה (כדאי לעבור פעמיים כדי לוודא שלא שכחנו להוסיף משהו חיוני)
  4. הוספנו את הקובץ שתרגמנו ל־Makefile.in
  5. הכנו commit משני הקבצים (קובץ ה־RC וה־Makefile.in או רק ה־RC אם מדובר בעדכון תרגום קיים)
  6. הכנו patch מה־commit
  7. שלחנו מייל לרשימת התפוצה wine-patches

כדי לעקוב אחר מצב התרגום לעברית יש לנו את הדף הבא: http://source.winehq.org/transl/lang.php?branch=master&lang=00d%3A01

כדי לבדוק אם ה־patch שלנו עבר את הביקורת והגיע לעץ: http://source.winehq.org/git/wine.git/