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.
Чтобы перевести какую-нибудь ошибку необходимо:
Создать
map[error]string- где по конкретной ошибке будет возвращаться её ключ в документе перевода i18next.jsonЗаполнить контейнер парами ошибка-ключ
Добавить ключ непосредственно в файл i18next.json
Если где-то можно допустить ошибку - она обязательно будет допущена, даже самым талантливым программистом.
Какие проблемы этого подхода:
Слишком много шагов для того, чтобы создать новую ошибку с возможность перевода
Всё ещё надо помнить о том, что ошибку надо сбиндить к ключу и сохранить в json.
Ключ - это обычный текст, а значит при опечатке никакого предупреждения мы не получим.
Как можно решить эту проблему
В идеале - это подход с помощью рефлексии:
Получаем список всех публичных переменных пакета
Ищем префикс
"Err"Генерируем ключ (например по алгоритму: имя пакета-ошибка (
"controller-ErrTooManyAttempts")Мерджим файл перевода, добавляя новые ключи и паникуем, если для них ещё нет перевода.
При запуске приложения снова с помощью рефлексии читаем все ошибки из пакета и биндим к ключам
Финальный результат:
{
"controller-ErrTooManyAttempts": "Слишком много попыток",
"controller-ErrNoPermission": "У вас недостаточно прав",
"controller-ErrNotAvailable": "Недоступно"
}
Какие у вас подходы к переводу ошибок и как мне это реализовать?