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;