55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package http
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"golang.org/x/text/language"
|
|
|
|
"source.toby3d.me/toby3d/home/internal/common"
|
|
"source.toby3d.me/toby3d/home/internal/domain"
|
|
"source.toby3d.me/toby3d/home/internal/site"
|
|
)
|
|
|
|
type Handler struct {
|
|
sites site.UseCase
|
|
}
|
|
|
|
func NewHandler(sites site.UseCase) *Handler {
|
|
return &Handler{sites: sites}
|
|
}
|
|
|
|
func (h *Handler) Handle(ctx context.Context, head string) (*domain.Site, http.Handler, error) {
|
|
lang := domain.NewLanguage(head)
|
|
|
|
site, err := h.sites.Do(ctx, lang)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("cannot handle site: %w", err)
|
|
}
|
|
|
|
if !site.IsMultiLingual() || head != "" {
|
|
return site, nil, nil
|
|
}
|
|
|
|
supported := make([]language.Tag, len(site.Languages))
|
|
for i := range site.Languages {
|
|
supported[i] = language.Make(site.Languages[i].Lang())
|
|
}
|
|
|
|
if site.DefaultLanguage != domain.LanguageUnd {
|
|
supported = append([]language.Tag{language.Make(site.DefaultLanguage.Code())}, supported...)
|
|
}
|
|
|
|
return site, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
requested, _, _ := language.ParseAcceptLanguage(r.Header.Get(common.HeaderAcceptLanguage))
|
|
if len(requested) == 0 {
|
|
requested = append(requested, language.English)
|
|
}
|
|
|
|
matched, _, _ := language.NewMatcher(supported).Match(requested...)
|
|
|
|
http.Redirect(w, r, "/"+domain.NewLanguage(matched.String()).Lang()+"/", http.StatusSeeOther)
|
|
}), nil
|
|
}
|