You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

backport-locales.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. //go:build ignore
  4. package main
  5. import (
  6. "fmt"
  7. "os"
  8. "os/exec"
  9. "path/filepath"
  10. "strings"
  11. "code.gitea.io/gitea/modules/container"
  12. "code.gitea.io/gitea/modules/setting"
  13. )
  14. func main() {
  15. if len(os.Args) != 2 {
  16. println("usage: backport-locales <to-ref>")
  17. println("eg: backport-locales release/v1.19")
  18. os.Exit(1)
  19. }
  20. mustNoErr := func(err error) {
  21. if err != nil {
  22. panic(err)
  23. }
  24. }
  25. collectInis := func(ref string) map[string]setting.ConfigProvider {
  26. inis := map[string]setting.ConfigProvider{}
  27. err := filepath.WalkDir("options/locale", func(path string, d os.DirEntry, err error) error {
  28. if err != nil {
  29. return err
  30. }
  31. if d.IsDir() || !strings.HasSuffix(d.Name(), ".ini") {
  32. return nil
  33. }
  34. cfg, err := setting.NewConfigProviderForLocale(path)
  35. mustNoErr(err)
  36. inis[path] = cfg
  37. fmt.Printf("collecting: %s @ %s\n", path, ref)
  38. return nil
  39. })
  40. mustNoErr(err)
  41. return inis
  42. }
  43. // collect new locales from current working directory
  44. inisNew := collectInis("HEAD")
  45. // switch to the target ref, and collect the old locales
  46. cmd := exec.Command("git", "checkout", os.Args[1])
  47. cmd.Stdout = os.Stdout
  48. cmd.Stderr = os.Stderr
  49. mustNoErr(cmd.Run())
  50. inisOld := collectInis(os.Args[1])
  51. // use old en-US as the base, and copy the new translations to the old locales
  52. enUsOld := inisOld["options/locale/locale_en-US.ini"]
  53. brokenWarned := make(container.Set[string])
  54. for path, iniOld := range inisOld {
  55. if iniOld == enUsOld {
  56. continue
  57. }
  58. iniNew := inisNew[path]
  59. if iniNew == nil {
  60. continue
  61. }
  62. for _, secEnUS := range enUsOld.Sections() {
  63. secOld := iniOld.Section(secEnUS.Name())
  64. secNew := iniNew.Section(secEnUS.Name())
  65. for _, keyEnUs := range secEnUS.Keys() {
  66. if secNew.HasKey(keyEnUs.Name()) {
  67. oldStr := secOld.Key(keyEnUs.Name()).String()
  68. newStr := secNew.Key(keyEnUs.Name()).String()
  69. broken := oldStr != "" && strings.Count(oldStr, "%") != strings.Count(newStr, "%")
  70. broken = broken || strings.Contains(oldStr, "\n") || strings.Contains(oldStr, "\n")
  71. if broken {
  72. brokenWarned.Add(secOld.Name() + "." + keyEnUs.Name())
  73. fmt.Println("----")
  74. fmt.Printf("WARNING: skip broken locale: %s , [%s] %s\n", path, secEnUS.Name(), keyEnUs.Name())
  75. fmt.Printf("\told: %s\n", strings.ReplaceAll(oldStr, "\n", "\\n"))
  76. fmt.Printf("\tnew: %s\n", strings.ReplaceAll(newStr, "\n", "\\n"))
  77. continue
  78. }
  79. secOld.Key(keyEnUs.Name()).SetValue(newStr)
  80. }
  81. }
  82. }
  83. mustNoErr(iniOld.SaveTo(path))
  84. }
  85. fmt.Println("========")
  86. for path, iniNew := range inisNew {
  87. for _, sec := range iniNew.Sections() {
  88. for _, key := range sec.Keys() {
  89. str := sec.Key(key.Name()).String()
  90. broken := strings.Contains(str, "\n")
  91. broken = broken || strings.HasPrefix(str, "`") != strings.HasSuffix(str, "`")
  92. broken = broken || strings.HasPrefix(str, "\"`")
  93. broken = broken || strings.HasPrefix(str, "`\"")
  94. broken = broken || strings.Count(str, `"`)%2 == 1
  95. broken = broken || strings.Count(str, "`")%2 == 1
  96. if broken && !brokenWarned.Contains(sec.Name()+"."+key.Name()) {
  97. fmt.Printf("WARNING: found broken locale: %s , [%s] %s\n", path, sec.Name(), key.Name())
  98. fmt.Printf("\tstr: %s\n", strings.ReplaceAll(str, "\n", "\\n"))
  99. fmt.Println("----")
  100. }
  101. }
  102. }
  103. }
  104. }