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  }