בינאומיות 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 לאופטימיזציה נוספת. - סקלאביליות: ככל שמספר השפות או מחרוזות הטקסט גדל, ניהול הקבצים ידנית עלול להסתבך. בשלב הזה, אולי תצטרכו לבדוק פתרונות i18n מקצועיים יותר, כמו ההרחבה gettext של PHP או רכיבי לוקליזציה שמספקים פריימוורקים.
- שמירה על עקביות בתרגום: כדי להבטיח אחידות בשמות מותג ובמונחים מקצועיים בכל הגרסאות בשפות השונות, מומלץ מאוד להשתמש ב-פיצ'ר הגלוסרי של O.Translator.
- אסטרטגיה ברמה גבוהה: המאמר הזה מתמקד ביישום הטכני. אם אתם רוצים ללמוד עוד על האסטרטגיה הכוללת לאינטרנשיונליזציה של אתרים, תוכלו לקרוא את המאמר המעמיק הנוסף שלנו.