diff options
author | wxiaoguang <wxiaoguang@gmail.com> | 2023-03-23 18:27:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-23 18:27:03 +0100 |
commit | 95818adb715eb234545889bf51331b80b18bb226 (patch) | |
tree | 62b0dd86d5048f889d6a2d4cfa4bf8dda27c5a33 /build | |
parent | Fix incorrect `show-modal` and `show-panel` class (#23660) (diff) | |
download | forgejo-95818adb715eb234545889bf51331b80b18bb226.tar.xz forgejo-95818adb715eb234545889bf51331b80b18bb226.zip |
A tool to help to backport locales, changes source strings to fix other broken translations (#23633)
It use old en-US locales as reference, fill the old other locales with
new locales.
----
## More broken translations
Many translations are still broken. The reason is: at the last time
restoring the ini to crowdin, many semicolon are treated as comments.
Two kinds of broken strings:
### Some translations can be re-translated
<details>
```
skipping options/locale/locale_si-LK.ini org teams.add_nonexistent_repo
skipping options/locale/locale_tr-TR.ini repo commits.search.tooltip
skipping options/locale/locale_es-ES.ini repo settings.trust_model.committer.desc
skipping options/locale/locale_es-ES.ini admin dashboard.new_version_hint
skipping options/locale/locale_pt-PT.ini org teams.add_nonexistent_repo
skipping options/locale/locale_hu-HU.ini install require_sign_in_view_popup
skipping options/locale/locale_hu-HU.ini repo migrate.invalid_local_path
skipping options/locale/locale_id-ID.ini repo migrate.invalid_local_path
skipping options/locale/locale_id-ID.ini org teams.add_nonexistent_repo
skipping options/locale/locale_de-DE.ini repo settings.protect_protected_file_patterns_desc
```
</details>
So this PR also does some small changes on them, to trigger the
re-translation.
### The `locale_el-GR.ini` contains many broken tranlsations
I guess we should reset them from crowdin side, then translators can
re-translate them.
----
Update: in latest main, the strings have been fixed.
## TODO
Update: the el-GR translators have done great job and fixes these broken
translations.
<details>
Merge this PR ASAP and upload `locale_el-GR.ini` to crowdin to remove
broken strings.
Out-dated, fixed in main.
![image](https://user-images.githubusercontent.com/2114189/226954531-36e14527-278a-41a1-8ddb-2b2b27bfc746.png)
</details>
---------
Co-authored-by: delvh <dev.lh@web.de>
Diffstat (limited to 'build')
-rw-r--r-- | build/backport-locales.go | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/build/backport-locales.go b/build/backport-locales.go new file mode 100644 index 0000000000..efaae52bd4 --- /dev/null +++ b/build/backport-locales.go @@ -0,0 +1,89 @@ +//go:build ignore + +package main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "gopkg.in/ini.v1" +) + +func main() { + if len(os.Args) != 2 { + println("usage: backport-locales <to-ref>") + println("eg: backport-locales release/v1.19") + os.Exit(1) + } + + ini.PrettyFormat = false + mustNoErr := func(err error) { + if err != nil { + panic(err) + } + } + collectInis := func(ref string) map[string]*ini.File { + inis := map[string]*ini.File{} + err := filepath.WalkDir("options/locale", func(path string, d os.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() || !strings.HasSuffix(d.Name(), ".ini") { + return nil + } + cfg, err := ini.LoadSources(ini.LoadOptions{ + IgnoreInlineComment: true, + UnescapeValueCommentSymbols: true, + }, path) + mustNoErr(err) + inis[path] = cfg + fmt.Printf("collecting: %s @ %s\n", path, ref) + return nil + }) + mustNoErr(err) + return inis + } + + // collect new locales from current working directory + inisNew := collectInis("HEAD") + + // switch to the target ref, and collect the old locales + cmd := exec.Command("git", "checkout", os.Args[1]) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + mustNoErr(cmd.Run()) + inisOld := collectInis(os.Args[1]) + + // use old en-US as the base, and copy the new translations to the old locales + enUsOld := inisOld["options/locale/locale_en-US.ini"] + for path, iniOld := range inisOld { + if iniOld == enUsOld { + continue + } + iniNew := inisNew[path] + if iniNew == nil { + continue + } + for _, secEnUS := range enUsOld.Sections() { + secOld := iniOld.Section(secEnUS.Name()) + secNew := iniNew.Section(secEnUS.Name()) + for _, keyEnUs := range secEnUS.Keys() { + if secNew.HasKey(keyEnUs.Name()) { + oldStr := secOld.Key(keyEnUs.Name()).String() + newStr := secNew.Key(keyEnUs.Name()).String() + // A bug: many of new translations with ";" are broken in Crowdin (due to last messy restoring) + // As the broken strings are gradually fixed, this workaround check could be removed (in a few months?) + if strings.Contains(oldStr, ";") && !strings.Contains(newStr, ";") { + println("skip potential broken string", path, secEnUS.Name(), keyEnUs.Name()) + continue + } + secOld.Key(keyEnUs.Name()).SetValue(newStr) + } + } + } + mustNoErr(iniOld.SaveTo(path)) + } +} |