Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/cmd/lang.go
1541 views
1
/*
2
Package cmd
3
Copyright © 2022 Noah Hsu<[email protected]>
4
*/
5
package cmd
6
7
import (
8
"fmt"
9
"io"
10
"os"
11
"reflect"
12
"strings"
13
14
_ "github.com/alist-org/alist/v3/drivers"
15
"github.com/alist-org/alist/v3/internal/bootstrap"
16
"github.com/alist-org/alist/v3/internal/bootstrap/data"
17
"github.com/alist-org/alist/v3/internal/conf"
18
"github.com/alist-org/alist/v3/internal/op"
19
"github.com/alist-org/alist/v3/pkg/utils"
20
log "github.com/sirupsen/logrus"
21
"github.com/spf13/cobra"
22
)
23
24
type KV[V any] map[string]V
25
26
type Drivers KV[KV[interface{}]]
27
28
func firstUpper(s string) string {
29
if s == "" {
30
return ""
31
}
32
return strings.ToUpper(s[:1]) + s[1:]
33
}
34
35
func convert(s string) string {
36
ss := strings.Split(s, "_")
37
ans := strings.Join(ss, " ")
38
return firstUpper(ans)
39
}
40
41
func writeFile(name string, data interface{}) {
42
f, err := os.Open(fmt.Sprintf("../alist-web/src/lang/en/%s.json", name))
43
if err != nil {
44
log.Errorf("failed to open %s.json: %+v", name, err)
45
return
46
}
47
defer f.Close()
48
content, err := io.ReadAll(f)
49
if err != nil {
50
log.Errorf("failed to read %s.json: %+v", name, err)
51
return
52
}
53
oldData := make(map[string]interface{})
54
newData := make(map[string]interface{})
55
err = utils.Json.Unmarshal(content, &oldData)
56
if err != nil {
57
log.Errorf("failed to unmarshal %s.json: %+v", name, err)
58
return
59
}
60
content, err = utils.Json.Marshal(data)
61
if err != nil {
62
log.Errorf("failed to marshal json: %+v", err)
63
return
64
}
65
err = utils.Json.Unmarshal(content, &newData)
66
if err != nil {
67
log.Errorf("failed to unmarshal json: %+v", err)
68
return
69
}
70
if reflect.DeepEqual(oldData, newData) {
71
log.Infof("%s.json no changed, skip", name)
72
} else {
73
log.Infof("%s.json changed, update file", name)
74
//log.Infof("old: %+v\nnew:%+v", oldData, data)
75
utils.WriteJsonToFile(fmt.Sprintf("lang/%s.json", name), newData, true)
76
}
77
}
78
79
func generateDriversJson() {
80
drivers := make(Drivers)
81
drivers["drivers"] = make(KV[interface{}])
82
drivers["config"] = make(KV[interface{}])
83
driverInfoMap := op.GetDriverInfoMap()
84
for k, v := range driverInfoMap {
85
drivers["drivers"][k] = convert(k)
86
items := make(KV[interface{}])
87
config := map[string]string{}
88
if v.Config.Alert != "" {
89
alert := strings.SplitN(v.Config.Alert, "|", 2)
90
if len(alert) > 1 {
91
config["alert"] = alert[1]
92
}
93
}
94
drivers["config"][k] = config
95
for i := range v.Additional {
96
item := v.Additional[i]
97
items[item.Name] = convert(item.Name)
98
if item.Help != "" {
99
items[fmt.Sprintf("%s-tips", item.Name)] = item.Help
100
}
101
if item.Type == conf.TypeSelect && len(item.Options) > 0 {
102
options := make(KV[string])
103
_options := strings.Split(item.Options, ",")
104
for _, o := range _options {
105
options[o] = convert(o)
106
}
107
items[fmt.Sprintf("%ss", item.Name)] = options
108
}
109
}
110
drivers[k] = items
111
}
112
writeFile("drivers", drivers)
113
}
114
115
func generateSettingsJson() {
116
settings := data.InitialSettings()
117
settingsLang := make(KV[any])
118
for _, setting := range settings {
119
settingsLang[setting.Key] = convert(setting.Key)
120
if setting.Help != "" {
121
settingsLang[fmt.Sprintf("%s-tips", setting.Key)] = setting.Help
122
}
123
if setting.Type == conf.TypeSelect && len(setting.Options) > 0 {
124
options := make(KV[string])
125
_options := strings.Split(setting.Options, ",")
126
for _, o := range _options {
127
options[o] = convert(o)
128
}
129
settingsLang[fmt.Sprintf("%ss", setting.Key)] = options
130
}
131
}
132
writeFile("settings", settingsLang)
133
//utils.WriteJsonToFile("lang/settings.json", settingsLang)
134
}
135
136
// LangCmd represents the lang command
137
var LangCmd = &cobra.Command{
138
Use: "lang",
139
Short: "Generate language json file",
140
Run: func(cmd *cobra.Command, args []string) {
141
bootstrap.InitConfig()
142
err := os.MkdirAll("lang", 0777)
143
if err != nil {
144
utils.Log.Fatalf("failed create folder: %s", err.Error())
145
}
146
generateDriversJson()
147
generateSettingsJson()
148
},
149
}
150
151
func init() {
152
RootCmd.AddCommand(LangCmd)
153
154
// Here you will define your flags and configuration settings.
155
156
// Cobra supports Persistent Flags which will work for this command
157
// and all subcommands, e.g.:
158
// langCmd.PersistentFlags().String("foo", "", "A help for foo")
159
160
// Cobra supports local flags which will only run when this command
161
// is called directly, e.g.:
162
// langCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
163
}
164
165