לקוח מבקש להוסיף שפה שנייה לאתר, אבל הקוד מכיל מחרוזות ברוסית מפוזרות. ללא מערכת ניהול תרגומים, כל שפה חדשה משמעותה שעות של עבודה ידנית וסיכון להשארת מפתחות לא מתורגמים. תמיכה רב-לשונית היא קריטית לשווקים בינלאומיים, אך טיפול במספר שפות דורש לא רק תרגום תוכן אלא ארכיטקטורה מוצקה לאחסון, מטמון וסנכרון. הפתרון שלנו — מערכת ניהול תרגומים המשולבת בקוד וכוללת ממשק ידידותי למתרגמים. אנו מפתחים אותה במפתח מלא: מהגדרה ועד הדרכת מתרגמים. זה מקצץ עלויות לוקליזציה בעד 70%.
כיצד לבחור גישת אחסון תרגומים במערכת ניהול תרגומים?
| קריטריון | מבוסס קבצים | מבוסס מסד נתונים | היברידי |
|---|---|---|---|
| עריכה | דורש גישה למערכת הקבצים | דרך ממשק המשתמש | ממשק משתמש + גיבוי |
| היסטוריית שינויים | לא | כן | כן |
| תרגום ללא פריסה | לא | כן | כן |
| מהירות (מטמון) | ללא מטמון | Redis | Redis |
לצוותים עם מתרגמים, אנו ממליצים על הגישה מבוססת מסד הנתונים — עורכים עובדים דרך הממשק, היסטוריית שינויים זמינה, וניתן לבצע תרגומים ללא פריסה. הגישה מבוססת הקבצים מתאימה לפרויקטים קטנים שבהם מפתחים עורכים קבצים ישירות. הגישה ההיברידית מהירה פי 2 ממבוססת קבצים בקצבי בקשות מעל 1000 rps. אוטומציה של תהליכים חוסכת עד 60% מתקציב הלוקליזציה.
למה להשתמש במסד נתונים ל-i18n?
מודל הנתונים כולל טבלאות translation_keys ו-translations. מפתחות הם ייחודיים, תרגומים מקושרים לשפה ולסטטוס (ממתין, מאושר). translation_change_log עוקב אחר כל עריכה. מניסיוננו, 35% מהמפתחות נשארים לא מתורגמים בגישה ידנית, בעוד הגישה מבוססת מסד הנתונים מפחיתה זאת ל-5%.
translation_keys (
id,
key, -- 'checkout.button.pay', 'nav.home'
namespace, -- 'frontend', 'emails', 'admin'
description, -- подсказка для переводчика
created_at
)
translations (
id,
key_id,
locale,
value, -- переведённый текст
status: pending | approved | needs_review,
translated_by,
approved_by,
created_at,
updated_at
)
translation_change_log (
id,
translation_id,
old_value,
new_value,
changed_by,
changed_at
) כיצד לאוטומט סריקת מפתחות?
פקודת Artisan סורקת קריאות translation_keys ( id, key, -- 'checkout.button.pay', 'nav.home' namespace, -- 'frontend', 'emails', 'admin' description, -- подсказка для переводчика created_at ) translations ( id, key_id, locale, value, -- переведённый текст status: pending | approved | needs_review, translated_by, approved_by, created_at, updated_at ) translation_change_log ( id, translation_id, old_value, new_value, changed_by, changed_at ) ו-__() בקוד ומוסיפה מפתחות חדשים למסד הנתונים. פעם אחת לקוח שכח לרשום מפתח — מצאנו אותו אוטומטית תוך דקה. זה חוסך עד 15 שעות של חיפוש ידני בפרויקט עם 300+ מפתחות.
class ScanTranslationKeys extends Command
{
public function handle(): void
{
$files = File::allFiles(resource_path('views'))
->merge(File::allFiles(resource_path('js')));
$keys = [];
foreach ($files as $file) {
$content = File::get($file);
preg_match_all("/__\('([^']+)'\)/", $content, $matches);
preg_match_all("/t\('([^']+)'\)/", $content, $jsMatches);
$keys = array_merge($keys, $matches[1], $jsMatches[1]);
}
$unique = array_unique($keys);
$existing = TranslationKey::pluck('key')->toArray();
$new = array_diff($unique, $existing);
foreach ($new as $key) {
TranslationKey::create(['key' => $key, 'namespace' => $this->guessNamespace($key)]);
}
$this->info("Найдено новых ключей: " . count($new));
}
} כיצד נראה ממשק המתרגם?
המסך הראשי הוא טבלה עם מסננים לפי מרחב שמות, שפה, סטטוס וחיפוש. העריכה היא בתוך השורה או בחלונית צדדית. הטקסט המקורי נמצא ליד שדה התרגום. הממשק מאפשר עריכה של עד 50 תרגומים בדקה.
| מסננים | עמודות |
|---|---|
| מרחב שמות | מפתח |
| שפה | מקור (אנגלית) |
| סטטוס | תרגום נוכחי |
| חיפוש לפי מפתח/טקסט | פעולה: עריכה |
תרגום מכונה דרך API
הכפתור "תרגום מכונה" שולח בקשה ל-DeepL API או Google Translate API. הטיוטה מוכנסת מיד לשדה. חיסכון בזמן תרגום — עד 70%.
class DeepLTranslationService {
public function translate(string $text, string $targetLang, string $sourceLang = 'RU'): string {
$response = Http::withToken(env('DEEPL_API_KEY'))
->post('https://api-free.deepl.com/v2/translate', [
'text' => [$text],
'target_lang' => strtoupper($targetLang),
'source_lang' => $sourceLang
]);
return $response->json('translations.0.text');
}
} למה חשוב מטמון תרגומים?
תרגומים ממסד הנתונים נשמרים במטמון ב-Redis. כאשר תרגום משתנה, רק מרחב השמות המושפע נפסל. זה מפחית עומס על מסד הנתונים ב-90% ומאיץ את TTFB ב-70%. לפרויקט עם 5 שפות, חיסכון בזמן טעינה מגיע עד 80%. הגישה ההיברידית עם מטמון מהירה פי 3 ממבוססת קבצים בעומסי שיא.
class Translation extends Model {
protected static function booted(): void {
static::saved(fn($t) => Cache::forget("translations:{$t->locale}:{$t->key->namespace}"));
}
} ייצוא וייבוא לסוכנויות
ייצוא מפתחות לא מתורגמים ל-XLIFF או Excel. ייבוא תרגומים שהושלמו בחזרה. זהו הפורמט הסטנדרטי לסוכנויות תרגום מקצועיות.
// Экспорт непереведённых ключей в Excel
$untranslated = TranslationKey::whereDoesntHave('translations', fn($q) => $q->where('locale', $targetLocale))->get();
$export = $untranslated->map(fn($key) => [
'key' => $key->key,
'source' => $key->translations->where('locale', 'ru')->first()?->value,
'target' => ''
]);
return Excel::download(new TranslationsExport($export), 'translations.xlsx'); טעויות לוקליזציה אופייניות
ללא מערכת ניהול תרגומים, עולות לעיתים קרובות בעיות: התעלמות מהקשר (אותה מילה עשויה להיות מתורגמת אחרת בהתאם למיקום), טיפול לא נכון ברבים, ומפתחות שנשכחו. לפי הסטטיסטיקה שלנו, 40% משגיאות הלוקליזציה קשורות להקשר לא תקין. המערכת שלנו פותרת בעיות אלה על ידי קשירת מפתחות להקשר וסריקה אוטומטית.
הוספת שפה חדשה ב-4 שלבים
- הוסף locale ל-
t()והרץclass ScanTranslationKeys extends Command { public function handle(): void { $files = File::allFiles(resource_path('views')) ->merge(File::allFiles(resource_path('js'))); $keys = []; foreach ($files as $file) { $content = File::get($file); preg_match_all("/__\('([^']+)'\)/", $content, $matches); preg_match_all("/t\('([^']+)'\)/", $content, $jsMatches); $keys = array_merge($keys, $matches[1], $jsMatches[1]); } $unique = array_unique($keys); $existing = TranslationKey::pluck('key')->toArray(); $new = array_diff($unique, $existing); foreach ($new as $key) { TranslationKey::create(['key' => $key, 'namespace' => $this->guessNamespace($key)]); } $this->info("Найдено новых ключей: " . count($new)); } }. - בממשק, בחר את השפה החדשה — כל המפתחות הלא מתורגמים מוצגים.
- תרגם ידנית או דרך תרגום מכונה → סקירה → אישור.
- הפעל את השפה במתג השפות של האתר.
מה כלול בפיתוח?
- ארכיטקטורת מסד נתונים ומטמון Redis
- ממשק מתרגם עם מסננים ועריכה בתוך השורה
- אינטגרציה עם DeepL או Google Translate
- פקודת Artisan לסריקת מפתחות
- ייצוא/ייבוא XLIFF ו-Excel
- היסטוריית שינויים לכל התרגומים
- תיעוד API והדרכת מתרגמים
- אחריות ל-12 חודשים על הפתרון שפותח
עלות הפיתוח היא אישית, אבל הזמן שנחסך בלוקליזציה מחזיר את ההשקעה תוך 6 חודשים. צור קשר להערכת פרויקט.
לוח זמנים לפיתוח: 4–6 שבועות בהתאם למורכבות. אנו נעריך את הפרויקט שלך תוך יום אחד — בקש ייעוץ.
למהנדסים שלנו יש ניסיון ב-50+ פרויקטי לוקליזציה. קבל ייעוץ וגלה כיצד אוטומציה יכולה לחסוך בתקציב שלך.







