@@ -136,22 +136,87 @@ func (a App) GetIconPath() string {
136136 return filepath .Join (a .GetRootDir (), iconPath )
137137}
138138
139- func (a App ) GetMetaData () * extensionMetadata {
139+ func (a App ) GetMetaData () * ExtensionMetadata {
140140 german := []string {"de-DE" , "de" }
141141 english := []string {"en-GB" , "en-US" , "en" , "" }
142142
143- return & extensionMetadata {
144- Label : extensionTranslated {
143+ return & ExtensionMetadata {
144+ Label : ExtensionTranslated {
145145 German : a .manifest .Meta .Label .GetValueByLanguage (german ),
146146 English : a .manifest .Meta .Label .GetValueByLanguage (english ),
147147 },
148- Description : extensionTranslated {
148+ Description : ExtensionTranslated {
149149 German : a .manifest .Meta .Description .GetValueByLanguage (german ),
150150 English : a .manifest .Meta .Description .GetValueByLanguage (english ),
151151 },
152152 }
153153}
154154
155+ func (a App ) UpdateMetaData (metadata * ExtensionMetadata ) error {
156+ manifestFile := fmt .Sprintf ("%s/manifest.xml" , a .path )
157+
158+ manifestBytes , err := os .ReadFile (manifestFile )
159+ if err != nil {
160+ return fmt .Errorf ("could not read manifest.xml: %w" , err )
161+ }
162+
163+ var manifest Manifest
164+ if err := xml .Unmarshal (manifestBytes , & manifest ); err != nil {
165+ return fmt .Errorf ("could not parse manifest.xml: %w" , err )
166+ }
167+
168+ manifest .Meta .Label = updateTranslatableString (manifest .Meta .Label , metadata .Label )
169+ manifest .Meta .Description = updateTranslatableString (manifest .Meta .Description , metadata .Description )
170+
171+ newXml , err := xml .MarshalIndent (manifest , "" , " " )
172+ if err != nil {
173+ return fmt .Errorf ("could not marshal manifest.xml: %w" , err )
174+ }
175+
176+ newXml = append ([]byte (xml .Header ), newXml ... )
177+
178+ if err := os .WriteFile (manifestFile , newXml , os .ModePerm ); err != nil {
179+ return fmt .Errorf ("could not write manifest.xml: %w" , err )
180+ }
181+
182+ return nil
183+ }
184+
185+ func updateTranslatableString (existing TranslatableString , translated ExtensionTranslated ) TranslatableString {
186+ translations := []struct {
187+ lang string
188+ value string
189+ }{
190+ {"en-GB" , translated .English },
191+ {"de-DE" , translated .German },
192+ }
193+
194+ matched := make (map [string ]bool )
195+
196+ for i , entry := range existing {
197+ for _ , t := range translations {
198+ if t .value == "" {
199+ continue
200+ }
201+ if entry .Lang == t .lang || (entry .Lang == "" && t .lang == "en-GB" ) {
202+ existing [i ].Value = t .value
203+ matched [t .lang ] = true
204+ }
205+ }
206+ }
207+
208+ for _ , t := range translations {
209+ if t .value != "" && ! matched [t .lang ] {
210+ existing = append (existing , struct {
211+ Value string `xml:",chardata"`
212+ Lang string `xml:"lang,attr,omitempty"`
213+ }{Value : t .value , Lang : t .lang })
214+ }
215+ }
216+
217+ return existing
218+ }
219+
155220func (a App ) Validate (_ context.Context , check validation.Check ) {
156221 validateTheme (a , check )
157222
0 commit comments