summaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2023-03-23 18:27:03 +0100
committerGitHub <noreply@github.com>2023-03-23 18:27:03 +0100
commit95818adb715eb234545889bf51331b80b18bb226 (patch)
tree62b0dd86d5048f889d6a2d4cfa4bf8dda27c5a33 /build
parentFix incorrect `show-modal` and `show-panel` class (#23660) (diff)
downloadforgejo-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.go89
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))
+ }
+}