mirror of
https://github.com/netbirdio/netbird.git
synced 2026-05-16 21:59:56 +00:00
Adds a tray + React translation pipeline driven by a single JSON locale tree (frontend/src/i18n/locales) embedded into the Go binary. The tray re-renders on language switch via a Localizer that subscribes to the preferences store. Layout: - client/ui/i18n: Bundle, LanguageCode, Language, errors, embedded-FS loader. Pure domain, no Wails/daemon deps. - client/ui/preferences: Store + UIPreferences for user-scope UI state, persisted under os.UserConfigDir()/netbird/ui-preferences.json with atomic writes and a subscribe/broadcast channel. - client/ui/services: thin Wails-binding facades (services.I18n, services.Preferences) so React sees ctx-first signatures. - client/ui/localizer.go: tray bridge that owns the active language, exposes T()/StatusLabel() and re-paints the menu on prefs change. - tray.go: every user-facing const replaced by translation keys via t.loc.T(...); menu rebuild + state replay on language switch. - main.go: //go:embed all:frontend/src/i18n/locales, wires Bundle -> Store -> Localizer -> Wails facades in order. Frontend API exposed via Wails bindings: I18n.Languages, I18n.Bundle, Preferences.Get, Preferences.SetLanguage, plus the netbird:preferences:changed event. Includes regenerated Wails TS bindings (peers/profileswitcher/etc. re-emitted as part of the build) and en/hu seed bundles.
33 lines
946 B
Go
33 lines
946 B
Go
//go:build !android && !ios && !freebsd && !js
|
|
|
|
package services
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/netbirdio/netbird/client/ui/i18n"
|
|
"github.com/netbirdio/netbird/client/ui/preferences"
|
|
)
|
|
|
|
// Preferences is the Wails-bound facade over preferences.Store. The store
|
|
// itself owns persistence and the subscription channel; this type just
|
|
// re-exposes Get and SetLanguage with the context.Context-first signature
|
|
// the Wails binding generator wants.
|
|
type Preferences struct {
|
|
store *preferences.Store
|
|
}
|
|
|
|
func NewPreferences(store *preferences.Store) *Preferences {
|
|
return &Preferences{store: store}
|
|
}
|
|
|
|
// Get returns the current user-scope preferences.
|
|
func (s *Preferences) Get(_ context.Context) (preferences.UIPreferences, error) {
|
|
return s.store.Get(), nil
|
|
}
|
|
|
|
// SetLanguage validates and persists a new UI language.
|
|
func (s *Preferences) SetLanguage(_ context.Context, lang i18n.LanguageCode) error {
|
|
return s.store.SetLanguage(lang)
|
|
}
|