i18n_test.go (3020B)
1 package web 2 3 import ( 4 "bufio" 5 "strings" 6 "testing" 7 ) 8 9 func TestParsePO(t *testing.T) { 10 po := ` 11 msgid "Hello " 12 "world" 13 msgstr "Hallo " 14 "Welt" 15 16 #, fuzzy 17 msgid "Ignored" 18 msgstr "Ignoriert" 19 ` 20 got := parsePO(po) 21 if got["Hello world"] != "Hallo Welt" { 22 t.Fatalf("translation = %q", got["Hello world"]) 23 } 24 if _, ok := got["Ignored"]; ok { 25 t.Fatal("fuzzy translation was loaded") 26 } 27 } 28 29 func TestFormatNamed(t *testing.T) { 30 if got := formatNamed("Pay {amount} to {receiver}", "amount", "KUDOS:1", "receiver", "GNUnet"); got != "Pay KUDOS:1 to GNUnet" { 31 t.Fatalf("formatted = %q", got) 32 } 33 if got := formatNamed("Pay {amount} to {receiver}", "amount", "{receiver}", "receiver", "GNUnet"); got != "Pay {receiver} to GNUnet" { 34 t.Fatalf("replacement value was formatted again: %q", got) 35 } 36 } 37 38 func TestSamePlaceholders(t *testing.T) { 39 for _, test := range []struct { 40 message string 41 translation string 42 want bool 43 }{ 44 {"Pay {amount} to {receiver}", "Zahle {amount} an {receiver}", true}, 45 {"Pay {amount} to {receiver}", "Zahle {betrag} an {receiver}", false}, 46 {"Use {} twice: {}", "Nutze {} zweimal: {}", true}, 47 {"Use {} twice: {}", "Nutze {} einmal", false}, 48 } { 49 if got := samePlaceholders(test.message, test.translation); got != test.want { 50 t.Errorf("samePlaceholders(%q, %q) = %v, want %v", test.message, test.translation, got, test.want) 51 } 52 } 53 } 54 55 func TestSameHTMLTags(t *testing.T) { 56 if !sameHTMLTags(`Read <a href="{url}"><em>this</em></a>.`, `Lies <a href="{url}"><em>dies</em></a>.`) { 57 t.Fatal("matching HTML tags were rejected") 58 } 59 if sameHTMLTags(`Read <a href="{url}">this</a>.`, `Lies <a href="{url}">dies.`) { 60 t.Fatal("missing closing HTML tag was accepted") 61 } 62 } 63 64 func TestSupportedCatalogsAreComplete(t *testing.T) { 65 catalogs, err := loadCatalogs(supportedLocales) 66 if err != nil { 67 t.Fatal(err) 68 } 69 if len(catalogs) != len(languages) { 70 t.Fatalf("loaded %d catalogs for %d languages", len(catalogs), len(languages)) 71 } 72 pot, err := Assets.ReadFile("assets/translations/messages.pot") 73 if err != nil { 74 t.Fatal(err) 75 } 76 reference := make(map[string]bool) 77 scanner := bufio.NewScanner(strings.NewReader(string(pot))) 78 for scanner.Scan() { 79 line := strings.TrimSpace(scanner.Text()) 80 if !strings.HasPrefix(line, "msgid ") { 81 continue 82 } 83 if message := poString(strings.TrimSpace(strings.TrimPrefix(line, "msgid"))); message != "" { 84 reference[message] = true 85 } 86 } 87 if err := scanner.Err(); err != nil { 88 t.Fatal(err) 89 } 90 for _, language := range languages { 91 if language.Code == "en" { 92 continue 93 } 94 catalog := catalogs[language.Code] 95 if len(catalog) != len(reference) { 96 t.Errorf("catalog %s contains %d usable translations, want %d", language.Code, len(catalog), len(reference)) 97 } 98 for message := range reference { 99 if catalog[message] == "" { 100 t.Errorf("catalog %s does not translate %q", language.Code, message) 101 } 102 } 103 } 104 if supportedLocales["ar"] || catalogs["ar"] != nil { 105 t.Fatal("unsupported Arabic catalog was loaded") 106 } 107 }