Пример кэширования результатов перевода Google Translate для мультиязычного сайта на NextJS
Делюсь своим опытом по организации перевода контента на разные языки. Сейчас работаю над многоязычным сайтом со стеком NextJS i18n + MongoDB (Mongoose). На сайте довольно много текста, который изредка обновляется.
Для перевода текстов на проекте используется Google Translate. Поэтому первоначально была создана простая функция для перевода вида:
И далее она использовалась везде при подготовке страниц. Чтобы не переводить одни и те же тексты каждый раз, я использовал `unstable_cache` (несмотря на свое название, данная функция у меня еще ни разу не вызывала проблем).
Соответственно, при обновлении записи в блоге вызывался метод `revalidateTag` и переводы обновлялись.
Это вполне рабочее решение, но оно имеет изъян в том, что кэш сбрасывался при каждом обновлении сайта. Соответственно, это грозило большими счетами от Google.
Поэтому я добавил хранение результатов перевода в базе Mongo. Идея здесь следующая:
- Для каждой сущности перевода создаем уникальный `id`
- Перед обращением к Google APi делаем проверку по базе, есть ли запись с данным `id` и соответствует ли она текущему тексту, который требуется перевести
- Если да -> возвращаем запись из базы
- Если нет -> запрашиваем перевод по API и отдаем его + сохраняем результат в базе
Для простого сопоставления текстов я использую хэширование.
С новой логикой функция `translateFromEn` выглядит так:
Таким образом нам удалось значительно снизить число обращений к `Google Translate API` и удержать бюджет в рамках разумного.