Клієнт просить додати другу мову на сайт, а в коді розкидані рядки російською. Без системи керування перекладами кожна нова мова — це години ручної роботи та ризик залишити неперекладені ключі. Багатомовність критична для виходу на міжнародні ринки, але підтримка кількох мов вимагає не просто перекладу контенту, а грамотної архітектури зберігання, кешування та синхронізації. Наше рішення — система керування перекладами, інтегрована з кодом і має зручний інтерфейс для перекладачів. Розробляємо під ключ: від конфігурації до навчання перекладачів. Це знижує витрати на локалізацію до 70%.
Як обрати спосіб зберігання перекладів у системі керування перекладами?
| Критерій | Файловий підхід | Database-підхід | Гібридний |
|---|---|---|---|
| Редагування | Вимагає доступу до файлової системи | Через UI | UI + fallback |
| Історія змін | Немає | Є | Є |
| Переклад без деплою | Ні | Так | Так |
| Швидкість (кеш) | Немає кешу | Redis | Redis |
Для команд з перекладачами рекомендуємо Database-підхід — редактори працюють через інтерфейс, історія змін, можливість перекладати без деплою. Файловий підхід годиться для невеликих проєктів з розробниками, які самі редагують файли. Гібридний підхід у 2 рази швидший за файловий при частоті запитів >1000 rps. Економія бюджету на локалізацію становить до 60% при автоматизації процесів.
Чому варто використовувати базу даних для i18n?
Модель даних включає таблиці translation_keys та translations. Ключі унікальні, переклади прив'язані до мови та статусу (pending, approved). Журнал змін translation_change_log фіксує кожне редагування. За нашими даними, 35% ключів залишаються неперекладеними при ручному підході, а database-підхід знижує цей показник до 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-команда сканує __() та t() в коді та додає нові ключі до БД. Одного разу клієнт забув зареєструвати ключ — ми знайшли його автоматично за 1 хвилину. Це економить до 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));
}
}
Як влаштований інтерфейс перекладача?
Основний екран — таблиця з фільтрами за namespace, мовою, статусом та пошуком. Редагування інлайн або в бічній панелі. Поряд з полем перекладу — оригінальний текст. Інтерфейс дозволяє редагувати до 50 перекладів на хвилину.
| Фільтри | Колонки |
|---|---|
| Namespace | Ключ |
| Мова | Оригінал (ru) |
| Статус | Поточний переклад |
| Пошук за ключем/текстом | Дія: редагувати |
Машинний переклад через 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. При зміні — інвалідація лише зачепленого namespace. Це знижує навантаження на БД на 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 в
config/app.phpта запуститиphp artisan translations:scan. - В інтерфейсі вибрати нову мову — показано всі неперекладені ключі.
- Перекласти вручну або через машинний переклад → перевірити → затвердити.
- Увімкнути мову в language switcher сайту.
Що входить в розробку?
- Архітектура БД та кешування на Redis
- Інтерфейс перекладача з фільтрами та інлайн-редагуванням
- Інтеграція з DeepL або Google Translate
- Artisan-команда для сканування ключів
- Експорт/імпорт XLIFF та Excel
- Історія змін всіх перекладів
- Документація по API та навчання перекладачів
- Гарантія 12 місяців на розроблене рішення
Вартість розробки індивідуальна, але економія часу на локалізацію окупає інвестиції протягом 6 місяців. Зв'яжіться з нами для оцінки вашого проєкту.
Термін розробки: 4–6 тижнів залежно від складності. Оцінимо ваш проєкт за 1 день — замовте консультацію.
Наші інженери мають досвід у 50+ проєктах локалізації. Отримайте консультацію та дізнайтеся, як автоматизація заощадить ваш бюджет.







