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