// Package miot provides MIoT core client for Xiaomi Home devices. // This file is a direct port of py-miot/miot_i18n.py. package miot import ( "strings" "github.com/sirupsen/logrus" ) // MIoTI18n provides internationalization translation. // Translate by Copilot, which does not guarantee the accuracy of the // translation. If there is a problem with the translation, please submit // the ISSUE feedback. After the review, we will modify it as soon as possible. type MIoTI18n struct { lang string data map[string]interface{} } // NewMIoTI18n creates a new MIoTI18n instance. func NewMIoTI18n(lang string) *MIoTI18n { return &MIoTI18n{ lang: lang, data: make(map[string]interface{}), } } // Init loads the i18n JSON file for the configured language. func (i *MIoTI18n) Init() { if len(i.data) > 0 { return } i.data = make(map[string]interface{}) data, err := LoadJSONFile(GenAbsolutePath("i18n/" + i.lang + ".json")) if err != nil { logrus.Errorf("load i18n file error: %v", err) return } if data == nil { logrus.Errorf("invalid i18n file: nil data") return } i.data = data } // Deinit clears the loaded translation data. func (i *MIoTI18n) Deinit() { i.data = make(map[string]interface{}) } // Translate looks up a translation by dot-separated key. // It traverses nested JSON objects, e.g. "device.light.name" // -> data["device"]["light"]["name"]. // If the key is not found, returns an empty string. // Optional replace map performs placeholder substitution: {key} -> value. func (i *MIoTI18n) Translate(key string, replace map[string]string) string { result := i.lookup(strings.Split(key, ".")) s, ok := result.(string) if !ok { return "" } if replace != nil { for k, v := range replace { s = strings.ReplaceAll(s, "{"+k+"}", v) } } return s } // lookup traverses the nested map using the given key segments. func (i *MIoTI18n) lookup(keys []string) interface{} { var cur interface{} = i.data for _, k := range keys { m, ok := cur.(map[string]interface{}) if !ok { return nil } cur = m[k] if cur == nil { return nil } } return cur }