Precision Language Suite

Precision Language Suite היא מערכת תרגום מאוד מעניינת לתכנות חוצה פלטפורמות. בניגוד למערכת מבוססת gnu gettext למשל, המערכת מכילה הרבה יכולות נוספות, כאשר לאחרונה גם כמה מהבקשות שלי נכנסו לשם כחלק מדיון בפרומים, כדוגמת האפשרות לסמן האם שפה מסוימת היא שפה מימין לשמאל או לא, דבר שמקל מאוד על העבודה עם התוכנה, אשר לא צריכה להכיר את כל שפות העולם בשביל לדעת להתאים את הממשק לשפה.

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

התרגום עצמו נשמר בקבצי טקסט קריאים וניתנים לעריכה בכל עת, אך ניתן גם "לשווק" אותם כקובץ בינארי (קובץ מקווץ), או כספרייה משותפת (dll, so). כמו כן, ניתן לקחת תרגום של לקוח ספציפי אשר מתאים לו אישית ו"לדרוס" את התרגום הקיים על ידי טעינת הקובץ שלו במקום קובץ התרגום המקורי, ללא השפעה על התוכנה עצמה.

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

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

11 מחשבות על “Precision Language Suite

  1. ארתיום

    הי עידו,

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

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

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

    אסור לשנות ממשק רק על סמך העובדה שהשפה נכתבה מימיו לשמאל. ראה ערך Gnome – כמה פעמים קורא כי תוכנה כמעט ולא מתורגמת ומופיעה עם Layout מימין לשמאל? המון, יותר מידי.

    אני מעדיף את הפיתרון של Qt ושל KDE – יש מחרוזת מסויימת אם היא מתורגמת כ־"RTL" אז הסימן שהתרגום קיים ואפשר להפוך את ה־Layout של המערכת. זה מאוד חשוב!

    ראה את זה: http://stackoverflow.com/questions/3365753/layout-direction-for-arabic-is-not-determined-based-on-the-locale-mac-and-linux/3385920#3385920

    עכשיו כמה נקודות נוספות:

    צורת רבים

    אני לא מצאתי התייחסות ל"צורת רבים". משהו שגם GNU Gettext וגם Qt וגם OASIS XLIFF (מבחינת פורמט) תומכים בו בצורה מובנית. זה מאוד קריטי, אחרת יהיו לך מחרוזות כמו "ההודעה פורסמה לפני 2 ימים" במקום "ההודעה פורסמה לפני יומיים". שים לב שאם בעברי המצב איכשהו נסבל (בסה"כ צורה זוגית היא די נדירה) בשפות אחרות כמו רוסית בה יש הרבה יותר צורות רבים אז התגרום לא נכון ייראה נורא האיום.

    תרגום בעזרת "מפתחות" ולא מחרוזות

    זה דבר פחות או יותר הגרוע ביותר שאפשר לעשות. בעוד שב-Gettext אתה יכול לכתוב:

    message_box(gettext("You need to create the folder first"));

    בדוגמאות שראיתי מדובר ב:

    message_box(translate("opn_folder_msg"));

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

    מערכות תגרום כאלה מסובכות ודורשות מאמץ הרבה יותר רציני כדי לתרגם אותם.

    ראה הסבר לגבי הבחירה שלי ב-Gettext בתור פורמט תרגום מחרוזות ב-Boost.Locale‏:

    http://cppcms.sourceforge.net/boost_locale/html/tutorial.html#c0c7c76d30bd3dcaefc96f40275bdc0a

    1. ik_5 מאת

      בקשר לתגובת רבים, גם את זה העלתי, וגם היכולת של להתאים זכר ונקבה.

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

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

      1. ארתיום

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

        תראה, אני בין שמבחינה תיאורתית זה יכול להיות שימושי, בפועל, הרבה יותר פשוט יעיל ונגיש לכתוב בשפה אחת שב־99% מהמקרים היא אנגלית בתוך הקוד ואז לעשות תרגום במקביל – הסיבה: ההקשר בין הקוד לטקסט הרבה יותר ברור.

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

        אז אתה יוצר שפה אחרת של "ids" מיוחדים שאף אחד לא מכיר… לא עדיף כבר לבחור id שהוא שפה טבעית?

        תראה, מניסיון שלי, תחזק תרגום ולעבוד עם תרגום המבוסס על ids שלא קשורים לשום דבר מקשה מאוד על התרגום.

        כך שאני אומר מראש… זאת גישה לא נכונה מבחינה לינגוויסיטית (כי יוצרת "שפה חדשה"), מבחינה תכנותית – כי מפזרת הודעה וההקשר שלה.

        לכן, אני חושב שהשיטה היא פשוט לא נכונה – ולא נוחה מבחינת התפיסה.

        אלה היו ההערות של מישהו שמכיר יותר ממערכת תרגום אחת.

        תכל'ס – GNU Gettext היא אחת הטובות ביותר שיש, **למעט הבעיה מאוד גדולה** שהיא מאפשרת רק תרגום אחד לתהליך (בעיה לשרתים שמנסים לספק תרגום למפסק שפות בו זמנית).

        בגלל זה ב־Boost.Locale לקחתי רק את המילונים שלה ולא את ה־runtime שלה. שוב, תקרא את ההיגיון שמאחורי בחירה ב־Gettext ב־Boost.Locale שקישרתי אליו בהודעה לעיל

  2. elcuco

    עידו, תגיד אתה צוחק?

    באמת? מפתחות? מה ההבדל בין זה ובין msg1 וmsg2 שמפתחים ישימו מרב עצלנות? ומה קורה כאשר יש שני תהליכים שמדפיסים הודעה מאוד מאוד דומה, איך אני מתאר אותה?

    או כאשר בתהליך אחד אני צריך להדפיס בהתאם לתנאי אחד הודעות שונות? save_message_1 ואז save_message_2?

    ואיך מתוך הקוד עצמו אני רואה מה המשתמש יראה…. זה היופי שב-gnu get text, הכל נגיש. פה אתה מרחיק את התרגום לשלב מאוחר יותר.

    סליחה – חרא של דבר. לא הייתי נוגע בזה עם מקל באורך מטר.

    1. ik_5 מאת

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

      1. ארתיום

        עידו, סליחה, אבל

        – האם יצא לך לתרגם וגם לפתח איזושהי מערכת גדולה ואמתית עם שיטת המפתחות הזו?
        – האם יצא לך לתרגם וגם לפתח איזושהי מערכת גדולה ואמתית עם שיטת GNU Gettext שבה המחרוזות הן חלק מהקוד?

        באמת, ראיתי מספיק מערכות תרגום, וכרגע ישנו שתי מערכת שבאמת עובדות כראוי – Qt ו־GNU Gettext (אם כי השניה עדיפה מבחינתי)

        1. ik_5 מאת

          לא, אתה היחיד עם הידע והניסיון בכל דבר.

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

          1. ארתיום

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

            בכל אופן, גלבי תרגול מילולי מדוייק, שים לב שמחרוזת לבד אינה מספיקה בד"כ עובדים עם מחרוזת והקשר כמו:

            printf(pgettext("Opening Internet Connection","&Open"));‎

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

          2. ik_5 מאת

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

            resourcestring
            rsOpenningInternetConnection = 'Opening Internet Connection';
            rsOpenCommand = '&Open';

            writeln(rsOpenningInternetConnection, ' ', rsOpenCommand);

            הכוח בשיטה הזו היא שאתה לא תלוי במערכת תרגום, אתה יכול להשתמש במערכת שאתה בונה לבד (אל), אתה יכול להשתמש ב gnu gettext וכו' … אתה לא משנה כלום בקוד שלך בשלב הזה, אתה משנה את זה רק בטעינה של סוג התרגום וקובץ התרגום שאתה טוען.

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

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

          3. ארתיום

            ד"א, כשכתבתי "Open Internet Connection" זה היה "הקשר" שלא מוצג למשתמש אלא מיועד למתרגם בלבד.

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

            מה שאתה תראה, ברגע שתריץ יצירת המילון – Fussy Text שמאוד דומה למקורי – זה מה ש־gettext עושה בשבילך – אגב גם אני נתקלתי בזה.

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

            אבל אני אתן לך לבד לשבור את הראש ולגלות אמריקה מחדש.

            My $0.02

  3. ik_5 מאת

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

    המערכת בנויה בצורה מסויימת. חוץ מעורך תרגום שמגיע איתה (לצערי כרגע רק ב Windows), היא מספקת קבצי טקסט שבהם יש את התרגום.
    המזהה הוא מזהה לתוכנה לא למתרגם ! המתרגם רואה את המחרוזת המקורית, הוא יכול לראות תרגומים נוספים, והוא יכול להכניס בטקסט (עורך טקסט שהוא רוצה, או התוכנה שמגיעה עם המערכת) את התרגום שלו.

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

    אתה לא חייב להאמין לי, אבל אני ראיתי מספיק בעיות בעולם התרגום, גם עם gnu gettext וגם שירדו מזה בגלל אותן הבעיות.

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

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

    אבל אל תקשיב לי, תמשיך לעבוד קשה, אני בנתיים מחפש איך להקל עלי את העבודה. וד"א אם למתרגם מסובך לתרגם, אז לי יש יותר עבודה ולא פחות.

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s