diff --git a/src/components/inputs/autocomplete-keycode.tsx b/src/components/inputs/autocomplete-keycode.tsx index ff9a72e9..33157e0b 100644 --- a/src/components/inputs/autocomplete-keycode.tsx +++ b/src/components/inputs/autocomplete-keycode.tsx @@ -11,9 +11,11 @@ const KeycodeLabel = styled.span` color: var(--color_label); display: flex; `; + const Item = styled.div<{$selected?: boolean}>` box-sizing: border-box; - min-width: 200px; + min-width: 150px; + max-width: 300px; padding: 5px 10px; display: flex; justify-content: space-between; diff --git a/src/components/panes/configure-panes/keycode.tsx b/src/components/panes/configure-panes/keycode.tsx index 75254245..ad231052 100644 --- a/src/components/panes/configure-panes/keycode.tsx +++ b/src/components/panes/configure-panes/keycode.tsx @@ -42,9 +42,11 @@ import { disableGlobalHotKeys, enableGlobalHotKeys, getDisableFastRemap, + getSelectedLanguage, } from 'src/store/settingsSlice'; import {getNextKey} from 'src/utils/keyboard-rendering'; import TextInput from 'src/components/inputs/text-input'; +import { LANGUAGES } from 'src/utils/languages'; const KeycodeList = styled.div` display: grid; @@ -120,8 +122,8 @@ const KeycodeDesc = styled.div` } `; -const generateKeycodeCategories = (basicKeyToByte: Record, numMacros: number = 16) => - getKeycodes(numMacros).concat(getOtherMenu(basicKeyToByte)); +const generateKeycodeCategories = (basicKeyToByte: Record, numMacros: number = 16, language: any) => + getKeycodes(numMacros, language).concat(getOtherMenu(basicKeyToByte)); const maybeFilter = (maybe: boolean, filter: M) => maybe ? () => true : filter; @@ -154,10 +156,11 @@ export const KeycodePane: FC = () => { const selectedKeyDefinitions = useAppSelector(getSelectedKeyDefinitions); const {basicKeyToByte} = useAppSelector(getBasicKeyToByte); const macroCount = useAppSelector(getMacroCount); - + const language = useAppSelector(getSelectedLanguage); + const KeycodeCategories = useMemo( - () => generateKeycodeCategories(basicKeyToByte, macroCount), - [basicKeyToByte, macroCount], + () => generateKeycodeCategories(basicKeyToByte, macroCount, language), + [basicKeyToByte, macroCount, language], ); // TODO: improve typing so we can get rid of this @@ -361,13 +364,19 @@ export const KeycodePane: FC = () => { const allKeycodes = [] for (const item of getEnabledMenus()) { - const itemKeycodes = KeycodeCategories.find( + const keycodesList = KeycodeCategories.find( ({id}) => id === item.id, )?.keycodes as IKeycode[] + + // for now skip custom keycodes since those are generated above instead of inside the getKeycodes() + if (item.id === "custom") + { + continue + } - for (const key of itemKeycodes) + for (const keycode of keycodesList) { - allKeycodes.push(key) + allKeycodes.push(keycode) } } return ( diff --git a/src/components/panes/configure-panes/submenus/macros/macro-recorder.tsx b/src/components/panes/configure-panes/submenus/macros/macro-recorder.tsx index 9afb403a..981aa272 100644 --- a/src/components/panes/configure-panes/submenus/macros/macro-recorder.tsx +++ b/src/components/panes/configure-panes/submenus/macros/macro-recorder.tsx @@ -29,8 +29,10 @@ import {useAppSelector} from 'src/store/hooks'; import { getMacroEditorSettings, setMacroEditorSettings, + getSelectedLanguage, } from 'src/store/settingsSlice'; import {useDispatch} from 'react-redux'; +import { getMacroCount } from 'src/store/macrosSlice'; declare global { interface Navigator { @@ -113,10 +115,6 @@ const componentJoin = (arr: (JSX.Element | null)[], separator: JSX.Element) => { }, [] as (JSX.Element | null)[]); }; -const KeycodeMap = getKeycodes() - .flatMap((menu) => menu.keycodes) - .reduce((p, n) => ({...p, [n.code]: n}), {} as Record); - const optimizeKeycodeSequence = (sequence: RawKeycodeSequence) => { return pipeline( sequence, @@ -158,6 +156,12 @@ export const MacroRecorder: React.FC<{ isRecording, recordDelaysEnabled, ); + + const numMacros = useAppSelector(getMacroCount) + const language = useAppSelector(getSelectedLanguage) + const KeycodeMap = getKeycodes(numMacros, language) + .flatMap((menu) => menu.keycodes) + .reduce((p, n) => ({...p, [n.code]: n}), {} as Record); const macroSequenceRef = useRef(null); const recordingToggleChange = useCallback( async (isRecording: boolean) => { diff --git a/src/components/panes/settings.tsx b/src/components/panes/settings.tsx index 119f4587..66bd3c41 100644 --- a/src/components/panes/settings.tsx +++ b/src/components/panes/settings.tsx @@ -25,6 +25,8 @@ import { updateThemeName, getRenderMode, updateRenderMode, + getLanguage, + updateLanguage } from 'src/store/settingsSlice'; import {AccentSelect} from '../inputs/accent-select'; import {THEMES} from 'src/utils/themes'; @@ -35,6 +37,7 @@ import {faToolbox} from '@fortawesome/free-solid-svg-icons'; import {getSelectedConnectedDevice} from 'src/store/devicesSlice'; import {ErrorMessage} from '../styled'; import {webGLIsAvailable} from 'src/utils/test-webgl'; +import {LANGUAGES} from 'src/utils/languages'; const Container = styled.div` display: flex; @@ -61,6 +64,7 @@ export const Settings = () => { const themeName = useAppSelector(getThemeName); const renderMode = useAppSelector(getRenderMode); const selectedDevice = useAppSelector(getSelectedConnectedDevice); + const language = useAppSelector(getLanguage); const [showDiagnostics, setShowDiagnostics] = useState(false); @@ -72,6 +76,14 @@ export const Settings = () => { (opt) => opt.value === themeName, ); + const languageSelectOptions = Object.keys(LANGUAGES).map((k) => ({ + label: k.replaceAll('_', ' '), + value: k, + })); + const defaultLanguageValue = languageSelectOptions.find( + (opt) => opt.value === language + ); + const renderModeOptions = webGLIsAvailable ? [ { @@ -129,6 +141,18 @@ export const Settings = () => { /> + + + + { + option && dispatch(updateLanguage(option.value)); + }} + /> + + diff --git a/src/store/settingsSlice.ts b/src/store/settingsSlice.ts index 0355db4a..7dc17cf2 100644 --- a/src/store/settingsSlice.ts +++ b/src/store/settingsSlice.ts @@ -12,6 +12,7 @@ import {makeSRGBTheme} from 'src/utils/keyboard-rendering'; import {updateCSSVariables} from 'src/utils/color-math'; import {webGLIsAvailable} from 'src/utils/test-webgl'; import {DefinitionVersion} from '@the-via/reader'; +import { LANGUAGES } from 'src/utils/languages'; // TODO: why are these settings mixed? Is it because we only want some of them cached? SHould we rename to "CachedSettings"? type SettingsState = Settings & { @@ -98,6 +99,10 @@ const settingsSlice = createSlice({ enableGlobalHotKeys: (state) => { state.allowGlobalHotKeys = true; }, + updateLanguage: (state, action: PayloadAction) => { + state.language = action.payload; + setSettings(state); + }, }, }); @@ -113,6 +118,7 @@ export const { updateRenderMode, updateThemeName, updateDesignDefinitionVersion, + updateLanguage } = settingsSlice.actions; export default settingsSlice.reducer; @@ -140,6 +146,10 @@ export const getThemeName = (state: RootState) => state.settings.themeName; export const getSelectedTheme = createSelector(getThemeName, (themeName) => { return THEMES[themeName as keyof typeof THEMES]; }); +export const getLanguage = (state: RootState) => state.settings.language; +export const getSelectedLanguage = createSelector(getLanguage, (language) => { + return LANGUAGES[language as keyof typeof LANGUAGES]; +}); export const getSelectedSRGBTheme = createSelector( getSelectedTheme, diff --git a/src/types/types.ts b/src/types/types.ts index 3b86fb2f..230445ee 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -90,6 +90,7 @@ export type Settings = { macroEditor: MacroEditorSettings; testKeyboardSoundsSettings: TestKeyboardSoundsSettings; designDefinitionVersion: DefinitionVersion; + language: string; }; export type CommonMenusMap = { diff --git a/src/utils/device-store.ts b/src/utils/device-store.ts index ecfd1e88..82340a8a 100644 --- a/src/utils/device-store.ts +++ b/src/utils/device-store.ts @@ -47,6 +47,7 @@ const defaultStoreData = { mode: TestKeyboardSoundsMode.WickiHayden, transpose: 0, }, + language: 'ENGLISH', }, }; @@ -177,3 +178,7 @@ export const getSettings = (): Settings => deviceStore.get('settings'); export const setSettings = (settings: Settings) => { deviceStore.set('settings', current(settings)); }; + +export const getLanguageFromStore = () => { + return deviceStore.get('settings')?.language; +}; diff --git a/src/utils/key.ts b/src/utils/key.ts index 02a33f08..535ba6a2 100644 --- a/src/utils/key.ts +++ b/src/utils/key.ts @@ -9,6 +9,7 @@ import { getLightingDefinition, KeycodeType, } from '@the-via/reader'; +import { LANGUAGES, LanguageKey } from './languages'; export interface IKeycode { name: string; @@ -478,163 +479,180 @@ function generateMacros(numMacros: number = 16): IKeycode[] { return res; } +function generateBasicKeycodes(language: LanguageKey[] = []): IKeycode[] { + let basicKeycodes: IKeycode[] = [ + {name: '', code: 'KC_NO', title: 'Nothing'}, + {name: '▽', code: 'KC_TRNS', title: 'Pass-through'}, + // TODO: remove "shortName" when multiline keycap labels are working + {name: 'Esc', code: 'KC_ESC', keys: 'esc'}, + {name: 'A', code: 'KC_A', keys: 'a'}, + {name: 'B', code: 'KC_B', keys: 'b'}, + {name: 'C', code: 'KC_C', keys: 'c'}, + {name: 'D', code: 'KC_D', keys: 'd'}, + {name: 'E', code: 'KC_E', keys: 'e'}, + {name: 'F', code: 'KC_F', keys: 'f'}, + {name: 'G', code: 'KC_G', keys: 'g'}, + {name: 'H', code: 'KC_H', keys: 'h'}, + {name: 'I', code: 'KC_I', keys: 'i'}, + {name: 'J', code: 'KC_J', keys: 'j'}, + {name: 'K', code: 'KC_K', keys: 'k'}, + {name: 'L', code: 'KC_L', keys: 'l'}, + {name: 'M', code: 'KC_M', keys: 'm'}, + {name: 'N', code: 'KC_N', keys: 'n'}, + {name: 'O', code: 'KC_O', keys: 'o'}, + {name: 'P', code: 'KC_P', keys: 'p'}, + {name: 'Q', code: 'KC_Q', keys: 'q'}, + {name: 'R', code: 'KC_R', keys: 'r'}, + {name: 'S', code: 'KC_S', keys: 's'}, + {name: 'T', code: 'KC_T', keys: 't'}, + {name: 'U', code: 'KC_U', keys: 'u'}, + {name: 'V', code: 'KC_V', keys: 'v'}, + {name: 'W', code: 'KC_W', keys: 'w'}, + {name: 'X', code: 'KC_X', keys: 'x'}, + {name: 'Y', code: 'KC_Y', keys: 'y'}, + {name: 'Z', code: 'KC_Z', keys: 'z'}, + {name: '!\n1', code: 'KC_1', keys: '1'}, + {name: '@\n2', code: 'KC_2', keys: '2'}, + {name: '#\n3', code: 'KC_3', keys: '3'}, + {name: '$\n4', code: 'KC_4', keys: '4'}, + {name: '%\n5', code: 'KC_5', keys: '5'}, + {name: '^\n6', code: 'KC_6', keys: '6'}, + {name: '&\n7', code: 'KC_7', keys: '7'}, + {name: '*\n8', code: 'KC_8', keys: '8'}, + {name: '(\n9', code: 'KC_9', keys: '9'}, + {name: ')\n0', code: 'KC_0', keys: '0'}, + {name: '_\n-', code: 'KC_MINS', keys: '-'}, + {name: '+\n=', code: 'KC_EQL', keys: '='}, + {name: '~\n`', code: 'KC_GRV', keys: '`'}, + {name: '{\n[', code: 'KC_LBRC', keys: '['}, + {name: '}\n]', code: 'KC_RBRC', keys: ']'}, + {name: '|\n\\', code: 'KC_BSLS', keys: '\\', width: 1500}, + {name: ':\n;', code: 'KC_SCLN', keys: ';'}, + {name: '"\n\'', code: 'KC_QUOT', keys: "'"}, + {name: '<\n,', code: 'KC_COMM', keys: ','}, + {name: '>\n.', code: 'KC_DOT', keys: '.'}, + {name: '?\n/', code: 'KC_SLSH', keys: '/'}, + {name: 'NUHS', code: 'KC_NUHS', title: 'Non-US # and ~'}, + {name: 'NUBS', code: 'KC_NUBS', title: 'Non-US \\ and |'}, + {name: '=', code: 'KC_PEQL'}, + {name: ',', code: 'KC_PCMM'}, + {name: 'F1', code: 'KC_F1'}, + {name: 'F2', code: 'KC_F2'}, + {name: 'F3', code: 'KC_F3'}, + {name: 'F4', code: 'KC_F4'}, + {name: 'F5', code: 'KC_F5'}, + {name: 'F6', code: 'KC_F6'}, + {name: 'F7', code: 'KC_F7'}, + {name: 'F8', code: 'KC_F8'}, + {name: 'F9', code: 'KC_F9'}, + {name: 'F10', code: 'KC_F10'}, + {name: 'F11', code: 'KC_F11'}, + {name: 'F12', code: 'KC_F12'}, + {name: 'Print Screen', code: 'KC_PSCR', shortName: 'Print'}, + {name: 'Scroll Lock', code: 'KC_SLCK', shortName: 'Scroll'}, + {name: 'Pause', code: 'KC_PAUS'}, + {name: 'Tab', code: 'KC_TAB', keys: 'tab', width: 1500}, + { + name: 'Backspace', + code: 'KC_BSPC', + keys: 'backspace', + width: 2000, + shortName: 'Bksp', + }, + {name: 'Insert', code: 'KC_INS', keys: 'insert', shortName: 'Ins'}, + {name: 'Del', code: 'KC_DEL', keys: 'delete'}, + {name: 'Home', code: 'KC_HOME', keys: 'home'}, + {name: 'End', code: 'KC_END', keys: 'end'}, + {name: 'Page Up', code: 'KC_PGUP', keys: 'pageup', shortName: 'PgUp'}, + { + name: 'Page Down', + code: 'KC_PGDN', + keys: 'pagedown', + shortName: 'PgDn', + }, + {name: 'Num\nLock', code: 'KC_NLCK', keys: 'num', shortName: 'N.Lck'}, + {name: 'Caps Lock', code: 'KC_CAPS', keys: 'caps_lock', width: 1750}, + {name: 'Enter', code: 'KC_ENT', keys: 'enter', width: 2250}, + {name: '1', code: 'KC_P1', keys: 'num_1', title: 'Numpad 1'}, + {name: '2', code: 'KC_P2', keys: 'num_2', title: 'Numpad 2'}, + {name: '3', code: 'KC_P3', keys: 'num_3', title: 'Numpad 3'}, + {name: '4', code: 'KC_P4', keys: 'num_4', title: 'Numpad 4'}, + {name: '5', code: 'KC_P5', keys: 'num_5', title: 'Numpad 5'}, + {name: '6', code: 'KC_P6', keys: 'num_6', title: 'Numpad 6'}, + {name: '7', code: 'KC_P7', keys: 'num_7', title: 'Numpad 7'}, + {name: '8', code: 'KC_P8', keys: 'num_8', title: 'Numpad 8'}, + {name: '9', code: 'KC_P9', keys: 'num_9', title: 'Numpad 9'}, + { + name: '0', + code: 'KC_P0', + width: 2000, + keys: 'num_0', + title: 'Numpad 0', + }, + {name: '÷', code: 'KC_PSLS', keys: 'num_divide', title: 'Numpad ÷'}, + {name: '×', code: 'KC_PAST', keys: 'num_multiply', title: 'Numpad ×'}, + {name: '-', code: 'KC_PMNS', keys: 'num_subtract', title: 'Numpad -'}, + {name: '+', code: 'KC_PPLS', keys: 'num_add', title: 'Numpad +'}, + {name: '.', code: 'KC_PDOT', keys: 'num_decimal', title: 'Numpad .'}, + { + name: 'Num\nEnter', + code: 'KC_PENT', + shortName: 'N.Ent', + title: 'Numpad Enter', + }, + { + name: 'Left Shift', + code: 'KC_LSFT', + keys: 'shift', + width: 2250, + shortName: 'LShft', + }, + {name: 'Right Shift', code: 'KC_RSFT', width: 2750, shortName: 'RShft'}, + {name: 'Left Ctrl', code: 'KC_LCTL', keys: 'ctrl', width: 1250}, + {name: 'Right Ctrl', code: 'KC_RCTL', width: 1250, shortName: 'RCtl'}, + { + name: 'Left Win', + code: 'KC_LGUI', + keys: 'cmd', + width: 1250, + shortName: 'LWin', + }, + {name: 'Right Win', code: 'KC_RGUI', width: 1250, shortName: 'RWin'}, + { + name: 'Left Alt', + code: 'KC_LALT', + keys: 'alt', + width: 1250, + shortName: 'LAlt', + }, + {name: 'Right Alt', code: 'KC_RALT', width: 1250, shortName: 'RAlt'}, + {name: 'Space', code: 'KC_SPC', keys: 'space', width: 6250}, + {name: 'Menu', code: 'KC_APP', width: 1250, shortName: 'RApp'}, + {name: 'Left', code: 'KC_LEFT', keys: 'left', shortName: '←'}, + {name: 'Down', code: 'KC_DOWN', keys: 'down', shortName: '↓'}, + {name: 'Up', code: 'KC_UP', keys: 'up', shortName: '↑'}, + {name: 'Right', code: 'KC_RGHT', keys: 'right', shortName: '→'}, + ]; + language.forEach(element => { + let entry = Object.entries(element) + let [key, value] = entry[0]; + console.log(entry) + console.log(key, value) + let index = basicKeycodes.findIndex(k => k.code === key) + if (index <= -1) return + console.log(index, key) + basicKeycodes[index].name = value + }); + + return basicKeycodes; +} -export function getKeycodes(numMacros = 16): IKeycodeMenu[] { +export function getKeycodes(numMacros: number = 16, language: LanguageKey[] = []): IKeycodeMenu[] { return [ { id: 'basic', label: 'Basic', - keycodes: [ - {name: '', code: 'KC_NO', title: 'Nothing'}, - {name: '▽', code: 'KC_TRNS', title: 'Pass-through'}, - // TODO: remove "shortName" when multiline keycap labels are working - {name: 'Esc', code: 'KC_ESC', keys: 'esc'}, - {name: 'A', code: 'KC_A', keys: 'a'}, - {name: 'B', code: 'KC_B', keys: 'b'}, - {name: 'C', code: 'KC_C', keys: 'c'}, - {name: 'D', code: 'KC_D', keys: 'd'}, - {name: 'E', code: 'KC_E', keys: 'e'}, - {name: 'F', code: 'KC_F', keys: 'f'}, - {name: 'G', code: 'KC_G', keys: 'g'}, - {name: 'H', code: 'KC_H', keys: 'h'}, - {name: 'I', code: 'KC_I', keys: 'i'}, - {name: 'J', code: 'KC_J', keys: 'j'}, - {name: 'K', code: 'KC_K', keys: 'k'}, - {name: 'L', code: 'KC_L', keys: 'l'}, - {name: 'M', code: 'KC_M', keys: 'm'}, - {name: 'N', code: 'KC_N', keys: 'n'}, - {name: 'O', code: 'KC_O', keys: 'o'}, - {name: 'P', code: 'KC_P', keys: 'p'}, - {name: 'Q', code: 'KC_Q', keys: 'q'}, - {name: 'R', code: 'KC_R', keys: 'r'}, - {name: 'S', code: 'KC_S', keys: 's'}, - {name: 'T', code: 'KC_T', keys: 't'}, - {name: 'U', code: 'KC_U', keys: 'u'}, - {name: 'V', code: 'KC_V', keys: 'v'}, - {name: 'W', code: 'KC_W', keys: 'w'}, - {name: 'X', code: 'KC_X', keys: 'x'}, - {name: 'Y', code: 'KC_Y', keys: 'y'}, - {name: 'Z', code: 'KC_Z', keys: 'z'}, - {name: '!\n1', code: 'KC_1', keys: '1'}, - {name: '@\n2', code: 'KC_2', keys: '2'}, - {name: '#\n3', code: 'KC_3', keys: '3'}, - {name: '$\n4', code: 'KC_4', keys: '4'}, - {name: '%\n5', code: 'KC_5', keys: '5'}, - {name: '^\n6', code: 'KC_6', keys: '6'}, - {name: '&\n7', code: 'KC_7', keys: '7'}, - {name: '*\n8', code: 'KC_8', keys: '8'}, - {name: '(\n9', code: 'KC_9', keys: '9'}, - {name: ')\n0', code: 'KC_0', keys: '0'}, - {name: '_\n-', code: 'KC_MINS', keys: '-'}, - {name: '+\n=', code: 'KC_EQL', keys: '='}, - {name: '~\n`', code: 'KC_GRV', keys: '`'}, - {name: '{\n[', code: 'KC_LBRC', keys: '['}, - {name: '}\n]', code: 'KC_RBRC', keys: ']'}, - {name: '|\n\\', code: 'KC_BSLS', keys: '\\', width: 1500}, - {name: ':\n;', code: 'KC_SCLN', keys: ';'}, - {name: '"\n\'', code: 'KC_QUOT', keys: "'"}, - {name: '<\n,', code: 'KC_COMM', keys: ','}, - {name: '>\n.', code: 'KC_DOT', keys: '.'}, - {name: '?\n/', code: 'KC_SLSH', keys: '/'}, - {name: '=', code: 'KC_PEQL'}, - {name: ',', code: 'KC_PCMM'}, - {name: 'F1', code: 'KC_F1'}, - {name: 'F2', code: 'KC_F2'}, - {name: 'F3', code: 'KC_F3'}, - {name: 'F4', code: 'KC_F4'}, - {name: 'F5', code: 'KC_F5'}, - {name: 'F6', code: 'KC_F6'}, - {name: 'F7', code: 'KC_F7'}, - {name: 'F8', code: 'KC_F8'}, - {name: 'F9', code: 'KC_F9'}, - {name: 'F10', code: 'KC_F10'}, - {name: 'F11', code: 'KC_F11'}, - {name: 'F12', code: 'KC_F12'}, - {name: 'Print Screen', code: 'KC_PSCR', shortName: 'Print'}, - {name: 'Scroll Lock', code: 'KC_SLCK', shortName: 'Scroll'}, - {name: 'Pause', code: 'KC_PAUS'}, - {name: 'Tab', code: 'KC_TAB', keys: 'tab', width: 1500}, - { - name: 'Backspace', - code: 'KC_BSPC', - keys: 'backspace', - width: 2000, - shortName: 'Bksp', - }, - {name: 'Insert', code: 'KC_INS', keys: 'insert', shortName: 'Ins'}, - {name: 'Del', code: 'KC_DEL', keys: 'delete'}, - {name: 'Home', code: 'KC_HOME', keys: 'home'}, - {name: 'End', code: 'KC_END', keys: 'end'}, - {name: 'Page Up', code: 'KC_PGUP', keys: 'pageup', shortName: 'PgUp'}, - { - name: 'Page Down', - code: 'KC_PGDN', - keys: 'pagedown', - shortName: 'PgDn', - }, - {name: 'Num\nLock', code: 'KC_NLCK', keys: 'num', shortName: 'N.Lck'}, - {name: 'Caps Lock', code: 'KC_CAPS', keys: 'caps_lock', width: 1750}, - {name: 'Enter', code: 'KC_ENT', keys: 'enter', width: 2250}, - {name: '1', code: 'KC_P1', keys: 'num_1', title: 'Numpad 1'}, - {name: '2', code: 'KC_P2', keys: 'num_2', title: 'Numpad 2'}, - {name: '3', code: 'KC_P3', keys: 'num_3', title: 'Numpad 3'}, - {name: '4', code: 'KC_P4', keys: 'num_4', title: 'Numpad 4'}, - {name: '5', code: 'KC_P5', keys: 'num_5', title: 'Numpad 5'}, - {name: '6', code: 'KC_P6', keys: 'num_6', title: 'Numpad 6'}, - {name: '7', code: 'KC_P7', keys: 'num_7', title: 'Numpad 7'}, - {name: '8', code: 'KC_P8', keys: 'num_8', title: 'Numpad 8'}, - {name: '9', code: 'KC_P9', keys: 'num_9', title: 'Numpad 9'}, - { - name: '0', - code: 'KC_P0', - width: 2000, - keys: 'num_0', - title: 'Numpad 0', - }, - {name: '÷', code: 'KC_PSLS', keys: 'num_divide', title: 'Numpad ÷'}, - {name: '×', code: 'KC_PAST', keys: 'num_multiply', title: 'Numpad ×'}, - {name: '-', code: 'KC_PMNS', keys: 'num_subtract', title: 'Numpad -'}, - {name: '+', code: 'KC_PPLS', keys: 'num_add', title: 'Numpad +'}, - {name: '.', code: 'KC_PDOT', keys: 'num_decimal', title: 'Numpad .'}, - { - name: 'Num\nEnter', - code: 'KC_PENT', - shortName: 'N.Ent', - title: 'Numpad Enter', - }, - { - name: 'Left Shift', - code: 'KC_LSFT', - keys: 'shift', - width: 2250, - shortName: 'LShft', - }, - {name: 'Right Shift', code: 'KC_RSFT', width: 2750, shortName: 'RShft'}, - {name: 'Left Ctrl', code: 'KC_LCTL', keys: 'ctrl', width: 1250}, - {name: 'Right Ctrl', code: 'KC_RCTL', width: 1250, shortName: 'RCtl'}, - { - name: 'Left Win', - code: 'KC_LGUI', - keys: 'cmd', - width: 1250, - shortName: 'LWin', - }, - {name: 'Right Win', code: 'KC_RGUI', width: 1250, shortName: 'RWin'}, - { - name: 'Left Alt', - code: 'KC_LALT', - keys: 'alt', - width: 1250, - shortName: 'LAlt', - }, - {name: 'Right Alt', code: 'KC_RALT', width: 1250, shortName: 'RAlt'}, - {name: 'Space', code: 'KC_SPC', keys: 'space', width: 6250}, - {name: 'Menu', code: 'KC_APP', width: 1250, shortName: 'RApp'}, - {name: 'Left', code: 'KC_LEFT', keys: 'left', shortName: '←'}, - {name: 'Down', code: 'KC_DOWN', keys: 'down', shortName: '↓'}, - {name: 'Up', code: 'KC_UP', keys: 'up', shortName: '↑'}, - {name: 'Right', code: 'KC_RGHT', keys: 'right', shortName: '→'}, - ], + keycodes: generateBasicKeycodes(language) }, { id: 'wt_lighting', @@ -778,8 +796,6 @@ export function getKeycodes(numMacros = 16): IKeycodeMenu[] { {name: '<', code: 'S(KC_COMM)', keys: '<', title: 'Shift + ,'}, {name: '>', code: 'S(KC_DOT)', keys: '>', title: 'Shift + .'}, {name: '?', code: 'S(KC_SLSH)', keys: '?', title: 'Shift + /'}, - {name: 'NUHS', code: 'KC_NUHS', title: 'Non-US # and ~'}, - {name: 'NUBS', code: 'KC_NUBS', title: 'Non-US \\ and |'}, {name: 'Ro', code: 'KC_RO', title: 'JIS \\ and |'}, {name: '¥', code: 'KC_JYEN', title: 'JPN Yen'}, {name: '無変換', code: 'KC_MHEN', title: 'JIS Muhenkan'}, @@ -1008,6 +1024,7 @@ export const categoriesForKeycodeModule = ( export const getKeycodesForKeyboard = ( definition: VIADefinitionV3 | VIADefinitionV2, + language: keyof typeof LANGUAGES, ) => { // v2 let includeList: string[] = []; @@ -1022,9 +1039,11 @@ export const getKeycodesForKeyboard = ( ); } else { const {keycodes} = definition; - includeList = keycodes.flatMap(categoriesForKeycodeModule); + console.log(keycodes) + includeList = categoriesForKeycodeModule('default').concat(keycodes.flatMap(categoriesForKeycodeModule)) + console.log(includeList) } - return getKeycodes() + return getKeycodes(undefined, language) .flatMap((keycodeMenu) => includeList.includes(keycodeMenu.id) ? keycodeMenu.keycodes : [], ) diff --git a/src/utils/languages.ts b/src/utils/languages.ts new file mode 100644 index 00000000..c70feaf5 --- /dev/null +++ b/src/utils/languages.ts @@ -0,0 +1,249 @@ +export type LanguageKey = { + [key: string]: string; +} + +export enum LanguageType { + ENGLISH = "ENGLISH", + CANADIAN_MULTILINGUAL_CSA = "CANADIAN_MULTILINGUAL_CSA", + CROATIAN = "CROATIAN", + CZECH = "CZECH", + DANISH = "DANISH", + DUTCH_BELGIUM = "DUTCH_BELGIUM", + ENGLISH_IRELAND = "ENGLISH_IRELAND", + ENGLISH_UK = "ENGLISH_UK", + ENGLISH_US_EXTENDED = "ENGLISH_US_EXTENDED", + ENGLISH_US_INTERNATIONAL = "ENGLISH_US_INTERNATIONAL", + ENGLISH_US_INTERNATIONAL_LINUX = "ENGLISH_US_INTERNATIONAL_LINUX", + ESTONIAN = "ESTONIAN", + FINNISH = "FINNISH", + FRENCH = "FRENCH", + FRENCH_AFNOR = "FRENCH_AFNOR", + FRENCH_BPO = "FRENCH_BPO", + FRENCH_BELGIUM = "FRENCH_BELGIUM", + FRENCH_SWITZERLAND = "FRENCH_SWITZERLAND", + FRENCH_MACOS_ISO = "FRENCH_MACOS_ISO", + GERMAN = "GERMAN", + GERMAN_SWITZERLAND = "GERMAN_SWITZERLAND", + GERMAN_MACOS = "GERMAN_MACOS", + GERMAN_NEO = "GERMAN_NEO", + GREEK = "GREEK", + HEBREW = "HEBREW", + HUNGARIAN = "HUNGARIAN", + ICELANDIC = "ICELANDIC", + ITALIAN = "ITALIAN", + ITALIAN_MACOS_ANSI = "ITALIAN_MACOS_ANSI", + ITALIAN_MACOS_ISO = "ITALIAN_MACOS_ISO", + JAPANESE = "JAPANESE", + KOREAN = "KOREAN", + LATVIAN = "LATVIAN", + LITHUANIAN_AERTY = "LITHUANIAN_AERTY", + LITHUANIAN_QWERTY = "LITHUANIAN_QWERTY", + NORWEGIAN = "NORWEGIAN", + POLISH = "POLISH", + PORTUGUESE = "PORTUGUESE", + PORTUGUESE_MACOS_ISO = "PORTUGUESE_MACOS_ISO", + PORTUGUESE_BRAZIL = "PORTUGUESE_BRAZIL", + ROMANIAN = "ROMANIAN", + RUSSIAN = "RUSSIAN", + SERBIAN = "SERBIAN", + SERBIAN_LATIN = "SERBIAN_LATIN", + SLOVAK = "SLOVAK", + SLOVENIAN = "SLOVENIAN", + SPANISH = "SPANISH", + SPANISH_DVORAK = "SPANISH_DVORAK", + SWEDISH = "SWEDISH", + SWEDISH_MACOS_ANSI = "SWEDISH_MACOS_ANSI", + SWEDISH_MACOS_ISO = "SWEDISH_MACOS_ISO", + SWEDISH_PRO_MACOS_ANSI = "SWEDISH_PRO_MACOS_ANSI", + SWEDISH_PRO_MACOS_ISO = "SWEDISH_PRO_MACOS_ISO", + TURKISH_F = "TURKISH_F", + TURKISH_Q = "TURKISH_Q", + UKRAINIAN = "UKRAINIAN", +} + +export const LANGUAGES: {[key in LanguageType]: LanguageKey[] } = { + ENGLISH: [{"EMPTY": ""}], // no changes + CANADIAN_MULTILINGUAL_CSA: [ + {KC_GRV: "\\\n/ |"}, + {KC_6: "?\n6"}, + {KC_7: "&\n7 {"}, + {KC_8: "*\n8 }"}, + {KC_9: "(\n9 ["}, + {KC_0: ")\n0 ]"}, + {KC_EQL: "+\n= ¬"}, + {KC_SLSH: "É"}, + {KC_LBRC: "¨\n^ `"}, + {KC_RBRC: "Ç ~"}, + {KC_SCLN: ":\n; °"}, + {KC_QUOT: "È"}, + {KC_NUHS: "À"}, + {KC_NUBS: "Ù"}, + {KC_Z: "Z «"}, + {KC_X: "X »"}, + {KC_COMM: "'\n, <"}, + {KC_DOT: "\"\n. >"}, + ], + CROATIAN: [ + + ], + CZECH: [ + + ], + DANISH: [ + + ], + DUTCH_BELGIUM: [ + + ], + ENGLISH_IRELAND: [ + + ], + ENGLISH_UK: [ + + ], + ENGLISH_US_EXTENDED: [ + + ], + ENGLISH_US_INTERNATIONAL: [ + + ], + ENGLISH_US_INTERNATIONAL_LINUX: [ + + ], + ESTONIAN: [ + + ], + FINNISH: [ + + ], + FRENCH: [ + + ], + FRENCH_AFNOR: [ + + ], + FRENCH_BPO: [ + + ], + FRENCH_BELGIUM: [ + + ], + FRENCH_SWITZERLAND: [ + + ], + FRENCH_MACOS_ISO: [ + + ], + GERMAN: [ + + ], + GERMAN_SWITZERLAND: [ + + ], + GERMAN_MACOS: [ + + ], + GERMAN_NEO: [ + + ], + GREEK: [ + + ], + HEBREW: [ + + ], + HUNGARIAN: [ + + ], + ICELANDIC: [ + + ], + ITALIAN: [ + + ], + ITALIAN_MACOS_ANSI: [ + + ], + ITALIAN_MACOS_ISO: [ + + ], + JAPANESE: [ + + ], + KOREAN: [ + + ], + LATVIAN: [ + + ], + LITHUANIAN_AERTY: [ + + ], + LITHUANIAN_QWERTY: [ + + ], + NORWEGIAN: [ + + ], + POLISH: [ + + ], + PORTUGUESE: [ + + ], + PORTUGUESE_MACOS_ISO: [ + + ], + PORTUGUESE_BRAZIL: [ + + ], + ROMANIAN: [ + + ], + RUSSIAN: [ + + ], + SERBIAN: [ + + ], + SERBIAN_LATIN: [ + + ], + SLOVAK: [ + + ], + SLOVENIAN: [ + + ], + SPANISH: [ + + ], + SPANISH_DVORAK: [ + + ], + SWEDISH: [ + + ], + SWEDISH_MACOS_ANSI: [ + + ], + SWEDISH_MACOS_ISO: [ + + ], + SWEDISH_PRO_MACOS_ANSI: [ + + ], + SWEDISH_PRO_MACOS_ISO: [ + + ], + TURKISH_F: [ + + ], + TURKISH_Q: [ + + ], + UKRAINIAN: [ + + ], + +};