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

CodeENLOTHZH
NOT_FOUNDResource not foundບໍ່ພົບຂໍ້ມູນไม่พบข้อมูล资源未找到
UNAUTHORIZEDUnauthorizedບໍ່ໄດ້ຮັບອະນຸຍາດไม่ได้รับอนุญาต未授权
FORBIDDENForbiddenຖືກປະຕິເສດถูกปฏิเสธ禁止访问
BAD_REQUESTBad requestຄຳຮ້ອງຂໍບໍ່ຖືກຕ້ອງคำขอไม่ถูกต้อง请求无效
CONFLICTResource already existsຂໍ້ມູນມີຢູ່ແລ້ວข้อมูลมีอยู่แล้ว资源已存在
INTERNAL_ERRORInternal 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))
}