בינאומיות PHP (i18n): מדריך מעשי למפתחים

Yee
Aug 03, 2024

קחו את אתר ה-PHP שלכם לעולם: פתרון יעיל יותר לאינטרנשיונליזציה
אם אתם כמוני ומתחזקים פרויקטי PHP "ונילה" שלא מסתמכים על מסגרות כבדות (כמו Laravel או Symfony), אז תמיכה בריבוי שפות (i18n) כנראה הייתה עבורכם כאב ראש קטן אך מתמשך.
הפתרון המסורתי, gettext, אמנם חזק, אבל די מסורבל להגדרה. במיוחד בפרויקטים קטנים, זה מרגיש כמו "להשתמש בפטיש כבד כדי לפצח אגוז". מה שאנחנו באמת צריכים זה שיטה שאפשר ליישם במהירות בלי להכניס יותר מדי סיבוכיות.
אחרי הרבה ניסוי וטעייה בכמה פרויקטים, פיתחנו פתרון אינטרנשיונליזציה קליל שמבוסס על קבצי מערך PHP וכלי תרגום אונליין. הגישה הזו לא רק פשוטה לפריסה, אלא גם כמעט ולא דורשת תחזוקה. היום אני משתף אתכם את כל הפתרון הזה, בלי אותיות קטנות.
מדריך מעשי: איך פתרתי תמיכה בריבוי שפות ב-PHP עם O.Translator
הרעיון המרכזי שלנו מאוד פשוט: כל שפה מקבלת קובץ PHP, שמכיל פקודת return שמחזירה מערך אסוציאטיבי. השיטה הזו פשוטה, אינטואיטיבית וכמעט לא פוגעת בביצועים.
שלב 1: תכננו את מבנה התיקיות שלכם
מבנה תיקיות ברור הוא חצי מהעבודה. כדי לשמור על סדר, נשים את כל קבצי השפה באותה תיקיה ונקרא להם לפי קוד השפה, ככה:
project_root/
├── index.php         // Your main logic file
├── i18n/             // Folder for all language files
│   ├── lang.cn.php   // Chinese language pack
│   ├── lang.en.php   // English language pack
│   └── lang.fr.php   // French language pack
שלב 2: צרו את 'ארסנל השפות' שלכם
השלב הבא הוא ליצור את קובץ השפה הבסיסי. בואו נשתמש בסינית כדוגמה וניצור קובץ בשם lang.cn.php. התוכן של הקובץ הוא מערך PHP פשוט, שבו המפתחות הם מזהים ייחודיים והערכים הם מחרוזות הטקסט המתאימות.
דוגמה ל-lang.cn.php: המפתחות נשארים קבועים, הערכים משתנים לפי השפה
שלב 3: הכירו את אשף התרגום, O.Translator
לתרגם ידנית עשרות או מאות ערכים? זה בדיוק סוג העבודה החוזרת שמפתחים הכי שונאים. כאן נכנס לפעולה הנשק הסודי שלנו, O.Translator.
זו פלטפורמת תרגום מסמכים מקצועית אונליין שתומכת בצורה מושלמת בקבצי PHP, כך שהיא יכולה לקרוא את המערך שלכם ישירות ולתרגם אותו ליותר מ-70 שפות.
התהליך פשוט בטירוף:
- היכנסו אל דף הבית של O.Translator והעלו את קובץ השפה הבסיסי שלכם (למשל, lang.cn.php).
- בחרו את השפות שאליהן תרצו לתרגם, כמו אנגלית וצרפתית.
- לחצו על תרגום, חכו רגע, וקבצי lang.en.phpו-lang.fr.phpהמתורגמים יחכו לכם.
מה שהכי הרשים אותי זה ש-O.Translator מאפשר לכם להציג תצוגה מקדימה של חלק מהתרגום בחינם. אם אתם מרוצים מהתוצאה, תוכלו להחליט אם לשלם על התרגום המלא. במילים שלהם: "לעולם אל תשלמו על מוצר שאתם לא מרוצים ממנו."
שלב 4: נותנים לקוד לחיות
הכול מוכן; כל מה שנשאר זה הטאץ' האחרון. עכשיו, בואו נשנה את קובץ ה-index.php הראשי כדי שיוכל לטעון דינמית את חבילת השפה המתאימה לפי בחירת המשתמש.
<?php
// 1. Determine the current language (using a GET parameter for demonstration)
$supported_langs = ['en', 'cn', 'fr'];
$default_lang = 'en';
$lang = isset($_GET['lang']) && in_array($_GET['lang'], $supported_langs) ? $_GET['lang'] : $default_lang;
// 2. Load the corresponding language file
// Use a global variable like $_ or a specific variable like $TEXTS to store the strings
$_ = require_once __DIR__ . "/i18n/lang.{$lang}.php";
?>
בתבנית ה-HTML שלכם, תוכלו לקרוא בקלות למחרוזות הטקסט ככה:
<!DOCTYPE html>
<html lang="<?php echo htmlspecialchars($lang); ?>">
<head>
    <meta charset="UTF-8">
    <title><?php echo htmlspecialchars($_['heading_home']); ?></title>
</head>
<body>
    <header>
      <h1><?php echo htmlspecialchars($_['heading_home']); ?></h1>
      <nav>
        <ul>
          <li><?php echo htmlspecialchars($_['heading_about']); ?></li>
          <li><?php echo htmlspecialchars($_['button_read_more']); ?></li>
        </ul>
      </nav>
    </header>
</body>
</html>
וזהו—אתר רב-לשוני פשוט יצא לדרך!
שיקולים ומחשבות מתקדמות
למרות שהפתרון הזה קליל, יש כמה נקודות שכדאי לשקול לפני שמעלים לאוויר:
- איך מזהים את השפה של המשתמש? הדוגמה משתמשת בפרמטר GET כמו ?lang=en. באפליקציה אמיתית, אפשר גם להשתמש ב-$_SESSION,$_COOKIE, או לנתח את כותרת הבקשהAccept-Languageשל הדפדפן לזיהוי אוטומטי.
- שיקולי ביצועים: לאתרים קטנים עד בינוניים, העומס של require_onceעל קובץ PHP בכל בקשה הוא זניח. אם האתר שלכם עם תעבורה גבוהה, כדאי לשקול שימוש בטכנולוגיות קאשינג של בייטקוד כמו APC או OPcache לאופטימיזציה נוספת.
- סקלאביליות: ככל שמספר השפות או מחרוזות הטקסט גדל, ניהול הקבצים ידנית עלול להסתבך. בשלב הזה אולי תצטרכו לשקול פתרונות אינטרנשיונליזציה מקצועיים יותר, כמו ההרחבה gettext של PHP או רכיבי הלוקליזציה של פריימוורקים.
- עקביות בתרגום: כדי להבטיח עקביות בשמות מותג ומונחים בכל הגרסאות הלשוניות, מומלץ מאוד להשתמש בפיצ'ר המונחים של O.Translator.
- אסטרטגיה ברמה גבוהה: המאמר הזה מתמקד ביישום הטכני. אם בא לכם ללמוד עוד על האסטרטגיה הכללית לאינטרנשיונליזציה של אתרים, תוכלו לקרוא מאמר מעמיק נוסף שלנו.



