From 57887f3f69e8799891e8463123c63fa3756f4c2e Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 19 Feb 2026 07:47:41 +0900 Subject: [PATCH] Add Korean and Japanese virtual keyboard layouts --- .../pages/desktop/virtual-keyboard/index.tsx | 20 ++- .../desktop/virtual-keyboard/virtual-keys.ts | 120 ++++++++++++++++++ 2 files changed, 137 insertions(+), 3 deletions(-) diff --git a/web/src/pages/desktop/virtual-keyboard/index.tsx b/web/src/pages/desktop/virtual-keyboard/index.tsx index 5503f41..3814e79 100644 --- a/web/src/pages/desktop/virtual-keyboard/index.tsx +++ b/web/src/pages/desktop/virtual-keyboard/index.tsx @@ -46,8 +46,10 @@ export const VirtualKeyboard = () => { const languages = [ { value: 'en', label: 'English' }, { value: 'fr', label: 'French' }, - { value: 'de', label: 'Deutsch' }, - { value: 'ru', label: 'Russian' } + { value: 'de', label: 'German' }, + { value: 'ru', label: 'Russian' }, + { value: 'ko', label: 'Korean' }, + { value: 'ja', label: 'Japanese' } ]; useEffect(() => { @@ -67,7 +69,9 @@ export const VirtualKeyboard = () => { ['en', 'default'], ['ru', 'rus'], ['de', 'qwertz'], - ['fr', 'azerty'] + ['fr', 'azerty'], + ['ko', 'ko'], + ['ja', 'ja'] ]); if (keyboardLanguage === 'en' && keyboardSystem === 'mac') { @@ -141,6 +145,16 @@ export const VirtualKeyboard = () => { return getKeycode(base); } + if (keyboardLanguage === 'ko' && key.endsWith('_ko')) { + const base = key.replace('_ko', ''); + return getKeycode(base); + } + + if (keyboardLanguage === 'ja' && key.endsWith('_ja')) { + const base = key.replace('_ja', ''); + return getKeycode(base); + } + const specialKey = specialKeyMap.get(key); if (specialKey) { return getKeycode(specialKey); diff --git a/web/src/pages/desktop/virtual-keyboard/virtual-keys.ts b/web/src/pages/desktop/virtual-keyboard/virtual-keys.ts index 84fb21a..3c9214b 100644 --- a/web/src/pages/desktop/virtual-keyboard/virtual-keys.ts +++ b/web/src/pages/desktop/virtual-keyboard/virtual-keys.ts @@ -44,6 +44,22 @@ export const keyboardOptions = { '{capslock} KeyQ_azerty KeyS_azerty KeyD_azerty KeyF_azerty KeyG_azerty KeyH_azerty KeyJ_azerty KeyK_azerty KeyL_azerty Semicolon_azerty Quote_azerty {enter}', '{shiftleft} KeyW_azerty KeyX_azerty KeyC_azerty KeyV_azerty KeyB_azerty KeyN_azerty KeyM_azerty Comma_azerty Period_azerty Slash_azerty {shiftright}', '{controlleft} {winleft} {altleft} {space} {altright} {winright} {menu} {controlright}' + ], + ko: [ + '{escape} F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12', + 'Backquote_ko Digit1_ko Digit2_ko Digit3_ko Digit4_ko Digit5_ko Digit6_ko Digit7_ko Digit8_ko Digit9_ko Digit0_ko Minus_ko Equal_ko {backspace}', + '{tab} KeyQ_ko KeyW_ko KeyE_ko KeyR_ko KeyT_ko KeyY_ko KeyU_ko KeyI_ko KeyO_ko KeyP_ko BracketLeft_ko BracketRight_ko Backslash_ko', + '{capslock} KeyA_ko KeyS_ko KeyD_ko KeyF_ko KeyG_ko KeyH_ko KeyJ_ko KeyK_ko KeyL_ko Semicolon_ko Quote_ko {enter}', + '{shiftleft} KeyZ_ko KeyX_ko KeyC_ko KeyV_ko KeyB_ko KeyN_ko KeyM_ko Comma_ko Period_ko Slash_ko {shiftright}', + '{controlleft} {winleft} {altleft} {space} {altright} {winright} {menu} {controlright}' + ], + ja: [ + '{escape} F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12', + 'Backquote_ja Digit1_ja Digit2_ja Digit3_ja Digit4_ja Digit5_ja Digit6_ja Digit7_ja Digit8_ja Digit9_ja Digit0_ja Minus_ja Equal_ja {backspace}', + '{tab} KeyQ_ja KeyW_ja KeyE_ja KeyR_ja KeyT_ja KeyY_ja KeyU_ja KeyI_ja KeyO_ja KeyP_ja BracketLeft_ja BracketRight_ja Backslash_ja', + '{capslock} KeyA_ja KeyS_ja KeyD_ja KeyF_ja KeyG_ja KeyH_ja KeyJ_ja KeyK_ja KeyL_ja Semicolon_ja Quote_ja {enter}', + '{shiftleft} KeyZ_ja KeyX_ja KeyC_ja KeyV_ja KeyB_ja KeyN_ja KeyM_ja Comma_ja Period_ja Slash_ja {shiftright}', + '{controlleft} {winleft} {altleft} {space} {altright} {winright} {menu} {controlright}' ] }, display: { @@ -186,6 +202,110 @@ export const keyboardOptions = { RusPeriod: 'Ю', RusSlash: ',
.', + // Korean (2-set) display + Backquote_ko: '`', + Digit1_ko: '1', + Digit2_ko: '2', + Digit3_ko: '3', + Digit4_ko: '4', + Digit5_ko: '5', + Digit6_ko: '6', + Digit7_ko: '7', + Digit8_ko: '8', + Digit9_ko: '9', + Digit0_ko: '0', + Minus_ko: '-', + Equal_ko: '=', + + KeyQ_ko: 'ㅂ', + KeyW_ko: 'ㅈ', + KeyE_ko: 'ㄷ', + KeyR_ko: 'ㄱ', + KeyT_ko: 'ㅅ', + KeyY_ko: 'ㅛ', + KeyU_ko: 'ㅕ', + KeyI_ko: 'ㅑ', + KeyO_ko: 'ㅐ', + KeyP_ko: 'ㅔ', + BracketLeft_ko: '[', + BracketRight_ko: ']', + Backslash_ko: '\\', + + KeyA_ko: 'ㅁ', + KeyS_ko: 'ㄴ', + KeyD_ko: 'ㅇ', + KeyF_ko: 'ㄹ', + KeyG_ko: 'ㅎ', + KeyH_ko: 'ㅗ', + KeyJ_ko: 'ㅓ', + KeyK_ko: 'ㅏ', + KeyL_ko: 'ㅣ', + Semicolon_ko: ';', + Quote_ko: "'", + + KeyZ_ko: 'ㅋ', + KeyX_ko: 'ㅌ', + KeyC_ko: 'ㅊ', + KeyV_ko: 'ㅍ', + KeyB_ko: 'ㅠ', + KeyN_ko: 'ㅜ', + KeyM_ko: 'ㅡ', + Comma_ko: ',', + Period_ko: '.', + Slash_ko: '/', + + // Japanese display (representative hiragana per key) + Backquote_ja: '`', + Digit1_ja: '1', + Digit2_ja: '2', + Digit3_ja: '3', + Digit4_ja: '4', + Digit5_ja: '5', + Digit6_ja: '6', + Digit7_ja: '7', + Digit8_ja: '8', + Digit9_ja: '9', + Digit0_ja: '0', + Minus_ja: '-', + Equal_ja: '=', + + KeyQ_ja: 'た', + KeyW_ja: 'て', + KeyE_ja: 'い', + KeyR_ja: 'す', + KeyT_ja: 'か', + KeyY_ja: 'ん', + KeyU_ja: 'な', + KeyI_ja: 'に', + KeyO_ja: 'ら', + KeyP_ja: 'せ', + BracketLeft_ja: '[', + BracketRight_ja: ']', + Backslash_ja: '\\', + + KeyA_ja: 'ち', + KeyS_ja: 'と', + KeyD_ja: 'し', + KeyF_ja: 'は', + KeyG_ja: 'き', + KeyH_ja: 'く', + KeyJ_ja: 'ま', + KeyK_ja: 'の', + KeyL_ja: 'り', + Semicolon_ja: ';', + Quote_ja: "'", + + KeyZ_ja: 'つ', + KeyX_ja: 'さ', + KeyC_ja: 'そ', + KeyV_ja: 'ひ', + KeyB_ja: 'こ', + KeyN_ja: 'み', + KeyM_ja: 'も', + Comma_ja: ',', + Period_ja: '.', + Slash_ja: '/', + // AZERTY specific display keys // Row 1 Backquote_azerty: '<
>',