Files
david a2aa8b2a76 Add i18n support with English and Spanish translations
- Created i18n package with translator and middleware
- Added translation files for English (en.json) and Spanish (es.json)
- Updated all HTTP handlers to use i18n for error/success messages
- Added comprehensive test coverage for i18n (87%)
- Updated CI workflow to use Go 1.24
- All tests passing with 50.8% total coverage
2025-11-29 12:27:26 +01:00

53 lines
1.4 KiB
Go

package http
import (
"net/http"
"strings"
"apocapoc-api/internal/i18n"
"golang.org/x/text/language"
)
func respondErrorI18n(w http.ResponseWriter, r *http.Request, translator *i18n.Translator, status int, key string) {
lang := i18n.GetLanguageFromContext(r.Context())
message := translator.Error(lang, key)
respondJSON(w, status, ErrorResponse{Error: message})
}
func respondSuccessI18n(w http.ResponseWriter, r *http.Request, translator *i18n.Translator, key string) {
lang := i18n.GetLanguageFromContext(r.Context())
message := translator.Success(lang, key)
respondJSON(w, http.StatusOK, map[string]string{"message": message})
}
func respondValidationErrorI18n(w http.ResponseWriter, r *http.Request, translator *i18n.Translator, err error) {
lang := i18n.GetLanguageFromContext(r.Context())
errMsg := err.Error()
var field string
var translatedMsg string
if strings.Contains(errMsg, ": ") {
parts := strings.SplitN(errMsg, ": ", 3)
if len(parts) >= 3 {
field = parts[1]
validationKey := parts[2]
translatedMsg = translator.Validation(lang, validationKey)
respondJSON(w, http.StatusBadRequest, ValidationErrorResponse{
Error: translatedMsg,
Field: field,
})
return
}
}
respondJSON(w, http.StatusBadRequest, ErrorResponse{
Error: errMsg,
})
}
func getLanguageFromRequest(r *http.Request, translator *i18n.Translator) language.Tag {
lang := i18n.GetLanguageFromContext(r.Context())
return lang
}