GoLang - перевод текста ошибок пакета error для веб-сайта

Пытаюсь реализовать сервер с помощью фреймворка GIN.

Для каждого запроса вызывается handler по необходимому пути (route), а затем вызывается контроллер. Этот контроллер возвращает тип error.

package controller

var (
    ErrTooManyAttempts = errors.New("too many attempts")
    ErrNoPermission = errors.New("no permission")
    ErrNotAvailable = errors.New("not available")
)

Соответственно конечному пользователю необходимо вернуть текст ошибки на его языке, для этого я использую i18next.json для gin.

Чтобы перевести какую-нибудь ошибку необходимо:

  1. Создать map[error]string - где по конкретной ошибке будет возвращаться её ключ в документе перевода i18next.json

  2. Заполнить контейнер парами ошибка-ключ

  3. Добавить ключ непосредственно в файл i18next.json

Если где-то можно допустить ошибку - она обязательно будет допущена, даже самым талантливым программистом.

Какие проблемы этого подхода:

  1. Слишком много шагов для того, чтобы создать новую ошибку с возможность перевода

  2. Всё ещё надо помнить о том, что ошибку надо сбиндить к ключу и сохранить в json.

  3. Ключ - это обычный текст, а значит при опечатке никакого предупреждения мы не получим.

Как можно решить эту проблему

В идеале - это подход с помощью рефлексии:

  1. Получаем список всех публичных переменных пакета

  2. Ищем префикс "Err"

  3. Генерируем ключ (например по алгоритму: имя пакета-ошибка ("controller-ErrTooManyAttempts")

  4. Мерджим файл перевода, добавляя новые ключи и паникуем, если для них ещё нет перевода.

  5. При запуске приложения снова с помощью рефлексии читаем все ошибки из пакета и биндим к ключам

Финальный результат:

{
  "controller-ErrTooManyAttempts": "Слишком много попыток",
  "controller-ErrNoPermission": "У вас недостаточно прав",
  "controller-ErrNotAvailable": "Недоступно"
}

Какие у вас подходы к переводу ошибок и как мне это реализовать?


Ответы (0 шт):