Skip to content

Commit 9dc724c

Browse files
committed
feat(i18n): add locale to SignUp fixtures, class, and improve testing
1 parent 9e630be commit 9dc724c

File tree

6 files changed

+35
-29
lines changed

6 files changed

+35
-29
lines changed

packages/clerk-js/src/core/resources/SignUp.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,10 @@ export class SignUp extends BaseResource implements SignUpResource {
158158

159159
// Inject browser locale if not already provided
160160
if (!finalParams.locale) {
161-
finalParams.locale = getBrowserLocale();
161+
const browserLocale = getBrowserLocale();
162+
if (browserLocale) {
163+
finalParams.locale = browserLocale;
164+
}
162165
}
163166

164167
if (!__BUILD_DISABLE_RHC__ && !this.clientBypass() && !this.shouldBypassCaptchaForAttempt(params)) {
@@ -484,6 +487,7 @@ export class SignUp extends BaseResource implements SignUpResource {
484487
this.abandonAt = data.abandon_at;
485488
this.web3wallet = data.web3_wallet;
486489
this.legalAcceptedAt = data.legal_accepted_at;
490+
this.locale = data.locale;
487491
}
488492

489493
eventBus.emit('resource:update', { resource: this });
@@ -512,6 +516,7 @@ export class SignUp extends BaseResource implements SignUpResource {
512516
abandon_at: this.abandonAt,
513517
web3_wallet: this.web3wallet,
514518
legal_accepted_at: this.legalAcceptedAt,
519+
locale: this.locale,
515520
external_account: this.externalAccount,
516521
external_account_strategy: this.externalAccount?.strategy,
517522
};
@@ -627,6 +632,10 @@ class SignUpFuture implements SignUpFutureResource {
627632
return this.resource.legalAcceptedAt;
628633
}
629634

635+
get locale() {
636+
return this.resource.locale;
637+
}
638+
630639
get unverifiedFields() {
631640
return this.resource.unverifiedFields;
632641
}
@@ -685,7 +694,7 @@ class SignUpFuture implements SignUpFutureResource {
685694
async create(params: SignUpFutureCreateParams): Promise<{ error: unknown }> {
686695
return runAsyncResourceTask(this.resource, async () => {
687696
// Inject browser locale if not already provided
688-
const locale = params.locale || getBrowserLocale();
697+
const locale = params.locale || getBrowserLocale() || undefined;
689698
await this._create({ ...params, locale });
690699
});
691700
}

packages/clerk-js/src/test/core-fixtures.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ export const createSignUp = (signUpParams: Partial<SignUpJSON> = {}) => {
231231
first_name: signUpParams.first_name,
232232
has_password: signUpParams.has_password,
233233
last_name: signUpParams.last_name,
234+
legal_accepted_at: signUpParams.legal_accepted_at,
235+
locale: signUpParams.locale,
234236
missing_fields: signUpParams.missing_fields,
235237
object: 'sign_up',
236238
optional_fields: signUpParams.optional_fields,
Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,33 @@
1-
import { describe, expect, it } from 'vitest';
1+
import { afterEach, describe, expect, it, vi } from 'vitest';
22

33
import { getBrowserLocale } from '../locale';
44

55
describe('getBrowserLocale()', () => {
6+
afterEach(() => {
7+
vi.unstubAllGlobals();
8+
});
9+
610
it('returns the browser locale when available', () => {
7-
Object.defineProperty(window.navigator, 'language', {
8-
value: 'es-ES',
9-
configurable: true,
10-
});
11+
vi.stubGlobal('navigator', { language: 'es-ES' });
1112

1213
expect(getBrowserLocale()).toBe('es-ES');
1314
});
1415

15-
it('returns en-US as default when navigator.language is not available', () => {
16-
Object.defineProperty(window.navigator, 'language', {
17-
value: undefined,
18-
configurable: true,
19-
});
16+
it('returns null as default when navigator.language is not available', () => {
17+
vi.stubGlobal('navigator', { language: undefined });
2018

21-
expect(getBrowserLocale()).toBe('en-US');
19+
expect(getBrowserLocale()).toBeNull();
2220
});
2321

24-
it('returns en-US when navigator.language is empty string', () => {
25-
Object.defineProperty(window.navigator, 'language', {
26-
value: '',
27-
configurable: true,
28-
});
22+
it('returns null as default when navigator.language is empty string', () => {
23+
vi.stubGlobal('navigator', { language: '' });
2924

30-
expect(getBrowserLocale()).toBe('en-US');
25+
expect(getBrowserLocale()).toBeNull();
3126
});
3227

33-
it('returns en-US when navigator object is not defined', () => {
34-
Object.defineProperty(window, 'navigator', {
35-
value: undefined,
36-
configurable: true,
37-
});
28+
it('returns null as default when navigator object is not defined', () => {
29+
vi.stubGlobal('navigator', undefined);
3830

39-
expect(getBrowserLocale()).toBe('en-US');
31+
expect(getBrowserLocale()).toBeNull();
4032
});
4133
});

packages/clerk-js/src/utils/locale.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { inBrowser } from '@clerk/shared/browser';
22

3-
const DEFAULT_LOCALE = 'en-US';
3+
const DEFAULT_LOCALE = null;
44

55
/**
66
* Detects the user's preferred locale from the browser.
7-
* Falls back to 'en-US' if locale cannot be determined.
7+
* Falls back to null if locale cannot be determined.
88
*
9-
* @returns The detected locale string in BCP 47 format (e.g., 'en-US', 'es-ES')
9+
* @returns The detected locale string in BCP 47 format (e.g., 'en-US', 'es-ES') or null if locale cannot be determined.
1010
*/
11-
export function getBrowserLocale(): string {
11+
export function getBrowserLocale(): string | null {
1212
if (!inBrowser()) {
1313
return DEFAULT_LOCALE;
1414
}

packages/types/src/json.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export interface SignUpJSON extends ClerkResourceJSON {
136136
created_user_id: string | null;
137137
abandon_at: number | null;
138138
legal_accepted_at: number | null;
139+
locale: string | null;
139140
verifications: SignUpVerificationsJSON | null;
140141
}
141142

packages/types/src/signUpFuture.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ export interface SignUpFutureResource {
137137

138138
readonly legalAcceptedAt: number | null;
139139

140+
readonly locale: string | null;
141+
140142
create: (params: SignUpFutureCreateParams) => Promise<{ error: unknown }>;
141143

142144
update: (params: SignUpFutureUpdateParams) => Promise<{ error: unknown }>;

0 commit comments

Comments
 (0)