generate_plurals.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "go/format"
  9. "gopkg.in/yaml.v2"
  10. )
  11. type pluralInfo struct {
  12. path string
  13. locale string
  14. localeNoUnderscore string
  15. plural string
  16. outputFile string
  17. }
  18. // rules downloaded/copied from download github.com/vube/i18n/data/rules
  19. func main() {
  20. rules := "data/rules"
  21. plurals := []pluralInfo{}
  22. basePlurals := map[string]string{}
  23. err := filepath.Walk(rules, func(path string, info os.FileInfo, err error) error {
  24. if err != nil {
  25. panic(err)
  26. }
  27. if info.IsDir() {
  28. return nil
  29. }
  30. in, err := ioutil.ReadFile(path)
  31. if err != nil {
  32. panic(err)
  33. }
  34. var out yaml.MapSlice
  35. if err = yaml.Unmarshal(in, &out); err != nil {
  36. panic(err)
  37. }
  38. var plural string
  39. for _, item := range out {
  40. if item.Key == "plural" {
  41. plural = item.Value.(string)
  42. }
  43. }
  44. locale := strings.Replace(info.Name(), filepath.Ext(info.Name()), "", 1)
  45. locale = strings.Replace(locale, "-", "_", -1)
  46. plurals = append(plurals, pluralInfo{
  47. path: path,
  48. locale: locale,
  49. localeNoUnderscore: strings.ToLower(strings.Replace(locale, "_", "", -1)),
  50. plural: plural,
  51. outputFile: "../../zzz_generated_" + locale + "_plural.go",
  52. })
  53. if plural == "" {
  54. return nil
  55. }
  56. basePlurals[locale] = plural
  57. return nil
  58. })
  59. if err != nil {
  60. panic(err)
  61. }
  62. for _, p := range plurals {
  63. if p.plural == "" {
  64. var ok bool
  65. fmt.Print("can't find plurals in ", p.path, " attempting to locate base language plural rules...")
  66. base := strings.SplitN(p.locale, "_", 2)
  67. p.plural, ok = basePlurals[base[0]]
  68. if !ok {
  69. fmt.Println("Not Found")
  70. continue
  71. }
  72. fmt.Println("Found")
  73. }
  74. if _, err := os.Stat(p.outputFile); err != nil {
  75. fmt.Println(p.outputFile, "doesn't exist")
  76. continue
  77. }
  78. file, err := os.Create(p.outputFile)
  79. if err != nil {
  80. panic(err)
  81. }
  82. rawcodes := fmt.Sprintf(`package ut
  83. const %spluralRule = %q
  84. `, p.localeNoUnderscore, p.plural)
  85. var codes []byte
  86. if codes, err = format.Source([]byte(rawcodes)); err != nil {
  87. panic(err)
  88. }
  89. if _, err := file.Write(codes); err != nil {
  90. panic(err)
  91. }
  92. }
  93. }