99 "fmt"
1010 "sort"
1111
12+ "code.gitea.io/gitea/modules/translation"
13+
1214 actions_model "code.gitea.io/gitea/models/actions"
1315 "code.gitea.io/gitea/models/db"
1416 repo_model "code.gitea.io/gitea/models/repo"
@@ -26,8 +28,6 @@ func generateMessageIDForActionsWorkflowRunStatusEmail(repo *repo_model.Reposito
2628}
2729
2830func sendActionsWorkflowRunStatusEmail (ctx context.Context , repo * repo_model.Repository , run * actions_model.ActionRun , sender * user_model.User , recipients []* user_model.User ) {
29- msgs := make ([]* sender_service.Message , 0 , len (recipients ))
30-
3131 messageID := generateMessageIDForActionsWorkflowRunStatusEmail (repo , run )
3232 headers := generateMetadataHeaders (repo )
3333
@@ -62,35 +62,46 @@ func sendActionsWorkflowRunStatusEmail(ctx context.Context, repo *repo_model.Rep
6262 })
6363 }
6464
65- var mailBody bytes.Buffer
66- if err := bodyTemplates .ExecuteTemplate (& mailBody , tplWorkflowRun , map [string ]any {
67- "Subject" : subject ,
68- "Repo" : repo ,
69- "Run" : run ,
70- "Jobs" : jobs ,
71- }); err != nil {
72- log .Error ("ExecuteTemplate [%s]: %v" , tplWorkflowRun , err )
73- }
65+ displayName := fromDisplayName (sender )
7466
75- for _ , recipient := range recipients {
76- msg := sender_service .NewMessageFrom (
77- recipient .Email ,
78- fromDisplayName (sender ),
79- setting .MailService .FromEmail ,
80- subject ,
81- mailBody .String (),
82- )
83- msg .Info = subject
84- for k , v := range generateSenderRecipientHeaders (sender , recipient ) {
85- msg .SetHeader (k , v )
67+ langMap := make (map [string ][]* user_model.User )
68+ for _ , user := range recipients {
69+ langMap [user .Language ] = append (langMap [user .Language ], user )
70+ }
71+ for lang , tos := range langMap {
72+ locale := translation .NewLocale (lang )
73+ var mailBody bytes.Buffer
74+ if err := bodyTemplates .ExecuteTemplate (& mailBody , tplWorkflowRun , map [string ]any {
75+ "Subject" : subject ,
76+ "Repo" : repo ,
77+ "Run" : run ,
78+ "Jobs" : jobs ,
79+ "locale" : locale ,
80+ "Language" : locale .Language (),
81+ }); err != nil {
82+ log .Error ("ExecuteTemplate [%s]: %v" , tplWorkflowRun , err )
8683 }
87- for k , v := range headers {
88- msg .SetHeader (k , v )
84+ msgs := make ([]* sender_service.Message , 0 , len (tos ))
85+ for _ , rec := range tos {
86+ msg := sender_service .NewMessageFrom (
87+ rec .Email ,
88+ displayName ,
89+ setting .MailService .FromEmail ,
90+ subject ,
91+ mailBody .String (),
92+ )
93+ msg .Info = subject
94+ for k , v := range generateSenderRecipientHeaders (sender , rec ) {
95+ msg .SetHeader (k , v )
96+ }
97+ for k , v := range headers {
98+ msg .SetHeader (k , v )
99+ }
100+ msg .SetHeader ("Message-ID" , messageID )
101+ msgs = append (msgs , msg )
89102 }
90- msg .SetHeader ("Message-ID" , messageID )
91- msgs = append (msgs , msg )
103+ SendAsync (msgs ... )
92104 }
93- SendAsync (msgs ... )
94105}
95106
96107func SendActionsWorkflowRunStatusEmail (ctx context.Context , sender * user_model.User , repo * repo_model.Repository , run * actions_model.ActionRun ) {
0 commit comments