Skip to content

App Translations

Implement multilingual support in your Fyne applications using JSON translation files and dynamic switching between languages.

Show Code
package main
import (
"encoding/json"
"log"
"os"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
/*translations.json
{
"en": {
"hello": "Hello",
"welcome": "Welcome to my app"
},
"fr": {
"hello": "Bonjour",
"welcome": "Bienvenue dans mon application"
},
"sw": {
"hello": "Hujambo",
"welcome": "Karibu kwenye programu yangu"
}
}
*/
// Translator struct for JSON
type Translator struct {
Translations map[string]map[string]string
}
// Load from file
func LoadTranslations(filename string) (*Translator, error) {
data, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
var t Translator
err = json.Unmarshal(data, &t.Translations)
if err != nil {
return nil, err
}
return &t, nil
}
// Get translation
func (t *Translator) Translate(lang, key string) string {
if val, ok := t.Translations[lang][key]; ok {
return val
}
return key // fallback
}
func main() {
a := app.New()
w := a.NewWindow("App Translations")
// Load JSON translations
translator, err := LoadTranslations("translations.json")
if err != nil {
log.Fatal("Error loading translations:", err)
}
// Default language
lang := "en"
helloLabel := widget.NewLabel(translator.Translate(lang, "hello"))
welcomeLabel := widget.NewLabel(translator.Translate(lang, "welcome"))
// Language selector
langSelect := widget.NewSelect([]string{"en", "fr", "sw"}, func(selected string) {
lang = selected
helloLabel.SetText(translator.Translate(lang, "hello"))
welcomeLabel.SetText(translator.Translate(lang, "welcome"))
})
langSelect.SetSelected("en") // default English
w.SetContent(container.NewVBox(
widget.NewLabel("🌍 Select Language:"),
langSelect,
helloLabel,
welcomeLabel,
))
w.Resize(fyne.NewSize(350, 200))
w.ShowAndRun()
}