3
0

Fix language dynamism to align with user's and context preference

This commit is contained in:
Mumbi Francis 2024-09-03 14:56:52 +03:00 committed by Mumbi Francis
parent f2cdc1a586
commit 08be1a1355
2 changed files with 24 additions and 1 deletions

View File

@ -11,6 +11,9 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/cortezaproject/corteza/server/pkg/locale"
"golang.org/x/text/language"
"github.com/go-chi/jwtauth" "github.com/go-chi/jwtauth"
oauth2errors "github.com/go-oauth2/oauth2/v4/errors" oauth2errors "github.com/go-oauth2/oauth2/v4/errors"
"github.com/lestrrat-go/jwx/jwa" "github.com/lestrrat-go/jwx/jwa"
@ -457,6 +460,12 @@ func (h AuthHandlers) handleTokenRequest(req *request.AuthReq, client *types.Aut
response["avatarID"] = strconv.FormatUint(user.Meta.AvatarID, 10) response["avatarID"] = strconv.FormatUint(user.Meta.AvatarID, 10)
} }
if h.Locale.HasLanguage(language.Make(user.Meta.PreferredLanguage)) {
response["preferred_language"] = user.Meta.PreferredLanguage
} else {
response["preferred_language"] = locale.GetAcceptLanguageFromContext(req.Context()).String()
}
if user.Labels != nil { if user.Labels != nil {
response["labels"] = user.Labels response["labels"] = user.Labels
} else { } else {

View File

@ -12,6 +12,8 @@ import (
"strings" "strings"
"time" "time"
"golang.org/x/text/language"
"github.com/cortezaproject/corteza/server/system/service" "github.com/cortezaproject/corteza/server/system/service"
"github.com/cortezaproject/corteza/server/auth/external" "github.com/cortezaproject/corteza/server/auth/external"
@ -111,6 +113,7 @@ type (
localeService interface { localeService interface {
NS(ctx context.Context, ns string) func(key string, rr ...string) string NS(ctx context.Context, ns string) func(key string, rr ...string) string
T(ctx context.Context, ns, key string, rr ...string) string T(ctx context.Context, ns, key string, rr ...string) string
HasLanguage(lang language.Tag) bool
LocalizedList(ctx context.Context) []*locale.Language LocalizedList(ctx context.Context) []*locale.Language
} }
@ -223,12 +226,23 @@ func (h *AuthHandlers) handle(fn handlerFn) http.HandlerFunc {
// make sure user (identity) is part of the context // make sure user (identity) is part of the context
// so we can properly identify ourselves when interacting // so we can properly identify ourselves when interacting
// with services // with services, and set user's preferred language
if req.AuthUser != nil && !req.AuthUser.PendingMFA() { if req.AuthUser != nil && !req.AuthUser.PendingMFA() {
req.Request = req.Request.Clone(auth.SetIdentityToContext( req.Request = req.Request.Clone(auth.SetIdentityToContext(
req.Context(), req.Context(),
auth.Authenticated(req.AuthUser.User.ID, req.AuthUser.User.Roles()...), auth.Authenticated(req.AuthUser.User.ID, req.AuthUser.User.Roles()...),
)) ))
userPreferredLanguage := language.Make(req.AuthUser.User.Meta.PreferredLanguage)
// set user's preferred language
if h.Locale.HasLanguage(userPreferredLanguage) {
ctx := req.Request.Context()
ctx = locale.SetAcceptLanguageToContext(ctx, userPreferredLanguage)
ctx = locale.SetContentLanguageToContext(ctx, userPreferredLanguage)
req.Request = req.Request.WithContext(ctx)
}
} }
// Alerts show for 1 session only! // Alerts show for 1 session only!