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: '<
>',