From a2e7f01cbb4ed84f52cc296801a19b672f3eaf11 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 04:20:04 +0000 Subject: [PATCH] feat(i18n): expose fallback language accessors Co-Authored-By: Virgil --- i18n.go | 15 +++++++++++++++ localise_test.go | 27 +++++++++++++++++++++++++++ service.go | 6 ++++++ service_test.go | 16 ++++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/i18n.go b/i18n.go index 124753a..5900dd1 100644 --- a/i18n.go +++ b/i18n.go @@ -54,6 +54,13 @@ func SetMode(m Mode) { } } +// SetFallback sets the fallback language for the default service. +func SetFallback(lang string) { + if svc := Default(); svc != nil { + svc.SetFallback(lang) + } +} + // CurrentMode returns the current translation mode. func CurrentMode() Mode { if svc := Default(); svc != nil { @@ -62,6 +69,14 @@ func CurrentMode() Mode { return ModeNormal } +// CurrentFallback returns the current fallback language. +func CurrentFallback() string { + if svc := Default(); svc != nil { + return svc.Fallback() + } + return "en" +} + // CurrentFormality returns the current default formality. func CurrentFormality() Formality { if svc := Default(); svc != nil { diff --git a/localise_test.go b/localise_test.go index 0ebd191..d306bb4 100644 --- a/localise_test.go +++ b/localise_test.go @@ -120,6 +120,20 @@ func TestSetFormality_Good(t *testing.T) { assert.Equal(t, FormalityNeutral, svc.Formality()) } +// --- Package-level SetFallback --- + +func TestSetFallback_Good(t *testing.T) { + svc, err := New() + require.NoError(t, err) + SetDefault(svc) + + SetFallback("fr") + assert.Equal(t, "fr", svc.Fallback()) + + SetFallback("en") + assert.Equal(t, "en", svc.Fallback()) +} + // --- Package-level CurrentFormality --- func TestCurrentFormality_Good(t *testing.T) { @@ -133,6 +147,19 @@ func TestCurrentFormality_Good(t *testing.T) { assert.Equal(t, FormalityFormal, CurrentFormality()) } +// --- Package-level CurrentFallback --- + +func TestCurrentFallback_Good(t *testing.T) { + svc, err := New() + require.NoError(t, err) + SetDefault(svc) + + assert.Equal(t, "en", CurrentFallback()) + + SetFallback("fr") + assert.Equal(t, "fr", CurrentFallback()) +} + // --- Package-level SetLocation --- func TestSetLocation_Good(t *testing.T) { diff --git a/service.go b/service.go index 89e8306..0b87025 100644 --- a/service.go +++ b/service.go @@ -283,6 +283,12 @@ func (s *Service) SetMode(m Mode) { s.mu.Lock(); s.mode = m; s.mu.Unlo func (s *Service) Mode() Mode { s.mu.RLock(); defer s.mu.RUnlock(); return s.mode } func (s *Service) SetFormality(f Formality) { s.mu.Lock(); s.formality = f; s.mu.Unlock() } func (s *Service) Formality() Formality { s.mu.RLock(); defer s.mu.RUnlock(); return s.formality } +func (s *Service) SetFallback(lang string) { s.mu.Lock(); s.fallbackLang = lang; s.mu.Unlock() } +func (s *Service) Fallback() string { + s.mu.RLock() + defer s.mu.RUnlock() + return s.fallbackLang +} func (s *Service) SetLocation(location string) { s.mu.Lock() diff --git a/service_test.go b/service_test.go index b0aec75..6eb0a3a 100644 --- a/service_test.go +++ b/service_test.go @@ -228,6 +228,22 @@ func TestServiceModes(t *testing.T) { svc.T("nonexistent.key") } +func TestServiceFallback(t *testing.T) { + svc, err := New() + if err != nil { + t.Fatalf("New() failed: %v", err) + } + + if svc.Fallback() != "en" { + t.Errorf("default Fallback() = %q, want en", svc.Fallback()) + } + + svc.SetFallback("fr") + if svc.Fallback() != "fr" { + t.Errorf("Fallback() = %q, want fr", svc.Fallback()) + } +} + func TestServiceDebug(t *testing.T) { svc, err := New() if err != nil {