/
syncer.go
76 lines (63 loc) · 1.89 KB
/
syncer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package kdlscan2
import (
"errors"
"log"
"time"
"github.com/alunegov/kdlscan2/file/lng"
)
// Sync синхронизирует перевод ресурсов между двумя lng-файлами
func Sync(targetFileName string, refFileName string) error {
if err := createBackup(targetFileName); err != nil {
return err
}
target, err := lng.Load(targetFileName + backupFileExt)
if err != nil {
return err
}
ref, err := lng.Load(refFileName)
if err != nil {
return err
}
if err := syncResourceStrings(target, ref); err != nil {
return err
}
if target.Changed {
target.UpdateTime = time.Now()
}
if err := lng.Save(target, targetFileName); err != nil {
return err
}
return nil
}
func syncResourceStrings(targetFile *lng.File, refFile *lng.File) error {
targetSection := targetFile.Section(resourceStringSection)
if targetSection == nil {
return errors.New("ResourceStrings section in target is absent")
}
refSection := refFile.Section(resourceStringSection)
if refSection == nil {
return errors.New("ResourceStrings section in ref is absent")
}
refSection.FilterKey(func(k *lng.Key) bool {
return k.Flag() == lng.Std
})
// если это файл после kdl или чистый lng-файл, удаляем коды
refSection.ForEachKey(func(k *lng.Key) {
_ = k.StripResID()
})
targetSection.ForEachKey(func(k *lng.Key) {
if k.Flag() == lng.Deleted {
return
}
_, name, _ := k.DecodeName() // если это файл после kdl или чистый lng-файл, берём только имя, без кода
refKey, _ := refSection.Key(name)
if refKey != nil && (k.Value() != refKey.Value() || k.Flag() == lng.Modified) {
// TODO: внедрять logger через DI
log.Printf("%s:\n", k.Name())
log.Printf(" '%s' -> '%s'\n", k.Value(), refKey.Value())
k.SetFlag(lng.Std)
k.SetValue(refKey.Value())
}
})
return nil
}