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.
35 lines
1.0 KiB
Go
35 lines
1.0 KiB
Go
//go:build !android && !ios && !freebsd && !js
|
|
|
|
package services
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/netbirdio/netbird/client/ui/i18n"
|
|
)
|
|
|
|
// I18n is the Wails-bound facade over i18n.Bundle. It exists only to give
|
|
// the binding generator a service type with the context.Context-first
|
|
// signatures it expects; the translation logic, locale loading and the
|
|
// LanguageCode type all live in client/ui/i18n.
|
|
type I18n struct {
|
|
bundle *i18n.Bundle
|
|
}
|
|
|
|
func NewI18n(bundle *i18n.Bundle) *I18n {
|
|
return &I18n{bundle: bundle}
|
|
}
|
|
|
|
// Languages exposes the list of shipped locales to the frontend so the
|
|
// settings page can populate its language picker.
|
|
func (s *I18n) Languages(_ context.Context) ([]i18n.Language, error) {
|
|
return s.bundle.Languages(), nil
|
|
}
|
|
|
|
// Bundle returns the full key->text map for one language, letting the
|
|
// React side drive its own translation library (i18next, etc.) off the
|
|
// same source bundles the tray uses.
|
|
func (s *I18n) Bundle(_ context.Context, code i18n.LanguageCode) (map[string]string, error) {
|
|
return s.bundle.BundleFor(code)
|
|
}
|