wsprd: Pass the user language between wspr and JS

Fixes: https://github.com/vanadium/issues/issues/364

MultiPart: 2/2
Change-Id: I31ca64005c9d04b462658e0fcfc8f6dc278e0b34
diff --git a/services/wspr/internal/app/app.go b/services/wspr/internal/app/app.go
index baa5bda..1496e41 100644
--- a/services/wspr/internal/app/app.go
+++ b/services/wspr/internal/app/app.go
@@ -17,6 +17,7 @@
 
 	"v.io/v23"
 	"v.io/v23/context"
+	"v.io/v23/i18n"
 	"v.io/v23/naming"
 	"v.io/v23/options"
 	"v.io/v23/rpc"
@@ -510,6 +511,7 @@
 	vlog.VI(2).Infof("Rpc: %s.%s(..., streaming=%v)", msg.Name, msg.Method, msg.IsStreaming)
 	spanName := fmt.Sprintf("<wspr>%q.%s", msg.Name, msg.Method)
 	ctx, span := vtrace.WithContinuedTrace(ctx, spanName, msg.TraceRequest)
+	ctx = i18n.WithLangID(ctx, i18n.LangID(msg.Context.Language))
 
 	var cctx *context.T
 	var cancel context.CancelFunc
diff --git a/services/wspr/internal/app/app.vdl b/services/wspr/internal/app/app.vdl
index 46d7689..f29c6be 100644
--- a/services/wspr/internal/app/app.vdl
+++ b/services/wspr/internal/app/app.vdl
@@ -23,6 +23,7 @@
 	IsStreaming  bool
 	Deadline     time.WireDeadline
 	TraceRequest vtrace.Request
+        Context      server.Context
 	CallOptions  []RpcCallOption
 }
 
diff --git a/services/wspr/internal/app/app.vdl.go b/services/wspr/internal/app/app.vdl.go
index 76358f7..8c12344 100644
--- a/services/wspr/internal/app/app.vdl.go
+++ b/services/wspr/internal/app/app.vdl.go
@@ -30,6 +30,7 @@
 	IsStreaming  bool
 	Deadline     time_2.Deadline
 	TraceRequest vtrace.Request
+	Context      server.Context
 	CallOptions  []RpcCallOption
 }
 
diff --git a/services/wspr/internal/rpc/server/server.go b/services/wspr/internal/rpc/server/server.go
index 2069d8c..ac7d2b5 100644
--- a/services/wspr/internal/rpc/server/server.go
+++ b/services/wspr/internal/rpc/server/server.go
@@ -14,6 +14,7 @@
 
 	"v.io/v23"
 	"v.io/v23/context"
+	"v.io/v23/i18n"
 	"v.io/v23/naming"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
@@ -63,6 +64,7 @@
 	ServerId uint32       `json:"serverId"`
 	Handle   int32        `json:"handle"`
 	Call     SecurityCall `json:"call"`
+	Context  Context
 }
 
 type Server struct {
@@ -152,9 +154,12 @@
 		}
 
 		rpcCall := ServerRpcRequestCall{
-			SecurityCall:     securityCall,
-			Deadline:         timeout,
-			TraceRequest:     vtrace.GetRequest(ctx),
+			SecurityCall: securityCall,
+			Deadline:     timeout,
+			TraceRequest: vtrace.GetRequest(ctx),
+			Context: Context{
+				Language: string(i18n.GetLangID(ctx)),
+			},
 			GrantedBlessings: grantedBlessings,
 		}
 
@@ -270,6 +275,9 @@
 			SecurityCall:     securityCall,
 			Deadline:         timeout,
 			GrantedBlessings: grantedBlessings,
+			Context: Context{
+				Language: string(i18n.GetLangID(ctx)),
+			},
 		}
 
 		// Send a invocation request to JavaScript
@@ -366,6 +374,9 @@
 	flow := s.helper.CreateNewFlow(s, nil)
 	req := CaveatValidationRequest{
 		Call: ConvertSecurityCall(s.helper, ctx, call, false),
+		Context: Context{
+			Language: string(i18n.GetLangID(ctx)),
+		},
 		Cavs: cavs,
 	}
 
@@ -546,6 +557,9 @@
 		ServerId: s.id,
 		Handle:   handle,
 		Call:     securityCall,
+		Context: Context{
+			Language: string(i18n.GetLangID(ctx)),
+		},
 	}
 	vlog.VI(0).Infof("Sending out auth request for %v, %v", flow.ID, message)
 
diff --git a/services/wspr/internal/rpc/server/server.vdl b/services/wspr/internal/rpc/server/server.vdl
index 06eda35..f069c39 100644
--- a/services/wspr/internal/rpc/server/server.vdl
+++ b/services/wspr/internal/rpc/server/server.vdl
@@ -12,6 +12,10 @@
   "v.io/x/ref/services/wspr/internal/principal"
 )
 
+type Context struct {
+    Language string
+}
+
 type SecurityCall struct {
     Method                string
     Suffix                string
@@ -26,6 +30,7 @@
 
 type CaveatValidationRequest struct {
     Call SecurityCall
+    Context Context
     Cavs [][]security.Caveat
 }
 
@@ -42,6 +47,7 @@
 type ServerRpcRequestCall struct {
 	SecurityCall SecurityCall
 	Deadline     time.WireDeadline
+        Context      Context
 	TraceRequest vtrace.Request
   GrantedBlessings ?principal.JsBlessings
 }
diff --git a/services/wspr/internal/rpc/server/server.vdl.go b/services/wspr/internal/rpc/server/server.vdl.go
index 1f3aafe..3df8ccf 100644
--- a/services/wspr/internal/rpc/server/server.vdl.go
+++ b/services/wspr/internal/rpc/server/server.vdl.go
@@ -21,6 +21,15 @@
 	"v.io/x/ref/services/wspr/internal/principal"
 )
 
+type Context struct {
+	Language string
+}
+
+func (Context) __VDLReflect(struct {
+	Name string "v.io/x/ref/services/wspr/internal/rpc/server.Context"
+}) {
+}
+
 type SecurityCall struct {
 	Method                string
 	Suffix                string
@@ -39,8 +48,9 @@
 }
 
 type CaveatValidationRequest struct {
-	Call SecurityCall
-	Cavs [][]security.Caveat
+	Call    SecurityCall
+	Context Context
+	Cavs    [][]security.Caveat
 }
 
 func (CaveatValidationRequest) __VDLReflect(struct {
@@ -60,6 +70,7 @@
 type ServerRpcRequestCall struct {
 	SecurityCall     SecurityCall
 	Deadline         time.Deadline
+	Context          Context
 	TraceRequest     vtrace.Request
 	GrantedBlessings *principal.JsBlessings
 }
@@ -84,6 +95,7 @@
 }
 
 func init() {
+	vdl.Register((*Context)(nil))
 	vdl.Register((*SecurityCall)(nil))
 	vdl.Register((*CaveatValidationRequest)(nil))
 	vdl.Register((*CaveatValidationResponse)(nil))