Text file
src/cmd/go/testdata/mod/rsc.io_sampler_v1.2.1.txt
1 generated by ./addmod.bash rsc.io/sampler@v1.2.1
2
3 -- .mod --
4 module "rsc.io/sampler"
5
6 require "golang.org/x/text" v0.0.0-20170915032832-14c0d48ead0c
7 -- .info --
8 {"Version":"v1.2.1","Name":"cac3af4f8a0ab40054fa6f8d423108a63a1255bb","Short":"cac3af4f8a0a","Time":"2018-02-13T18:16:22Z"}
9 -- hello.go --
10 // Copyright 2018 The Go Authors. All rights reserved.
11 // Use of this source code is governed by a BSD-style
12 // license that can be found in the LICENSE file.
13
14 // Translations by Google Translate.
15
16 package sampler
17
18 var hello = newText(`
19
20 English: en: Hello, world.
21 French: fr: Bonjour le monde.
22 Spanish: es: Hola Mundo.
23
24 `)
25 -- hello_test.go --
26 // Copyright 2018 The Go Authors. All rights reserved.
27 // Use of this source code is governed by a BSD-style
28 // license that can be found in the LICENSE file.
29
30 package sampler
31
32 import (
33 "testing"
34
35 "golang.org/x/text/language"
36 )
37
38 var helloTests = []struct {
39 prefs []language.Tag
40 text string
41 }{
42 {
43 []language.Tag{language.Make("en-US"), language.Make("fr")},
44 "Hello, world.",
45 },
46 {
47 []language.Tag{language.Make("fr"), language.Make("en-US")},
48 "Bonjour le monde.",
49 },
50 }
51
52 func TestHello(t *testing.T) {
53 for _, tt := range helloTests {
54 text := Hello(tt.prefs...)
55 if text != tt.text {
56 t.Errorf("Hello(%v) = %q, want %q", tt.prefs, text, tt.text)
57 }
58 }
59 }
60 -- sampler.go --
61 // Copyright 2018 The Go Authors. All rights reserved.
62 // Use of this source code is governed by a BSD-style
63 // license that can be found in the LICENSE file.
64
65 // Package sampler shows simple texts.
66 package sampler // import "rsc.io/sampler"
67
68 import (
69 "os"
70 "strings"
71
72 "golang.org/x/text/language"
73 )
74
75 // DefaultUserPrefs returns the default user language preferences.
76 // It consults the $LC_ALL, $LC_MESSAGES, and $LANG environment
77 // variables, in that order.
78 func DefaultUserPrefs() []language.Tag {
79 var prefs []language.Tag
80 for _, k := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} {
81 if env := os.Getenv(k); env != "" {
82 prefs = append(prefs, language.Make(env))
83 }
84 }
85 return prefs
86 }
87
88 // Hello returns a localized greeting.
89 // If no prefs are given, Hello uses DefaultUserPrefs.
90 func Hello(prefs ...language.Tag) string {
91 if len(prefs) == 0 {
92 prefs = DefaultUserPrefs()
93 }
94 return hello.find(prefs)
95 }
96
97 // A text is a localized text.
98 type text struct {
99 byTag map[string]string
100 matcher language.Matcher
101 }
102
103 // newText creates a new localized text, given a list of translations.
104 func newText(s string) *text {
105 t := &text{
106 byTag: make(map[string]string),
107 }
108 var tags []language.Tag
109 for _, line := range strings.Split(s, "\n") {
110 line = strings.TrimSpace(line)
111 if line == "" {
112 continue
113 }
114 f := strings.Split(line, ": ")
115 if len(f) != 3 {
116 continue
117 }
118 tag := language.Make(f[1])
119 tags = append(tags, tag)
120 t.byTag[tag.String()] = f[2]
121 }
122 t.matcher = language.NewMatcher(tags)
123 return t
124 }
125
126 // find finds the text to use for the given language tag preferences.
127 func (t *text) find(prefs []language.Tag) string {
128 tag, _, _ := t.matcher.Match(prefs...)
129 s := t.byTag[tag.String()]
130 if strings.HasPrefix(s, "RTL ") {
131 s = "\u200F" + strings.TrimPrefix(s, "RTL ") + "\u200E"
132 }
133 return s
134 }
135
View as plain text