tools: align locale diagnostics and generate native language names
Validate / Validate (push) Successful in 2m46s
Validate / Validate (push) Successful in 2m46s
This commit is contained in:
1 parent
b8089e8a7e
commit
d99c5d1dc5
13 files changed
+170
-46
No files matched your search
@@ -0,0 +1,43 @@
|
||||
package logging
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// WarnMissingTranslations groups missing keys without wrapping long key lists.
|
||||
func WarnMissingTranslations(missing map[string][]string) {
|
||||
if message := missingTranslations(missing); message != "" {
|
||||
Warn("Locale", "%s", message)
|
||||
}
|
||||
}
|
||||
|
||||
func missingTranslations(missing map[string][]string) string {
|
||||
languages := make([]string, 0, len(missing))
|
||||
width := len("Language")
|
||||
for lang, keys := range missing {
|
||||
if len(keys) > 0 {
|
||||
languages = append(languages, lang)
|
||||
width = max(width, len(lang))
|
||||
}
|
||||
}
|
||||
if len(languages) == 0 {
|
||||
return ""
|
||||
}
|
||||
sort.Strings(languages)
|
||||
var message strings.Builder
|
||||
fmt.Fprintf(&message, "Missing translation keys:\n%-*s %-8s %s\n", width, "Language", "Fallback", "Key")
|
||||
for _, lang := range languages {
|
||||
keys := append([]string(nil), missing[lang]...)
|
||||
sort.Strings(keys)
|
||||
for i, key := range keys {
|
||||
label, fallback := "", ""
|
||||
if i == 0 {
|
||||
label, fallback = lang, "en-US"
|
||||
}
|
||||
fmt.Fprintf(&message, "%-*s %-8s %s\n", width, label, fallback, key)
|
||||
}
|
||||
}
|
||||
return strings.TrimSuffix(message.String(), "\n")
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package logging
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMissingTranslations(t *testing.T) {
|
||||
missing := map[string][]string{
|
||||
"fr-FR": {"mail.second", "mail.first"},
|
||||
"en-US": nil,
|
||||
"de-DE": {"mail.first"},
|
||||
}
|
||||
want := "Missing translation keys:\n" +
|
||||
"Language Fallback Key\n" +
|
||||
"de-DE en-US mail.first\n" +
|
||||
"fr-FR en-US mail.first\n" +
|
||||
" mail.second"
|
||||
message := missingTranslations(missing)
|
||||
if message != want {
|
||||
t.Fatalf("got %q, want %q", message, want)
|
||||
}
|
||||
if !reflect.DeepEqual(missing["fr-FR"], []string{"mail.second", "mail.first"}) {
|
||||
t.Fatal("report mutated input keys")
|
||||
}
|
||||
var output bytes.Buffer
|
||||
write(&output, true, "W", "Locale", message)
|
||||
for _, line := range strings.Split(strings.TrimSuffix(output.String(), "\n"), "\n") {
|
||||
if !strings.HasPrefix(line, "\033[33m[W]\033[0m [Locale] ") {
|
||||
t.Fatalf("missing warning prefix: %q", line)
|
||||
}
|
||||
}
|
||||
if missingTranslations(nil) != "" || missingTranslations(map[string][]string{"en-US": nil}) != "" {
|
||||
t.Fatal("empty report produced a warning")
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user