fix translations

This commit is contained in:
olebeck 2023-01-23 19:18:01 +01:00
parent 7d2974c9c4
commit 1160e025ec
6 changed files with 159 additions and 22 deletions

View File

@ -61,6 +61,7 @@ func main() {
flag.BoolVar(&utils.G_debug, "debug", false, locale.Loc("debug_mode", nil))
flag.BoolVar(&utils.G_preload_packs, "preload", false, locale.Loc("preload_packs", nil))
flag.String("lang", "", "lang")
enable_dns := flag.Bool("dns", false, locale.Loc("enable_dns", nil))
subcommands.Register(subcommands.HelpCommand(), "")

2
go.mod
View File

@ -6,7 +6,7 @@ go 1.19
replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.26.2
//replace github.com/df-mc/dragonfly => ./dragonfly
replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-1
replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-2
require (
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21

2
go.sum
View File

@ -68,6 +68,8 @@ github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYo
github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0=
github.com/olebeck/dragonfly v0.9.1-1 h1:b5CIocRvmxdesW6N6V87xTDH4fFLVthb1GRptbbqDuc=
github.com/olebeck/dragonfly v0.9.1-1/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/dragonfly v0.9.1-2 h1:Rry/efQl4ORUakJNTnHCY0vB6AUmZuUpy+PsLSbWoRY=
github.com/olebeck/dragonfly v0.9.1-2/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/gophertunnel v1.26.2 h1:AbiZcmeR5LenSJ5NX/2BPxLC3ddlvgWjrjouPmOB6BA=
github.com/olebeck/gophertunnel v1.26.2/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=

View File

@ -2,7 +2,10 @@ package locale
import (
"embed"
"flag"
"fmt"
"io"
"os"
"github.com/cloudfoundry-attic/jibber_jabber"
"github.com/nicksnyder/go-i18n/v2/i18n"
@ -18,7 +21,6 @@ var localesFS embed.FS
var lang *i18n.Localizer
func load_language(bundle *i18n.Bundle, tag language.Tag) error {
logrus.Infof("Using Language %s", tag.String())
_, err := bundle.LoadMessageFileFS(localesFS, fmt.Sprintf("%s.yaml", tag.String()))
return err
}
@ -27,14 +29,19 @@ func init() {
var defaultTag language.Tag = language.English
var err error
// get default language
var languageName string
languageName, err = jibber_jabber.DetectLanguage()
if err == nil {
defaultTag, err = language.Parse(languageName)
if err != nil {
logrus.Warn("failed to parse language name")
}
f := flag.NewFlagSet("bedrocktool", flag.ContinueOnError)
f.SetOutput(io.Discard)
f.StringVar(&languageName, "lang", "", "")
f.Parse(os.Args[1:])
// get default language
if languageName == "" {
languageName, _ = jibber_jabber.DetectLanguage()
}
defaultTag, err = language.Parse(languageName)
if err != nil {
logrus.Warn("failed to parse language name")
}
bundle := i18n.NewBundle(defaultTag)
@ -43,7 +50,7 @@ func init() {
if defaultTag != language.English {
err = load_language(bundle, language.English)
if err != nil {
panic("failed to load english language")
logrus.Error("failed to load english language")
}
}
@ -52,11 +59,7 @@ func init() {
logrus.Warnf("Couldnt load Language %s", languageName)
}
lang = i18n.NewLocalizer(bundle)
}
func Locm(id string, tmpl Strmap, count int) string {
return Loc(id, tmpl)
lang = i18n.NewLocalizer(bundle, defaultTag.String(), "en")
}
func Loc(id string, tmpl Strmap) string {
@ -69,3 +72,15 @@ func Loc(id string, tmpl Strmap) string {
}
return s
}
func Locm(id string, tmpl Strmap, count int) string {
s, err := lang.Localize(&i18n.LocalizeConfig{
MessageID: id,
TemplateData: tmpl,
PluralCount: count,
})
if err != nil {
return fmt.Sprintf("failed to translate! %s", id)
}
return s
}

View File

@ -16,6 +16,7 @@ import (
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/bedrock-tool/bedrocktool/utils/behaviourpack"
"github.com/bedrock-tool/bedrocktool/utils/nbtconv"
"github.com/df-mc/dragonfly/server/block"
@ -64,6 +65,7 @@ type WorldState struct {
ServerName string
worldCounter int
packs map[string]*resource.Pack
bp *behaviourpack.BehaviourPack
withPacks bool
saveImage bool
@ -175,8 +177,9 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
err = proxy.Run(ctx, server_address)
if err != nil {
logrus.Error(err)
} else {
w.SaveAndReset()
}
w.SaveAndReset()
return 0
}
@ -447,6 +450,16 @@ func (w *WorldState) SaveAndReset() {
utils.UnpackZip(bytes.NewReader(data), int64(len(data)), pack_folder)
}
if w.bp != nil {
f, err := os.Create(path.Join(folder, "bp.mcpack"))
if err != nil {
logrus.Error(err)
} else {
w.bp.Save(f)
f.Close()
}
}
if w.saveImage {
f, _ := os.Create(folder + ".png")
png.Encode(f, w.ui.ToImage())
@ -470,12 +483,13 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext) {
if len(gd.CustomBlocks) > 0 {
logrus.Info(locale.Loc("using_customblocks", nil))
/*
for _, be := range gd.CustomBlocks {
b := block.ServerCustomBlock(be)
world.RegisterBlock(b)
}
*/
w.bp = behaviourpack.New(w.ServerName + " Custom Blocks")
for _, be := range gd.CustomBlocks {
w.bp.AddBlock(be)
}
// telling the chunk code what custom blocks there are so it can generate offsets
world.InsertCustomBlocks(gd.CustomBlocks)
}
if w.withPacks {

105
utils/behaviourpack/bp.go Normal file
View File

@ -0,0 +1,105 @@
package behaviourpack
import (
"archive/zip"
"bytes"
"encoding/json"
"fmt"
"io"
"strings"
"github.com/google/uuid"
"github.com/sandertv/gophertunnel/minecraft/protocol"
"github.com/sandertv/gophertunnel/minecraft/resource"
"github.com/sirupsen/logrus"
)
type BehaviourPack struct {
manifest *resource.Manifest
blocks []blockBehaviour
}
type description struct {
Identifier string `json:"identifier"`
IsExperimental bool `json:"is_experimental"`
RegisterToCreativeMenu bool `json:"register_to_creative_menu"`
}
type minecraftBlock struct {
Description description `json:"description"`
Components map[string]interface{} `json:"components"`
}
type blockBehaviour struct {
FormatVersion string `json:"format_version"`
MinecraftBlock minecraftBlock `json:"minecraft:block"`
}
func check(err error) {
if err != nil {
logrus.Fatal(err)
}
}
func rand_seeded_uuid(str string) string {
id, _ := uuid.NewRandomFromReader(bytes.NewBufferString(str))
return id.String()
}
func New(name string) *BehaviourPack {
return &BehaviourPack{
manifest: &resource.Manifest{
FormatVersion: 2,
Header: resource.Header{
Name: "pack.name",
Description: "pack.description",
UUID: rand_seeded_uuid(name + "_datapack"),
Version: [3]int{1, 0, 0},
MinimumGameVersion: [3]int{1, 16, 0},
},
Modules: []resource.Module{
{
Type: "data",
UUID: rand_seeded_uuid(name + "_data_module"),
Version: [3]int{1, 0, 0},
},
},
Dependencies: []resource.Dependency{},
Capabilities: []resource.Capability{},
},
}
}
func (bp *BehaviourPack) AddBlock(block protocol.BlockEntry) {
entry := blockBehaviour{
FormatVersion: "1.12.0",
MinecraftBlock: minecraftBlock{
Description: description{
Identifier: block.Name,
IsExperimental: false,
RegisterToCreativeMenu: true,
},
Components: block.Properties,
},
}
bp.blocks = append(bp.blocks, entry)
}
func (bp *BehaviourPack) Save(w io.Writer) {
z := zip.NewWriter(w)
defer z.Close()
{ // write manifest
w, err := z.Create("manifest.json")
check(err)
check(json.NewEncoder(w).Encode(bp.manifest))
}
{ // blocks
for _, be := range bp.blocks {
ns := strings.Split(be.MinecraftBlock.Description.Identifier, ":")
name := ns[len(ns)-1]
w, err := z.Create(fmt.Sprintf("blocks/%s.json", name))
check(err)
check(json.NewEncoder(w).Encode(be))
}
}
}