Packages
i18n
Thread-safe multi-language error message registry. Built-in EN, LO (Lao), TH (Thai), ZH (Chinese). Auto-detects locale from the Accept-Language header with English fallback.
Built-in codes
| Code | EN | LO | TH | ZH |
|---|---|---|---|---|
NOT_FOUND | Resource not found | ບໍ່ພົບຂໍ້ມູນ | ไม่พบข้อมูล | 资源未找到 |
UNAUTHORIZED | Unauthorized | ບໍ່ໄດ້ຮັບອະນຸຍາດ | ไม่ได้รับอนุญาต | 未授权 |
FORBIDDEN | Forbidden | ຖືກປະຕິເສດ | ถูกปฏิเสธ | 禁止访问 |
BAD_REQUEST | Bad request | ຄຳຮ້ອງຂໍບໍ່ຖືກຕ້ອງ | คำขอไม่ถูกต้อง | 请求无效 |
CONFLICT | Resource already exists | ຂໍ້ມູນມີຢູ່ແລ້ວ | ข้อมูลมีอยู่แล้ว | 资源已存在 |
INTERNAL_ERROR | Internal server error | ເກີດຂໍ້ຜິດພາດ | เกิดข้อผิดพลาด | 服务器内部错误 |
Usage
import "github.com/BounkhongDev/bkgo/i18n"
// Auto-detect from request header
locale := i18n.FromHeader(c.Get("Accept-Language"))
// "lo" → i18n.LO, "th" → i18n.TH, unknown → i18n.EN
// Translate a code
msg := i18n.Translate(locale, "NOT_FOUND")
// locale=lo → "ບໍ່ພົບຂໍ້ມູນ"
// locale=en → "Resource not found"
// Add custom codes to an existing locale
i18n.Register(i18n.LO, map[string]string{
"USER_NOT_FOUND": "ບໍ່ພົບຜູ້ໃຊ້",
"EMAIL_TAKEN": "ອີເມວນີ້ຖືກໃຊ້ງານແລ້ວ",
"INVALID_PASSWORD": "ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ",
})
// Register a whole new language
i18n.Register("fr", map[string]string{
"NOT_FOUND": "Ressource introuvable",
"BAD_REQUEST": "Mauvaise requête",
})In a generated handler
The CLI-generated handler.go wires i18n automatically on every error response:
func (h *UserHandler) Get(c *fiber.Ctx) error {
locale := i18n.FromHeader(c.Get("Accept-Language"))
user, err := h.uc.FindByID(c.Context(), c.Params("id"))
if err != nil {
if ae, ok := errs.IsAppError(err); ok {
return c.Status(ae.Status).JSON(
response.Error(ae.Code, i18n.Translate(locale, ae.Code)),
)
}
slog.Error("get user", "error", err)
return c.Status(500).JSON(
response.Error("INTERNAL_ERROR", i18n.Translate(locale, "INTERNAL_ERROR")),
)
}
return c.JSON(response.Success(user))
}