1 | rsc.io/sampler@v1.3.0 |
---|---|
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.3.0","Name":"0cc034b51e57ed7832d4c67d526f75a900996e5c","Short":"0cc034b51e57","Time":"2018-02-13T19:05:03Z"} |
9 | -- glass.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 from Frank da Cruz, Ethan Mollick, and many others. |
15 | // See http://kermitproject.org/utf8.html. |
16 | // http://www.oocities.org/nodotus/hbglass.html |
17 | // https://en.wikipedia.org/wiki/I_Can_Eat_Glass |
18 | |
19 | package sampler |
20 | |
21 | var glass = newText(` |
22 | |
23 | English: en: I can eat glass and it doesn't hurt me. |
24 | French: fr: Je peux manger du verre, ça ne me fait pas mal. |
25 | Spanish: es: Puedo comer vidrio, no me hace daño. |
26 | |
27 | `) |
28 | -- glass_test.go -- |
29 | // Copyright 2018 The Go Authors. All rights reserved. |
30 | // Use of this source code is governed by a BSD-style |
31 | // license that can be found in the LICENSE file. |
32 | |
33 | package sampler |
34 | |
35 | import ( |
36 | "testing" |
37 | |
38 | "golang.org/x/text/language" |
39 | _ "rsc.io/testonly" |
40 | ) |
41 | |
42 | var glassTests = []struct { |
43 | prefs []language.Tag |
44 | text string |
45 | }{ |
46 | { |
47 | []language.Tag{language.Make("en-US"), language.Make("fr")}, |
48 | "I can eat glass and it doesn't hurt me.", |
49 | }, |
50 | { |
51 | []language.Tag{language.Make("fr"), language.Make("en-US")}, |
52 | "Je peux manger du verre, ça ne me fait pas mal.", |
53 | }, |
54 | } |
55 | |
56 | func TestGlass(t *testing.T) { |
57 | for _, tt := range glassTests { |
58 | text := Glass(tt.prefs...) |
59 | if text != tt.text { |
60 | t.Errorf("Glass(%v) = %q, want %q", tt.prefs, text, tt.text) |
61 | } |
62 | } |
63 | } |
64 | -- go.mod -- |
65 | module "rsc.io/sampler" |
66 | |
67 | require "golang.org/x/text" v0.0.0-20170915032832-14c0d48ead0c |
68 | -- hello.go -- |
69 | // Copyright 2018 The Go Authors. All rights reserved. |
70 | // Use of this source code is governed by a BSD-style |
71 | // license that can be found in the LICENSE file. |
72 | |
73 | // Translations by Google Translate. |
74 | |
75 | package sampler |
76 | |
77 | var hello = newText(` |
78 | |
79 | English: en: Hello, world. |
80 | French: fr: Bonjour le monde. |
81 | Spanish: es: Hola Mundo. |
82 | |
83 | `) |
84 | -- hello_test.go -- |
85 | // Copyright 2018 The Go Authors. All rights reserved. |
86 | // Use of this source code is governed by a BSD-style |
87 | // license that can be found in the LICENSE file. |
88 | |
89 | package sampler |
90 | |
91 | import ( |
92 | "testing" |
93 | |
94 | "golang.org/x/text/language" |
95 | ) |
96 | |
97 | var helloTests = []struct { |
98 | prefs []language.Tag |
99 | text string |
100 | }{ |
101 | { |
102 | []language.Tag{language.Make("en-US"), language.Make("fr")}, |
103 | "Hello, world.", |
104 | }, |
105 | { |
106 | []language.Tag{language.Make("fr"), language.Make("en-US")}, |
107 | "Bonjour le monde.", |
108 | }, |
109 | } |
110 | |
111 | func TestHello(t *testing.T) { |
112 | for _, tt := range helloTests { |
113 | text := Hello(tt.prefs...) |
114 | if text != tt.text { |
115 | t.Errorf("Hello(%v) = %q, want %q", tt.prefs, text, tt.text) |
116 | } |
117 | } |
118 | } |
119 | -- sampler.go -- |
120 | // Copyright 2018 The Go Authors. All rights reserved. |
121 | // Use of this source code is governed by a BSD-style |
122 | // license that can be found in the LICENSE file. |
123 | |
124 | // Package sampler shows simple texts. |
125 | package sampler // import "rsc.io/sampler" |
126 | |
127 | import ( |
128 | "os" |
129 | "strings" |
130 | |
131 | "golang.org/x/text/language" |
132 | ) |
133 | |
134 | // DefaultUserPrefs returns the default user language preferences. |
135 | // It consults the $LC_ALL, $LC_MESSAGES, and $LANG environment |
136 | // variables, in that order. |
137 | func DefaultUserPrefs() []language.Tag { |
138 | var prefs []language.Tag |
139 | for _, k := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} { |
140 | if env := os.Getenv(k); env != "" { |
141 | prefs = append(prefs, language.Make(env)) |
142 | } |
143 | } |
144 | return prefs |
145 | } |
146 | |
147 | // Hello returns a localized greeting. |
148 | // If no prefs are given, Hello uses DefaultUserPrefs. |
149 | func Hello(prefs ...language.Tag) string { |
150 | if len(prefs) == 0 { |
151 | prefs = DefaultUserPrefs() |
152 | } |
153 | return hello.find(prefs) |
154 | } |
155 | |
156 | // Glass returns a localized silly phrase. |
157 | // If no prefs are given, Glass uses DefaultUserPrefs. |
158 | func Glass(prefs ...language.Tag) string { |
159 | if len(prefs) == 0 { |
160 | prefs = DefaultUserPrefs() |
161 | } |
162 | return glass.find(prefs) |
163 | } |
164 | |
165 | // A text is a localized text. |
166 | type text struct { |
167 | byTag map[string]string |
168 | matcher language.Matcher |
169 | } |
170 | |
171 | // newText creates a new localized text, given a list of translations. |
172 | func newText(s string) *text { |
173 | t := &text{ |
174 | byTag: make(map[string]string), |
175 | } |
176 | var tags []language.Tag |
177 | for _, line := range strings.Split(s, "\n") { |
178 | line = strings.TrimSpace(line) |
179 | if line == "" { |
180 | continue |
181 | } |
182 | f := strings.Split(line, ": ") |
183 | if len(f) != 3 { |
184 | continue |
185 | } |
186 | tag := language.Make(f[1]) |
187 | tags = append(tags, tag) |
188 | t.byTag[tag.String()] = f[2] |
189 | } |
190 | t.matcher = language.NewMatcher(tags) |
191 | return t |
192 | } |
193 | |
194 | // find finds the text to use for the given language tag preferences. |
195 | func (t *text) find(prefs []language.Tag) string { |
196 | tag, _, _ := t.matcher.Match(prefs...) |
197 | s := t.byTag[tag.String()] |
198 | if strings.HasPrefix(s, "RTL ") { |
199 | s = "\u200F" + strings.TrimPrefix(s, "RTL ") + "\u200E" |
200 | } |
201 | return s |
202 | } |
203 |
Members