diff --git a/web/app/signin/__tests__/_header.spec.tsx b/web/app/signin/__tests__/_header.spec.tsx
new file mode 100644
index 0000000000..06a54e0b36
--- /dev/null
+++ b/web/app/signin/__tests__/_header.spec.tsx
@@ -0,0 +1,57 @@
+import { useSuspenseQuery } from '@tanstack/react-query'
+import { fireEvent, render, screen } from '@testing-library/react'
+import { setLocaleOnClient } from '@/i18n-config'
+import Header from '../_header'
+
+vi.mock('@tanstack/react-query', () => ({
+ useSuspenseQuery: vi.fn(),
+}))
+
+vi.mock('@/context/i18n', () => ({
+ useLocale: () => 'en-US',
+}))
+
+vi.mock('@/i18n-config', () => ({
+ setLocaleOnClient: vi.fn(),
+}))
+
+vi.mock('@/next/dynamic', () => ({
+ default: () => () => null,
+}))
+
+vi.mock('@/service/system-features', () => ({
+ systemFeaturesQueryOptions: () => ({}),
+}))
+
+vi.mock('../_locale-menu', () => ({
+ default: ({ onChange }: { onChange?: (value: string) => void }) => (
+
+ ),
+}))
+
+const mockUseSuspenseQuery = vi.mocked(useSuspenseQuery)
+const mockSetLocaleOnClient = vi.mocked(setLocaleOnClient)
+
+describe('Signin Header', () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ mockUseSuspenseQuery.mockReturnValue({
+ data: {
+ branding: {
+ enabled: false,
+ login_page_logo: '',
+ },
+ },
+ } as ReturnType)
+ })
+
+ it('should switch locale without forcing a full page reload', () => {
+ render()
+
+ fireEvent.click(screen.getByRole('button', { name: 'Switch Language' }))
+
+ expect(mockSetLocaleOnClient).toHaveBeenCalledWith('ja-JP', false)
+ })
+})
diff --git a/web/app/signin/_header.tsx b/web/app/signin/_header.tsx
index 5b638b4208..c589513d61 100644
--- a/web/app/signin/_header.tsx
+++ b/web/app/signin/_header.tsx
@@ -39,7 +39,7 @@ const Header = () => {
value={locale}
items={languages.filter(item => item.supported)}
onChange={(value) => {
- setLocaleOnClient(value as Locale)
+ setLocaleOnClient(value as Locale, false)
}}
/>