diff --git a/src/components/language-picker.tsx b/src/components/language-picker.tsx
new file mode 100644
index 0000000000..21beb2f8dc
--- /dev/null
+++ b/src/components/language-picker.tsx
@@ -0,0 +1,51 @@
+import { SelectControl } from '@wordpress/components';
+import { useState } from 'react';
+import { getIpcApi } from '../lib/get-ipc-api';
+
+// TODO: use supportedLocales from locale.ts
+export const supportedLocales = {
+ ar: 'العربية',
+ de: 'Deutsch',
+ en: 'English',
+ es: 'Español',
+ fr: 'Français',
+ he: 'עברית',
+ id: 'Bahasa Indonesia',
+ it: 'Italiano',
+ ja: '日本語',
+ ko: '한국어',
+ nl: 'Nederlands',
+ pl: 'Polski',
+ 'pt-br': 'Português (Brasil)',
+ ru: 'Русский',
+ sv: 'Svenska',
+ tr: 'Türkçe',
+ 'zh-cn': '简体中文',
+ 'zh-tw': '繁體中文',
+};
+
+export const LanguagePicker = () => {
+ const [ locale, setLocale ] = useState( '' );
+
+ const handleLocaleChange = ( value: string ) => {
+ console.log( `Switching to locale: ${ value }` );
+ setLocale( value );
+
+ // Save locale string to saveUserLocale
+ getIpcApi().saveUserLocale( value );
+ };
+
+ return (
+
+
Language
+ ( {
+ value: locale,
+ label: name as string,
+ } ) ) }
+ />
+
+ );
+};
diff --git a/src/components/tests/user-settings.test.tsx b/src/components/tests/user-settings.test.tsx
index 3775ebde8c..50b93a61a6 100644
--- a/src/components/tests/user-settings.test.tsx
+++ b/src/components/tests/user-settings.test.tsx
@@ -20,6 +20,13 @@ describe( 'UserSettings', () => {
callback();
}
} );
+
+ // Mock window.matchMedia
+ window.matchMedia = jest.fn().mockReturnValue( {
+ matches: false,
+ addListener: jest.fn(),
+ removeListener: jest.fn(),
+ } );
} );
it( 'logs in when not authenticated', async () => {
diff --git a/src/components/user-settings.tsx b/src/components/user-settings.tsx
index b0835a9281..aa6b130e6f 100644
--- a/src/components/user-settings.tsx
+++ b/src/components/user-settings.tsx
@@ -14,6 +14,7 @@ import { cx } from '../lib/cx';
import { getIpcApi } from '../lib/get-ipc-api';
import Button from './button';
import { Gravatar } from './gravatar';
+import { LanguagePicker } from './language-picker';
import Modal from './modal';
import offlineIcon from './offline-icon';
import ProgressBar from './progress-bar';
@@ -196,6 +197,7 @@ export default function UserSettings() {
+
ipcRenderer.invoke( 'getOnboardingData' ),
saveOnboarding: ( onboardingCompleted: boolean ) =>
ipcRenderer.invoke( 'saveOnboarding', onboardingCompleted ),
+ saveUserLocale: ( locale: string ) => ipcRenderer.invoke( 'saveUserLocale', locale ),
openTerminalAtPath: ( targetPath: string ) =>
ipcRenderer.invoke( 'openTerminalAtPath', targetPath ),
showMessageBox: ( options: Electron.MessageBoxOptions ) =>
diff --git a/src/storage/storage-types.ts b/src/storage/storage-types.ts
index d6e4b80f3d..686221f0a0 100644
--- a/src/storage/storage-types.ts
+++ b/src/storage/storage-types.ts
@@ -6,6 +6,7 @@ export interface UserData {
devToolsOpen?: boolean;
authToken?: StoredToken;
onboardingCompleted?: boolean;
+ userLocale?: string;
lastBumpStats?: {
[ group: string ]: {
[ stat: string ]: number;