בינה מלאכותית וטכנולוגיה
איך לתרגם כתוביות SRT בלי לאבד חותמות זמןלמה תרגום כתוביות הוא עבודה שדורשת דיוק קובץ SRT הוא פורמט מובנה בקפדנות. כל בלוק כתוביות מכיל מספר סידורי, טווח חותמות…
Amanda Lee
קובצי שפה בפורמטים PO, YAML, .properties, RESX, XLIFF ו-JSON נראים כמו רשימות של משפטים, אבל רק הערכים הם טקסט. המפתחות הם מזהים שהקוד מחפש; מצייני המיקום הם משבצות שהקוד ממלא בזמן ריצה; רצפי הבריחה והתגיות הם תחביר שהמנתח (parser) תלוי בו. מתרגם שמתייחס לכל השורה כטקסט ייצור קובץ שנקרא נהדר ולא נטען, או נטען ואז קורס בפעם הראשונה שמסך כלשהו מעצב מספר. התקלה בדרך כלל מופיעה בשפה אחת בלבד, ולכן זה סוג הבאג הקשה ביותר לתפוס בסקירה.
באנגלית יש שתי צורות ריבוי, ולכן מפתה לחשוב שכך בכל שפה. המדריך של GNU gettext מראה למה זה נכשל: כל שפה מצהירה על כלל Plural-Forms משלה, האנגלית משתמשת ב-nplurals=2, והרוסית צריכה שלוש צורות שנבחרות לפי הספרות האחרונות של המספר. קובץ PO שתורגם לרוסית ובו מולאו רק שתי צורות עובר קומפילציה, רץ ומדפיס דקדוק שגוי לכל כמות שמסתיימת ב-2, 3 או 4. טיפול נכון בריבוי פירושו לייצר את מספר רשומות msgstr שדורשת שפת היעד, ולא את המספר שבמקרה היה לשפת המקור.
סדר המילים שונה בין שפות, ולכן משפט עם שני ערכים צריך לעיתים קרובות למקם אותם בסדר הפוך. מצייני מיקום לפי מיקום כמו %1$s ו-%2$s, או מצייני מיקום בעלי שם כמו {count} ו-{user}, קיימים בדיוק בשביל זה: התרגום רשאי לשנות את סדרם, אבל כל אחד מהם חייב עדיין להופיע בדיוק פעם אחת. מצייני מיקום אנונימיים, כמו %s חשוף, אי אפשר לסדר מחדש בבטחה — וזו בעיה שכדאי לתקן במחרוזות המקור לפני התרגום ולא אחריו.
לכל פורמט יש מלכודות משלו. ב-YAML, המפרט מעניק לבלוק מילולי (|) ולבלוק מקופל (>) התנהגות שונה של שבירת שורות, ועוגנים (&) וכינויים (*) מאפשרים לצומת אחד להשתמש מחדש באחר, ולכן שניהם חייבים לעבור ללא שינוי. XLIFF 2.1 עוטף את העיצוב המקורי ברכיבים מוטבעים כמו <ph> ו-<pc>, שהתרגום חייב לשמור במקומם סביב המילים הנכונות. ב-.NET, משאבי RESX נמצאים לפי שם בזמן ריצה עבור תרבות ממשק המשתמש הנוכחית, כך שרכיב data ששמו שונה חוזר בשקט לשפת ברירת המחדל. וקובץ .properties של Java מתייחס לתו =, : או לרווח הראשון שאינו מוברח כמפריד המפתח, כך שנקודתיים תועות במפתח מתורגם מפצלות אותו לשניים.
כמעט תמיד מפני שמציין מיקום שונה רק בשפה הזו — שמו שונה, הוא הושמט או שוכפל. הקוד מעביר את אותם ארגומנטים לכל השפות, ולכן התרגום היחיד שכבר לא תואם להם נכשל כשהמסך הזה מעוצב.
כללי ריבוי שייכים לשפה, לא לתוכנה. Gettext מאפשר לכל שפה להצהיר על כלל משלה; הרוסית בוחרת בין שלוש צורות לפי הספרות האחרונות של המספר, ולכן תרגום עם שתי צורות בלבד מדפיס דקדוק שגוי עבור כמויות רבות.
מפני שהשיטה הקלאסית Properties.load(InputStream) קוראת את הקובץ כ-Latin-1. תווים מחוץ לטווח הזה צריכים להיכתב כרצפי בריחה \uXXXX, או שיש לטעון את הקובץ עם קורא שמשתמש בקידוד הנכון.
כן, כשהם לפי מיקום (%1$s, %2$s) או בעלי שם ({count}, {user}) — לעיתים קרובות שינוי הסדר נדרש לסדר מילים טבעי. כל מציין מיקום עדיין חייב להופיע בדיוק פעם אחת. מצייני מיקום %s חשופים אי אפשר לסדר מחדש בבטחה.
מפתחות הם מזהים, לא טקסט. הקוד מבקש מחרוזת לפי המפתח שלה; מפתח מתורגם פירושו שהחיפוש נכשל והאפליקציה מציגה מפתח גולמי או חוזרת לשפת ברירת המחדל.
העלו קובץ PO, YAML, .properties או RESX וקבלו אותו בחזרה כשהמפתחות, מצייני המיקום, רצפי הבריחה והמבנה נשארים בדיוק במקומם.
תרגמו קובץ שפה בחינם
בינה מלאכותית וטכנולוגיה
איך לתרגם כתוביות SRT בלי לאבד חותמות זמןלמה תרגום כתוביות הוא עבודה שדורשת דיוק קובץ SRT הוא פורמט מובנה בקפדנות. כל בלוק כתוביות מכיל מספר סידורי, טווח חותמות…
Amanda Lee
בינה מלאכותית וטכנולוגיה
איך לתרגם מצגת PowerPoint אונלייןהאתגר האמיתי בתרגום מצגת מצגת PowerPoint היא הרבה יותר מטקסט. כל שקופית היא קנבס מעוצב בקפידה — תיבות הטקסט ממוקמות לאי…
Amanda Lee