a2aa8b2a76
- 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
53 lines
1.4 KiB
Go
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
|
|
}
|