github.com/df-mc/dragonfly@v0.9.13/server/internal/lang/lang.go (about) 1 package lang 2 3 import ( 4 "embed" 5 "encoding/json" 6 "github.com/df-mc/dragonfly/server/world" 7 "golang.org/x/text/language" 8 ) 9 10 // itemHash is a combination of an item's name and metadata. It is used as a key in hash maps. 11 type itemHash struct { 12 name string 13 meta int16 14 } 15 16 var ( 17 //go:embed names/* 18 namesFS embed.FS 19 // names is a mapping from language.Tag to an item->display name mapping. 20 names = make(map[language.Tag]map[itemHash]string) 21 ) 22 23 // DisplayName returns the display name of the item as shown in game in the language passed. 24 func DisplayName(item world.Item, locale language.Tag) (string, bool) { 25 id, meta := item.EncodeItem() 26 h := itemHash{name: id, meta: meta} 27 28 if _, ok := names[locale]; !ok && !load(locale) { 29 // Language not supported, default to American English. 30 return names[language.AmericanEnglish][h], false 31 } 32 33 name, ok := names[locale][h] 34 return name, ok 35 } 36 37 // load loads the locale for the item display names. 38 func load(locale language.Tag) bool { 39 b, err := namesFS.ReadFile("names/" + locale.String() + ".json") 40 if err != nil { 41 return false 42 } 43 44 var entries []struct { 45 ID string `json:"id"` 46 Meta int16 `json:"meta,omitempty"` 47 Name string `json:"name"` 48 } 49 err = json.Unmarshal(b, &entries) 50 if err != nil { 51 panic(err) 52 } 53 54 names[locale] = make(map[itemHash]string, len(entries)) 55 for _, entry := range entries { 56 h := itemHash{name: entry.ID, meta: entry.Meta} 57 names[locale][h] = entry.Name 58 } 59 return true 60 }