Gezer/צורות רבים

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

מהן צורות רבים

צורות רבים (באנגלית Plural Forms) הן צורות המטופלות באופן מיוחד על ידי Gettext.

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

  • No items/ 0 items
  • 1 item
  • 2 items
  • 3 items
  • וכו׳

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

בעברית ישנו כלל נוסף שגורס כי אין לכתוב "פריט 1" אלא "פריט אחד".

לפי המידע שאספנו עד כה נוכל להרכיב שוב את הרשימה הקודמת ובעברית:

  • אין פריטים/ 0 פריטים
  • פריט אחד
  • 2 פריטים
  • 3 פריטים
  • וכו׳

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

  • כאשר n הוא 1 אז תוצג המחרוזת "פריט אחד"
  • כאשר n שונה מאחד תוצג המחרוזת ״n פריטים"

בעיה נוספת שעולה מהכתוב היא שסביר להניח כי במחרוזת המקור של צורת היחיד יופיע הטקסט "n item", התעלמות מממלא מקום/פרמטר מובילה לעתים לשגיאות בהידור (הידור קובץ po ל־mo).

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

ריבוי זוגי

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

ניתן לקרוא על צורן זה בוויקיפדיה.

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

נניח שישנה מחרוזת ריבוי בה מופיעות המחרוזות הבאות:

  • n Hour
  • n Hours

תרגומן לעברית ללא הצורן הזוגי תהיה:

  • שעה אחת
  • n שעות

במקרים שבהם ה־n איננו 2 אין שום בעיה, כאשר ה־n הוא 2 מופיע הטקסט "2 שעות".

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

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

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

  • יחיד
  • רבים

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

  • יחיד
  • רבים
  • זוגי

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


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

בצורת הריבוי הרגילה הייתה לנו האפשרות לכתוב "אתמול ולפני n ימים" (בהתאמה), בשימוש בצורן הזוגי תהיה לנו האפשרות להקצות את הצורה הזוגית למילה המתאימה בעברית באופן הבא: "אתמול, לפני n ימים ושלשום" (בהתאמה).

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

מה עושים עם מחרוזת ללא צורן זוגי?

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

  • להעתיק את צורן הרבים לצורן הזוגי (פריט אחד, n פריטים ו־n פריטים בהתאמה)
  • להשתמש בצורן הזוגי באופן ייחודי (פריט אחד, n פריטים ושני פריטים בהתאמה)

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

פירוט טכני

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

כאשר יוצרים קובץ po מ־pot באמצעות Poedit אנו נשאלים מהם צורות הרבים בכול פעם מחדש, במערכות מורכבות יותר כמו Virtaal, Pootle ו־Launchpad יש צורך בעריכת שינויים ידניים.

מחרוזת ה־Plural Forms שאינה כוללת את הצורן הזוגי נראית כך:

 "Plural-Forms: nplurals=2; plural=(n != 1);\n"

כאשר ב־Poedit יופיע הנוסח המקוצר של הנוסחה תחת Catalog -> Properties...‎ (ובעברית: קטלוג -> מאפיינים... או פשוט Alt + Enter) באופן הבא:

 nplurals=2; plural=( n != 1 );

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

 "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n>2||n==0) ? 1 : 2;\n"

וב־Poedit יש לשנות את שדה ה־Plural Forms (צורות הרבים בעברית) למחרוזת הבאה (הקידומת והסיומת נוספות אוטומטית):

 nplurals=3; plural=n==1 ? 0 : (n>2||n==0) ? 1 : 2;

העשרה ומידע נוסף

על הגדרת צורות הרבים ב־gettext ניתן לקרוא בכתובת: http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html

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

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

בוויקי של ArabEyes (אחת הקבוצות המשפיעות ביותר של מתכנתי לינוקס בעולם הערבי) ישנו הפירוט הבא:

בערבית נהוג להשתמש בנוסחה לציון 6 צורות רבים:

  • צורה ראשונה: ל־0
  • צורה שנייה: ל־1
  • צורה שלישית: ל־2 (בדומה לצורן הזוגי בעברית)
  • צורה רביעית: למספרים המסתיימים בספרה שבין 3 ל־10 (לדוגמה: 103, 1405, 23409).
  • צורה חמישית: למספרים המסתיימים בצמד ספרות שבין 11 ל־99 (לדוגמה: 1099, 278).
  • צורה שישית: למספרים מעל 100 המסתיימים בספרות 0, 1 או 2 (לדוגמה: 100, 232, 3001)

נוסחת הרבים

זוהי נוסחת הרבים המשמשת לטיפול בצורות הרבים שפורטו:

nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;

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

דוגמאות

msgid "1 Item"
msgid_plural "%d Items"
msgstr[0] "لا عناصر"
msgstr[1] "عنصر واحد"
msgstr[2] "عنصران"
msgstr[3] "%d عناصر"
msgstr[4] "%d عنصرا"
msgstr[5] "%d عنصر"


ובאשר לפולנית (תורגם מעמוד ההסבר על Plural Forms ב־gettext כפי שמופיע באתר של gnu):

בפולנית משתמשים ב־plik (קובץ), לדוגמה, באופן הבא:

  • 1 plik
  • 2,3,4 pliki
  • 5-21 pliko'w
  • 22-24 pliki
  • 25-31 pliko'w

ונוסחת הרבים בפולנית היא:

         Plural-Forms: nplurals=3; \
             plural=n==1 ? 0 : \
                    n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;

מקווה שהועשרתם מספיק עד לנקודה זו :).

מסמך זה נכתב על ידי ירון שהרבני עבור מיזם גזר, מסמך זה מוגן בתנאי הרישיון CC-BY-SA 3.0 בהתאם לרישיון הוויקי של עמותת המקור.