diff --git a/changelog/unreleased/get-user-language.md b/changelog/unreleased/get-user-language.md new file mode 100644 index 0000000000..d3283c8a79 --- /dev/null +++ b/changelog/unreleased/get-user-language.md @@ -0,0 +1,9 @@ +Enhancement: Get user preferred language + +The only way for an OCIS web user to change language +was to set it into the browser settings. +In the ocs user info response, a field `language` is added, +to change their language in the UI, regardless of the +browser settings. + +https://github.com/cs3org/reva/pull/3507 \ No newline at end of file diff --git a/internal/http/services/owncloud/ocs/handlers/cloud/user/user.go b/internal/http/services/owncloud/ocs/handlers/cloud/user/user.go index 0357a145bd..a911afbb83 100644 --- a/internal/http/services/owncloud/ocs/handlers/cloud/user/user.go +++ b/internal/http/services/owncloud/ocs/handlers/cloud/user/user.go @@ -19,18 +19,34 @@ package user import ( + "context" "fmt" "net/http" + preferences "github.com/cs3org/go-cs3apis/cs3/preferences/v1beta1" + rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" + "github.com/cs3org/reva/internal/http/services/owncloud/ocs/config" "github.com/cs3org/reva/internal/http/services/owncloud/ocs/conversions" "github.com/cs3org/reva/internal/http/services/owncloud/ocs/response" ctxpkg "github.com/cs3org/reva/pkg/ctx" + "github.com/cs3org/reva/pkg/rgrpc/todo/pool" ) // The Handler renders the user endpoint. type Handler struct { + gatewayAddr string } +// Init initializes this and any contained handlers. +func (h *Handler) Init(c *config.Config) { + h.gatewayAddr = c.GatewaySvc +} + +const ( + languageNamespace = "core" + languageKey = "lang" +) + // GetSelf handles GET requests on /cloud/user. func (h *Handler) GetSelf(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -47,9 +63,27 @@ func (h *Handler) GetSelf(w http.ResponseWriter, r *http.Request) { DisplayName: u.DisplayName, Email: u.Mail, UserType: conversions.UserTypeString(u.Id.Type), + Language: h.getLanguage(ctx), }) } +func (h *Handler) getLanguage(ctx context.Context) string { + gw, err := pool.GetGatewayServiceClient(pool.Endpoint(h.gatewayAddr)) + if err != nil { + return "" + } + res, err := gw.GetKey(ctx, &preferences.GetKeyRequest{ + Key: &preferences.PreferenceKey{ + Namespace: languageNamespace, + Key: languageKey, + }, + }) + if err != nil || res.Status.Code != rpc.Code_CODE_OK { + return "" + } + return res.GetVal() +} + // User holds user data. type User struct { // TODO needs better naming, clarify if we need a userid, a username or both @@ -57,4 +91,5 @@ type User struct { DisplayName string `json:"display-name" xml:"display-name"` Email string `json:"email" xml:"email"` UserType string `json:"user-type" xml:"user-type"` + Language string `json:"language,omitempty" xml:"language,omitempty"` } diff --git a/internal/http/services/owncloud/ocs/ocs.go b/internal/http/services/owncloud/ocs/ocs.go index 188ff6888f..ba9df4bc31 100644 --- a/internal/http/services/owncloud/ocs/ocs.go +++ b/internal/http/services/owncloud/ocs/ocs.go @@ -95,6 +95,7 @@ func (s *svc) routerInit() error { shareesHandler := new(sharees.Handler) capabilitiesHandler.Init(s.c) usersHandler.Init(s.c) + userHandler.Init(s.c) configHandler.Init(s.c) sharesHandler.Init(s.c) shareesHandler.Init(s.c)