({
+ isOpen: false,
+ text: '',
+ layoutId: 'auto',
+ isPasting: false,
+ progress: 0,
+ currentChar: 0,
+ totalChars: 0
+});
+
+// Request to show paste dialog
+export function requestPaste(text: string, layoutId: string, setState: (state: any) => void) {
+ setState({
+ isOpen: true,
+ text,
+ layoutId,
+ isPasting: false,
+ progress: 0,
+ currentChar: 0,
+ totalChars: text.length
+ });
+}
+
+export const PasteDialog = () => {
+ const { t } = useTranslation();
+ const [state, setState] = useAtom(pasteStateAtom);
+ const pasteSpeed = useAtomValue(pasteSpeedAtom);
+ const cancelRef = useRef(false);
+ const [estimatedTime, setEstimatedTime] = useState(0);
+
+ useEffect(() => {
+ // Estimate time based on speed setting (key down + key up delay)
+ const msPerChar = pasteSpeed + Math.ceil(pasteSpeed / 2);
+ setEstimatedTime(Math.ceil(state.text.length * msPerChar / 1000));
+ }, [state.text, pasteSpeed]);
+
+ // Focus the OK button when dialog opens
+ useEffect(() => {
+ if (state.isOpen && !state.isPasting) {
+ // Small delay to ensure modal is rendered
+ const timer = setTimeout(() => {
+ const okButton = document.querySelector('.ant-modal-footer .ant-btn-primary') as HTMLButtonElement;
+ if (okButton) {
+ okButton.focus();
+ }
+ }, 50);
+ return () => clearTimeout(timer);
+ }
+ }, [state.isOpen, state.isPasting]);
+
+ const handleCancel = () => {
+ if (state.isPasting) {
+ cancelRef.current = true;
+ } else {
+ setState((prev) => ({ ...prev, isOpen: false, text: '' }));
+ }
+ };
+
+ const handleConfirm = async () => {
+ cancelRef.current = false;
+ setState((prev) => ({ ...prev, isPasting: true, progress: 0, currentChar: 0 }));
+
+ const layout: LayoutMap = getLayoutById(state.layoutId);
+ const text = state.text;
+ const keyDownDelay = pasteSpeed;
+ const keyUpDelay = Math.ceil(pasteSpeed / 2);
+
+ // Release all keys first - send multiple times to ensure clean state
+ await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]);
+ await new Promise((r) => setTimeout(r, 50));
+ await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]);
+ await new Promise((r) => setTimeout(r, 50));
+
+ for (let i = 0; i < text.length; i++) {
+ if (cancelRef.current) {
+ // Release all keys on cancel
+ await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]);
+ setState((prev) => ({ ...prev, isOpen: false, isPasting: false, text: '' }));
+ return;
+ }
+
+ const char = text[i];
+ const mapping = layout[char];
+
+ if (mapping) {
+ let modifier = 0;
+ if (mapping.shift) modifier |= ModifierBits.LeftShift;
+ if (mapping.altGr) modifier |= ModifierBits.RightAlt;
+
+ console.log(`Paste char '${char}' code=0x${mapping.code.toString(16)} mod=0x${modifier.toString(16)} shift=${!!mapping.shift} altGr=${!!mapping.altGr}`);
+
+ // For modified keys (Shift/AltGr), press modifier first, then key
+ // This is more compatible with Windows login screen and other sensitive inputs
+ if (modifier !== 0) {
+ // Press modifier first
+ await device.sendKeyboardData([modifier, 0, 0, 0, 0, 0, 0, 0]);
+ await new Promise((r) => setTimeout(r, Math.max(keyDownDelay, 20)));
+ }
+
+ // Press key (with modifier held)
+ await device.sendKeyboardData([modifier, 0, mapping.code, 0, 0, 0, 0, 0]);
+ await new Promise((r) => setTimeout(r, keyDownDelay));
+
+ // Release key (modifier still held)
+ if (modifier !== 0) {
+ await device.sendKeyboardData([modifier, 0, 0, 0, 0, 0, 0, 0]);
+ await new Promise((r) => setTimeout(r, Math.max(keyUpDelay, 15)));
+ }
+
+ // Release modifier
+ await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]);
+ if (mapping.altGr) {
+ // Extra release for AltGr
+ await new Promise((r) => setTimeout(r, keyUpDelay));
+ await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]);
+ }
+ await new Promise((r) => setTimeout(r, keyUpDelay));
+
+ // For dead keys, send space to produce the standalone character
+ if (mapping.deadKey) {
+ // Space key down
+ await device.sendKeyboardData([0, 0, 0x2c, 0, 0, 0, 0, 0]);
+ await new Promise((r) => setTimeout(r, keyDownDelay));
+ // Space key up
+ await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]);
+ await new Promise((r) => setTimeout(r, keyUpDelay));
+ }
+ }
+
+ // Update progress
+ const progress = Math.round(((i + 1) / text.length) * 100);
+ setState((prev) => ({ ...prev, progress, currentChar: i + 1 }));
+ }
+
+ setState((prev) => ({ ...prev, isOpen: false, isPasting: false, text: '' }));
+ };
+
+ const previewText = state.text.length > 200
+ ? state.text.substring(0, 200) + '...'
+ : state.text;
+
+ return (
+
+ {!state.isPasting ? (
+
+
+ {t('keyboard.pastePreview', 'Text to paste')} ({state.text.length} {t('keyboard.characters', 'characters')}, ~{estimatedTime}s):
+
+
+ {previewText}
+
+
+ ) : (
+
+
+
+ {state.currentChar} / {state.totalChars} {t('keyboard.characters', 'characters')}
+
+
+ {t('keyboard.pressStopToCancel', 'Press Stop to cancel')}
+
+
+ )}
+
+ );
+};
diff --git a/browser/src/jotai/keyboard.ts b/browser/src/jotai/keyboard.ts
index 8b560cd6..8f468202 100644
--- a/browser/src/jotai/keyboard.ts
+++ b/browser/src/jotai/keyboard.ts
@@ -1,5 +1,11 @@
import { atom } from 'jotai';
+import * as storage from '@/libs/storage';
+
export const isKeyboardEnableAtom = atom(true);
export const isKeyboardOpenAtom = atom(false);
+
+export const targetKeyboardLayoutAtom = atom(storage.getTargetKeyboardLayout());
+
+export const pasteSpeedAtom = atom
(storage.getPasteSpeed());
diff --git a/browser/src/libs/keyboard/layouts.generated.ts b/browser/src/libs/keyboard/layouts.generated.ts
new file mode 100644
index 00000000..6c49d8ab
--- /dev/null
+++ b/browser/src/libs/keyboard/layouts.generated.ts
@@ -0,0 +1,9290 @@
+// Auto-generated from XKB layout data (xkeyboard-config)
+// Source: https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config
+// Generated by: scripts/generate-layouts.py
+//
+// DO NOT EDIT MANUALLY - regenerate with: python3 scripts/generate-layouts.py
+
+import type { LayoutMap } from './layouts';
+
+export const GENERATED_LAYOUTS: Record = {
+ // Albanian
+ 'al': {
+ name: 'Albanian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '~': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '`': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '|': { code: 0x1a, altGr: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00e7': { code: 0x2f }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00c7': { code: 0x2f, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA
+ '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN
+ '@': { code: 0x30 },
+ '\'': { code: 0x30, shift: true },
+ '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '[': { code: 0x09, altGr: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ ']': { code: 0x0a, altGr: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u00eb': { code: 0x33 }, // ë LATIN SMALL LETTER E WITH DIAERESIS
+ '\u00cb': { code: 0x33, shift: true }, // Ë LATIN CAPITAL LETTER E WITH DIAERESIS
+ '{': { code: 0x34, shift: true },
+ '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN
+ '}': { code: 0x31, shift: true },
+ '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '<': { code: 0x36, altGr: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '>': { code: 0x37, altGr: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Arabic
+ 'ara': {
+ name: 'Arabic',
+ map: {
+ '\u0630': { code: 0x35 }, // ذ ARABIC LETTER THAL
+ '\u0651': { code: 0x35, shift: true }, // ّ ARABIC SHADDA
+ '\u066a': { code: 0x35, altGr: true }, // ٪ ARABIC PERCENT SIGN
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u0661': { code: 0x1e, altGr: true }, // ١ ARABIC-INDIC DIGIT ONE
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u0662': { code: 0x1f, altGr: true }, // ٢ ARABIC-INDIC DIGIT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u0663': { code: 0x20, altGr: true }, // ٣ ARABIC-INDIC DIGIT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u0664': { code: 0x21, altGr: true }, // ٤ ARABIC-INDIC DIGIT FOUR
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u0665': { code: 0x22, altGr: true }, // ٥ ARABIC-INDIC DIGIT FIVE
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u0666': { code: 0x23, altGr: true }, // ٦ ARABIC-INDIC DIGIT SIX
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u0667': { code: 0x24, altGr: true }, // ٧ ARABIC-INDIC DIGIT SEVEN
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u0668': { code: 0x25, altGr: true }, // ٨ ARABIC-INDIC DIGIT EIGHT
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '\u0669': { code: 0x26, altGr: true }, // ٩ ARABIC-INDIC DIGIT NINE
+ '0': { code: 0x27 },
+ '(': { code: 0x27, shift: true },
+ '\u0660': { code: 0x27, altGr: true }, // ٠ ARABIC-INDIC DIGIT ZERO
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u2013': { code: 0x2d, altGr: true }, // – EN DASH
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO
+ '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD
+ '\u064e': { code: 0x14, shift: true }, // َ ARABIC FATHA
+ '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD
+ '\u064b': { code: 0x1a, shift: true }, // ً ARABIC FATHATAN
+ '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH
+ '\u064f': { code: 0x08, shift: true }, // ُ ARABIC DAMMA
+ '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF
+ '\u064c': { code: 0x15, shift: true }, // ٌ ARABIC DAMMATAN
+ '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH
+ '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+ '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH
+ '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN
+ '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW
+ '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN
+ '`': { code: 0x18, shift: true },
+ '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH
+ '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN
+ '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH
+ '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN
+ '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH
+ '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON
+ '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM
+ '<': { code: 0x2f, shift: true },
+ '\u0686': { code: 0x2f, altGr: true }, // چ ARABIC LETTER TCHEH
+ '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL
+ '>': { code: 0x30, shift: true },
+ '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN
+ '\u0650': { code: 0x04, shift: true }, // ِ ARABIC KASRA
+ '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN
+ '\u064d': { code: 0x16, shift: true }, // ٍ ARABIC KASRATAN
+ '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH
+ ']': { code: 0x07, shift: true },
+ '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH
+ '[': { code: 0x09, shift: true },
+ '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH
+ '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM
+ '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+ '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF
+ '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE
+ '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA
+ '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH
+ '\u0640': { code: 0x0d, shift: true }, // ـ ARABIC TATWEEL
+ '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON
+ '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA
+ '\u066b': { code: 0x0e, altGr: true }, // ٫ ARABIC DECIMAL SEPARATOR
+ '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM
+ '/': { code: 0x0f, shift: true },
+ '\u0643': { code: 0x33 }, // ك ARABIC LETTER KAF
+ ':': { code: 0x33, shift: true },
+ '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF
+ '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH
+ '"': { code: 0x34, shift: true },
+ '\u27e9': { code: 0x34, altGr: true }, // ⟩ MATHEMATICAL RIGHT ANGLE BRACKET
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u27e8': { code: 0x31, altGr: true }, // ⟨ MATHEMATICAL LEFT ANGLE BRACKET
+ '\u2026': { code: 0x64, shift: true }, // … HORIZONTAL ELLIPSIS
+ '\u00a6': { code: 0x64, altGr: true }, // ¦ BROKEN BAR
+ '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE
+ '~': { code: 0x1d, shift: true },
+ '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA
+ '\u0652': { code: 0x1b, shift: true }, // ْ ARABIC SUKUN
+ '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE
+ '}': { code: 0x06, shift: true },
+ '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH
+ '{': { code: 0x19, shift: true },
+ '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+ '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA
+ '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE
+ '\u0670': { code: 0x11, altGr: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF
+ '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA
+ '\'': { code: 0x10, shift: true },
+ '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW
+ ',': { code: 0x36, shift: true },
+ '\u066c': { code: 0x36, altGr: true }, // ٬ ARABIC THOUSANDS SEPARATOR
+ '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN
+ '.': { code: 0x37, shift: true },
+ '\u0698': { code: 0x37, altGr: true }, // ژ ARABIC LETTER JEH
+ '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH
+ '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK
+ '\u066d': { code: 0x38, altGr: true }, // ٭ ARABIC FIVE POINTED STAR
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Armenian
+ 'am': {
+ name: 'Armenian',
+ map: {
+ '\u055d': { code: 0x35 }, // ՝ ARMENIAN COMMA
+ '\u055c': { code: 0x35, shift: true }, // ՜ ARMENIAN EXCLAMATION MARK
+ '\u0586': { code: 0x1e }, // ֆ ARMENIAN SMALL LETTER FEH
+ '\u0556': { code: 0x1e, shift: true }, // Ֆ ARMENIAN CAPITAL LETTER FEH
+ '\u0571': { code: 0x1f }, // ձ ARMENIAN SMALL LETTER JA
+ '\u0541': { code: 0x1f, shift: true }, // Ձ ARMENIAN CAPITAL LETTER JA
+ '\u058a': { code: 0x20 }, // ֊ ARMENIAN HYPHEN
+ '\u2014': { code: 0x20, shift: true }, // — EM DASH
+ ',': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u0589': { code: 0x22 }, // ։ ARMENIAN FULL STOP
+ '\u2026': { code: 0x22, shift: true }, // … HORIZONTAL ELLIPSIS
+ '\u055e': { code: 0x23 }, // ՞ ARMENIAN QUESTION MARK
+ '%': { code: 0x23, shift: true },
+ '\u2024': { code: 0x24 }, // ․ ONE DOT LEADER
+ '\u0587': { code: 0x24, shift: true }, // և ARMENIAN SMALL LIGATURE ECH YIWN
+ '\u055b': { code: 0x25 }, // ՛ ARMENIAN EMPHASIS MARK
+ '\u055a': { code: 0x25, shift: true }, // ՚ ARMENIAN APOSTROPHE
+ ')': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '\u0585': { code: 0x27 }, // օ ARMENIAN SMALL LETTER OH
+ '\u0555': { code: 0x27, shift: true }, // Օ ARMENIAN CAPITAL LETTER OH
+ '\u0567': { code: 0x2d }, // է ARMENIAN SMALL LETTER EH
+ '\u0537': { code: 0x2d, shift: true }, // Է ARMENIAN CAPITAL LETTER EH
+ '\u0572': { code: 0x2e }, // ղ ARMENIAN SMALL LETTER GHAD
+ '\u0542': { code: 0x2e, shift: true }, // Ղ ARMENIAN CAPITAL LETTER GHAD
+ '\u0573': { code: 0x14 }, // ճ ARMENIAN SMALL LETTER CHEH
+ '\u0543': { code: 0x14, shift: true }, // Ճ ARMENIAN CAPITAL LETTER CHEH
+ '\u0583': { code: 0x1a }, // փ ARMENIAN SMALL LETTER PIWR
+ '\u0553': { code: 0x1a, shift: true }, // Փ ARMENIAN CAPITAL LETTER PIWR
+ '\u0562': { code: 0x08 }, // բ ARMENIAN SMALL LETTER BEN
+ '\u0532': { code: 0x08, shift: true }, // Բ ARMENIAN CAPITAL LETTER BEN
+ '\u057d': { code: 0x15 }, // ս ARMENIAN SMALL LETTER SEH
+ '\u054d': { code: 0x15, shift: true }, // Ս ARMENIAN CAPITAL LETTER SEH
+ '\u0574': { code: 0x17 }, // մ ARMENIAN SMALL LETTER MEN
+ '\u0544': { code: 0x17, shift: true }, // Մ ARMENIAN CAPITAL LETTER MEN
+ '\u0578': { code: 0x1c }, // ո ARMENIAN SMALL LETTER VO
+ '\u0548': { code: 0x1c, shift: true }, // Ո ARMENIAN CAPITAL LETTER VO
+ '\u0582': { code: 0x18 }, // ւ ARMENIAN SMALL LETTER YIWN
+ '\u0552': { code: 0x18, shift: true }, // Ւ ARMENIAN CAPITAL LETTER YIWN
+ '\u056f': { code: 0x0c }, // կ ARMENIAN SMALL LETTER KEN
+ '\u053f': { code: 0x0c, shift: true }, // Կ ARMENIAN CAPITAL LETTER KEN
+ '\u0568': { code: 0x12 }, // ը ARMENIAN SMALL LETTER ET
+ '\u0538': { code: 0x12, shift: true }, // Ը ARMENIAN CAPITAL LETTER ET
+ '\u0569': { code: 0x13 }, // թ ARMENIAN SMALL LETTER TO
+ '\u0539': { code: 0x13, shift: true }, // Թ ARMENIAN CAPITAL LETTER TO
+ '\u056e': { code: 0x2f }, // ծ ARMENIAN SMALL LETTER CA
+ '\u053e': { code: 0x2f, shift: true }, // Ծ ARMENIAN CAPITAL LETTER CA
+ '\u0581': { code: 0x30 }, // ց ARMENIAN SMALL LETTER CO
+ '\u0551': { code: 0x30, shift: true }, // Ց ARMENIAN CAPITAL LETTER CO
+ '\u057b': { code: 0x04 }, // ջ ARMENIAN SMALL LETTER JHEH
+ '\u054b': { code: 0x04, shift: true }, // Ջ ARMENIAN CAPITAL LETTER JHEH
+ '\u057e': { code: 0x16 }, // վ ARMENIAN SMALL LETTER VEW
+ '\u054e': { code: 0x16, shift: true }, // Վ ARMENIAN CAPITAL LETTER VEW
+ '\u0563': { code: 0x07 }, // գ ARMENIAN SMALL LETTER GIM
+ '\u0533': { code: 0x07, shift: true }, // Գ ARMENIAN CAPITAL LETTER GIM
+ '\u0565': { code: 0x09 }, // ե ARMENIAN SMALL LETTER ECH
+ '\u0535': { code: 0x09, shift: true }, // Ե ARMENIAN CAPITAL LETTER ECH
+ '\u0561': { code: 0x0a }, // ա ARMENIAN SMALL LETTER AYB
+ '\u0531': { code: 0x0a, shift: true }, // Ա ARMENIAN CAPITAL LETTER AYB
+ '\u0576': { code: 0x0b }, // ն ARMENIAN SMALL LETTER NOW
+ '\u0546': { code: 0x0b, shift: true }, // Ն ARMENIAN CAPITAL LETTER NOW
+ '\u056b': { code: 0x0d }, // ի ARMENIAN SMALL LETTER INI
+ '\u053b': { code: 0x0d, shift: true }, // Ի ARMENIAN CAPITAL LETTER INI
+ '\u057f': { code: 0x0e }, // տ ARMENIAN SMALL LETTER TIWN
+ '\u054f': { code: 0x0e, shift: true }, // Տ ARMENIAN CAPITAL LETTER TIWN
+ '\u0570': { code: 0x0f }, // հ ARMENIAN SMALL LETTER HO
+ '\u0540': { code: 0x0f, shift: true }, // Հ ARMENIAN CAPITAL LETTER HO
+ '\u057a': { code: 0x33 }, // պ ARMENIAN SMALL LETTER PEH
+ '\u054a': { code: 0x33, shift: true }, // Պ ARMENIAN CAPITAL LETTER PEH
+ '\u0580': { code: 0x34 }, // ր ARMENIAN SMALL LETTER REH
+ '\u0550': { code: 0x34, shift: true }, // Ր ARMENIAN CAPITAL LETTER REH
+ '\u00bb': { code: 0x31 }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u00ab': { code: 0x31, shift: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '?': { code: 0x64 },
+ '\u056a': { code: 0x1d }, // ժ ARMENIAN SMALL LETTER ZHE
+ '\u053a': { code: 0x1d, shift: true }, // Ժ ARMENIAN CAPITAL LETTER ZHE
+ '\u0564': { code: 0x1b }, // դ ARMENIAN SMALL LETTER DA
+ '\u0534': { code: 0x1b, shift: true }, // Դ ARMENIAN CAPITAL LETTER DA
+ '\u0579': { code: 0x06 }, // չ ARMENIAN SMALL LETTER CHA
+ '\u0549': { code: 0x06, shift: true }, // Չ ARMENIAN CAPITAL LETTER CHA
+ '\u0575': { code: 0x19 }, // յ ARMENIAN SMALL LETTER YI
+ '\u0545': { code: 0x19, shift: true }, // Յ ARMENIAN CAPITAL LETTER YI
+ '\u0566': { code: 0x05 }, // զ ARMENIAN SMALL LETTER ZA
+ '\u0536': { code: 0x05, shift: true }, // Զ ARMENIAN CAPITAL LETTER ZA
+ '\u056c': { code: 0x11 }, // լ ARMENIAN SMALL LETTER LIWN
+ '\u053c': { code: 0x11, shift: true }, // Լ ARMENIAN CAPITAL LETTER LIWN
+ '\u0584': { code: 0x10 }, // ք ARMENIAN SMALL LETTER KEH
+ '\u0554': { code: 0x10, shift: true }, // Ք ARMENIAN CAPITAL LETTER KEH
+ '\u056d': { code: 0x36 }, // խ ARMENIAN SMALL LETTER XEH
+ '\u053d': { code: 0x36, shift: true }, // Խ ARMENIAN CAPITAL LETTER XEH
+ '\u0577': { code: 0x37 }, // շ ARMENIAN SMALL LETTER SHA
+ '\u0547': { code: 0x37, shift: true }, // Շ ARMENIAN CAPITAL LETTER SHA
+ '\u057c': { code: 0x38 }, // ռ ARMENIAN SMALL LETTER RA
+ '\u054c': { code: 0x38, shift: true }, // Ռ ARMENIAN CAPITAL LETTER RA
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Austrian
+ 'at': {
+ name: 'Austrian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '\u00a7': { code: 0x20, shift: true }, // § SECTION SIGN
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\u00df': { code: 0x2d }, // ß LATIN SMALL LETTER SHARP S
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+ '*': { code: 0x30, shift: true },
+ '~': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS
+ '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN
+ '\u2032': { code: 0x35, altGr: true }, // ′ PRIME
+ '#': { code: 0x31 },
+ '\'': { code: 0x31, shift: true },
+ '\u2019': { code: 0x31, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u00b7': { code: 0x36, altGr: true }, // · MIDDLE DOT
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '\u2013': { code: 0x38, altGr: true }, // – EN DASH
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '|': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Azerbaijani
+ 'az': {
+ name: 'Azerbaijani',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ ';': { code: 0x21, shift: true },
+ '\u20bc': { code: 0x21, altGr: true }, // ₼ MANAT SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ ':': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '?': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u00fc': { code: 0x1a }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00dc': { code: 0x1a, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ '\u0130': { code: 0x0c, shift: true }, // İ LATIN CAPITAL LETTER I WITH DOT ABOVE
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00f6': { code: 0x2f }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x2f, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u011f': { code: 0x30 }, // ğ LATIN SMALL LETTER G WITH BREVE
+ '\u011e': { code: 0x30, shift: true }, // Ğ LATIN CAPITAL LETTER G WITH BREVE
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0131': { code: 0x33 }, // ı LATIN SMALL LETTER DOTLESS I
+ 'I': { code: 0x33, shift: true },
+ '\u0259': { code: 0x34 }, // ə LATIN SMALL LETTER SCHWA
+ '\u018f': { code: 0x34, shift: true }, // Ə LATIN CAPITAL LETTER SCHWA
+ '\\': { code: 0x31 },
+ '/': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00e7': { code: 0x36 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00c7': { code: 0x36, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA
+ '\u015f': { code: 0x37 }, // ş LATIN SMALL LETTER S WITH CEDILLA
+ '\u015e': { code: 0x37, shift: true }, // Ş LATIN CAPITAL LETTER S WITH CEDILLA
+ '.': { code: 0x38 },
+ ',': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Bangla
+ 'bd': {
+ name: 'Bangla',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u09e7': { code: 0x1e }, // ১ BENGALI DIGIT ONE
+ '!': { code: 0x1e, shift: true },
+ '\u09f4': { code: 0x1e, altGr: true }, // ৴ BENGALI CURRENCY NUMERATOR ONE
+ '\u09e8': { code: 0x1f }, // ২ BENGALI DIGIT TWO
+ '@': { code: 0x1f, shift: true },
+ '\u09f5': { code: 0x1f, altGr: true }, // ৵ BENGALI CURRENCY NUMERATOR TWO
+ '\u09e9': { code: 0x20 }, // ৩ BENGALI DIGIT THREE
+ '#': { code: 0x20, shift: true },
+ '\u09f6': { code: 0x20, altGr: true }, // ৶ BENGALI CURRENCY NUMERATOR THREE
+ '\u09ea': { code: 0x21 }, // ৪ BENGALI DIGIT FOUR
+ '$': { code: 0x21, shift: true },
+ '\u09f3': { code: 0x21, altGr: true }, // ৳ BENGALI RUPEE SIGN
+ '\u09eb': { code: 0x22 }, // ৫ BENGALI DIGIT FIVE
+ '%': { code: 0x22, shift: true },
+ '\u09f7': { code: 0x22, altGr: true }, // ৷ BENGALI CURRENCY NUMERATOR FOUR
+ '\u09ec': { code: 0x23 }, // ৬ BENGALI DIGIT SIX
+ '^': { code: 0x23, shift: true },
+ '\u09f8': { code: 0x23, altGr: true }, // ৸ BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+ '\u09ed': { code: 0x24 }, // ৭ BENGALI DIGIT SEVEN
+ '&': { code: 0x24, shift: true },
+ '\u0902': { code: 0x24, altGr: true }, // ं DEVANAGARI SIGN ANUSVARA
+ '\u09ee': { code: 0x25 }, // ৮ BENGALI DIGIT EIGHT
+ '*': { code: 0x25, shift: true },
+ '\u09ef': { code: 0x26 }, // ৯ BENGALI DIGIT NINE
+ '(': { code: 0x26, shift: true },
+ '\u09e6': { code: 0x27 }, // ০ BENGALI DIGIT ZERO
+ ')': { code: 0x27, shift: true },
+ '\u09f9': { code: 0x27, altGr: true }, // ৹ BENGALI CURRENCY DENOMINATOR SIXTEEN
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u200c': { code: 0x2d, altGr: true }, // ZERO WIDTH NON-JOINER
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u200d': { code: 0x2e, altGr: true }, // ZERO WIDTH JOINER
+ '\u0999': { code: 0x14 }, // ঙ BENGALI LETTER NGA
+ '\u0982': { code: 0x14, shift: true }, // ং BENGALI SIGN ANUSVARA
+ '\u09e2': { code: 0x14, altGr: true }, // ৢ BENGALI VOWEL SIGN VOCALIC L
+ '\u09af': { code: 0x1a }, // য BENGALI LETTER YA
+ '\u09df': { code: 0x1a, shift: true }, // য় BENGALI LETTER YYA
+ '\u09a1': { code: 0x08 }, // ড BENGALI LETTER DDA
+ '\u09a2': { code: 0x08, shift: true }, // ঢ BENGALI LETTER DDHA
+ '\u09c4': { code: 0x08, altGr: true }, // ৄ BENGALI VOWEL SIGN VOCALIC RR
+ '\u09aa': { code: 0x15 }, // প BENGALI LETTER PA
+ '\u09ab': { code: 0x15, shift: true }, // ফ BENGALI LETTER PHA
+ '\u099f': { code: 0x17 }, // ট BENGALI LETTER TTA
+ '\u09a0': { code: 0x17, shift: true }, // ঠ BENGALI LETTER TTHA
+ '\u099a': { code: 0x1c }, // চ BENGALI LETTER CA
+ '\u099b': { code: 0x1c, shift: true }, // ছ BENGALI LETTER CHA
+ '\u099c': { code: 0x18 }, // জ BENGALI LETTER JA
+ '\u099d': { code: 0x18, shift: true }, // ঝ BENGALI LETTER JHA
+ '\u09b9': { code: 0x0c }, // হ BENGALI LETTER HA
+ '\u099e': { code: 0x0c, shift: true }, // ঞ BENGALI LETTER NYA
+ '\u09bd': { code: 0x0c, altGr: true }, // ঽ BENGALI SIGN AVAGRAHA
+ '\u0997': { code: 0x12 }, // গ BENGALI LETTER GA
+ '\u0998': { code: 0x12, shift: true }, // ঘ BENGALI LETTER GHA
+ '\u09dc': { code: 0x13 }, // ড় BENGALI LETTER RRA
+ '\u09dd': { code: 0x13, shift: true }, // ঢ় BENGALI LETTER RHA
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u09c3': { code: 0x04 }, // ৃ BENGALI VOWEL SIGN VOCALIC R
+ '\u09d7': { code: 0x04, shift: true }, // ৗ BENGALI AU LENGTH MARK
+ '\u098b': { code: 0x04, altGr: true }, // ঋ BENGALI LETTER VOCALIC R
+ '\u09c1': { code: 0x16 }, // ু BENGALI VOWEL SIGN U
+ '\u09c2': { code: 0x16, shift: true }, // ূ BENGALI VOWEL SIGN UU
+ '\u0989': { code: 0x16, altGr: true }, // উ BENGALI LETTER U
+ '\u09bf': { code: 0x07 }, // ি BENGALI VOWEL SIGN I
+ '\u09c0': { code: 0x07, shift: true }, // ী BENGALI VOWEL SIGN II
+ '\u0987': { code: 0x07, altGr: true }, // ই BENGALI LETTER I
+ '\u09ac': { code: 0x09 }, // ব BENGALI LETTER BA
+ '\u09ad': { code: 0x09, shift: true }, // ভ BENGALI LETTER BHA
+ '\u09f0': { code: 0x09, altGr: true }, // ৰ BENGALI LETTER RA WITH MIDDLE DIAGONAL
+ '\u09cd': { code: 0x0a }, // ্ BENGALI SIGN VIRAMA
+ '\u0964': { code: 0x0a, shift: true }, // । DEVANAGARI DANDA
+ '\u0965': { code: 0x0a, altGr: true }, // ॥ DEVANAGARI DOUBLE DANDA
+ '\u09be': { code: 0x0b }, // া BENGALI VOWEL SIGN AA
+ '\u0985': { code: 0x0b, shift: true }, // অ BENGALI LETTER A
+ '\u0986': { code: 0x0b, altGr: true }, // আ BENGALI LETTER AA
+ '\u0995': { code: 0x0d }, // ক BENGALI LETTER KA
+ '\u0996': { code: 0x0d, shift: true }, // খ BENGALI LETTER KHA
+ '\u09bb': { code: 0x0d, altGr: true },
+ '\u09a4': { code: 0x0e }, // ত BENGALI LETTER TA
+ '\u09a5': { code: 0x0e, shift: true }, // থ BENGALI LETTER THA
+ '\u09ce': { code: 0x0e, altGr: true }, // ৎ BENGALI LETTER KHANDA TA
+ '\u09a6': { code: 0x0f }, // দ BENGALI LETTER DA
+ '\u09a7': { code: 0x0f, shift: true }, // ধ BENGALI LETTER DHA
+ '\u098c': { code: 0x0f, altGr: true }, // ঌ BENGALI LETTER VOCALIC L
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u0981': { code: 0x1d }, // ঁ BENGALI SIGN CANDRABINDU
+ '\u0983': { code: 0x1d, shift: true }, // ঃ BENGALI SIGN VISARGA
+ '\u09fa': { code: 0x1d, altGr: true }, // ৺ BENGALI ISSHAR
+ '\u09cb': { code: 0x1b }, // ো BENGALI VOWEL SIGN O
+ '\u09cc': { code: 0x1b, shift: true }, // ৌ BENGALI VOWEL SIGN AU
+ '\u0993': { code: 0x1b, altGr: true }, // ও BENGALI LETTER O
+ '\u09c7': { code: 0x06 }, // ে BENGALI VOWEL SIGN E
+ '\u09c8': { code: 0x06, shift: true }, // ৈ BENGALI VOWEL SIGN AI
+ '\u098f': { code: 0x06, altGr: true }, // এ BENGALI LETTER E
+ '\u09b0': { code: 0x19 }, // র BENGALI LETTER RA
+ '\u09b2': { code: 0x19, shift: true }, // ল BENGALI LETTER LA
+ '\u09a8': { code: 0x05 }, // ন BENGALI LETTER NA
+ '\u09a3': { code: 0x05, shift: true }, // ণ BENGALI LETTER NNA
+ '\u09b8': { code: 0x11 }, // স BENGALI LETTER SA
+ '\u09b7': { code: 0x11, shift: true }, // ষ BENGALI LETTER SSA
+ '\u09ae': { code: 0x10 }, // ম BENGALI LETTER MA
+ '\u09b6': { code: 0x10, shift: true }, // শ BENGALI LETTER SHA
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u09bc': { code: 0x37, altGr: true }, // ় BENGALI SIGN NUKTA
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Belarusian
+ 'by': {
+ name: 'Belarusian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ ';': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ ':': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '?': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u20bd': { code: 0x25, altGr: true }, // ₽ RUBLE SIGN
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\\': { code: 0x31 },
+ '/': { code: 0x31, shift: true },
+ '.': { code: 0x38 },
+ ',': { code: 0x38, shift: true },
+ '|': { code: 0x64, shift: true },
+ '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO
+ '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO
+ '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0491': { code: 0x18, altGr: true }, // ґ CYRILLIC SMALL LETTER GHE WITH UPTURN
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u045e': { code: 0x12 }, // ў CYRILLIC SMALL LETTER SHORT U
+ '\u040e': { code: 0x12, shift: true }, // Ў CYRILLIC CAPITAL LETTER SHORT U
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\'': { code: 0x30 },
+ '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU
+ '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU
+ '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E
+ '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0456': { code: 0x05 }, // і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u0406': { code: 0x05, shift: true }, // І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Belgian
+ 'be': {
+ name: 'Belgian',
+ map: {
+ '&': { code: 0x1e },
+ '1': { code: 0x1e, shift: true },
+ '|': { code: 0x1e, altGr: true },
+ '\u00e9': { code: 0x1f }, // é LATIN SMALL LETTER E WITH ACUTE
+ '2': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '"': { code: 0x20 },
+ '3': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '\'': { code: 0x21 },
+ '4': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '(': { code: 0x22 },
+ '5': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '\u00a7': { code: 0x23 }, // § SECTION SIGN
+ '6': { code: 0x23, shift: true },
+ '^': { code: 0x23, altGr: true },
+ '\u00e8': { code: 0x24 }, // è LATIN SMALL LETTER E WITH GRAVE
+ '7': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '!': { code: 0x25 },
+ '8': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '\u00e7': { code: 0x26 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '9': { code: 0x26, shift: true },
+ '\u00e0': { code: 0x27 }, // à LATIN SMALL LETTER A WITH GRAVE
+ '0': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ ')': { code: 0x2d },
+ '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN
+ '\\': { code: 0x2d, altGr: true },
+ '-': { code: 0x2e },
+ '_': { code: 0x2e, shift: true },
+ 'a': { code: 0x14 },
+ 'A': { code: 0x14, shift: true },
+ 'z': { code: 0x1a },
+ 'Z': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '$': { code: 0x30 },
+ '*': { code: 0x30, shift: true },
+ ']': { code: 0x30, altGr: true },
+ 'q': { code: 0x04 },
+ 'Q': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'm': { code: 0x33 },
+ 'M': { code: 0x33, shift: true },
+ '\u00f9': { code: 0x34 }, // ù LATIN SMALL LETTER U WITH GRAVE
+ '%': { code: 0x34, shift: true },
+ '\u00b2': { code: 0x35 }, // ² SUPERSCRIPT TWO
+ '\u00b3': { code: 0x35, shift: true }, // ³ SUPERSCRIPT THREE
+ '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN
+ '\u00b5': { code: 0x31 }, // µ MICRO SIGN
+ '\u00a3': { code: 0x31, shift: true }, // £ POUND SIGN
+ 'w': { code: 0x1d },
+ 'W': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ ',': { code: 0x10 },
+ '?': { code: 0x10, shift: true },
+ ';': { code: 0x36 },
+ '.': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ ':': { code: 0x37 },
+ '/': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '=': { code: 0x38 },
+ '+': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Bosnian
+ 'ba': {
+ name: 'Bosnian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '+': { code: 0x2e },
+ '*': { code: 0x2e, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ '|': { code: 0x1a, altGr: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN
+ '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ '[': { code: 0x09, altGr: true },
+ ']': { code: 0x0a, altGr: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN
+ '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ '@': { code: 0x19, altGr: true },
+ '{': { code: 0x05, altGr: true },
+ '}': { code: 0x11, altGr: true },
+ '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Brazilian
+ 'br': {
+ name: 'Brazilian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00a3': { code: 0x21, altGr: true }, // £ POUND SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00a2': { code: 0x22, altGr: true }, // ¢ CENT SIGN
+ '6': { code: 0x23 },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u00a7': { code: 0x2e, altGr: true }, // § SECTION SIGN
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '/': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '?': { code: 0x1a, altGr: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u00b0': { code: 0x08, altGr: true }, // ° DEGREE SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00b4': { code: 0x2f, altGr: true }, // ´ ACUTE ACCENT
+ '\u00aa': { code: 0x30, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00e7': { code: 0x33 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00c7': { code: 0x33, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA
+ '~': { code: 0x34, altGr: true },
+ '\'': { code: 0x35 },
+ '"': { code: 0x35, shift: true },
+ '\u00ba': { code: 0x31, altGr: true }, // º MASCULINE ORDINAL INDICATOR
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ ';': { code: 0x38 },
+ ':': { code: 0x38, shift: true },
+ '|': { code: 0x64, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // British
+ 'gb': {
+ name: 'British',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '\u00a3': { code: 0x20, shift: true }, // £ POUND SIGN
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '`': { code: 0x35 },
+ '\u00ac': { code: 0x35, shift: true }, // ¬ NOT SIGN
+ '|': { code: 0x35, altGr: true },
+ '#': { code: 0x31 },
+ '~': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Bulgarian (Phonetic)
+ 'bg': {
+ name: 'Bulgarian (Phonetic)',
+ map: {
+ '\u0447': { code: 0x35 }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x35, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '7': { code: 0x24 },
+ '\u00a7': { code: 0x24, shift: true }, // § SECTION SIGN
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '[': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ ']': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '\u2013': { code: 0x2d, shift: true }, // – EN DASH
+ '\u2011': { code: 0x2d, altGr: true }, // ‑ NON-BREAKING HYPHEN
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2014': { code: 0x2e, altGr: true }, // — EM DASH
+ '\u044f': { code: 0x14 }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x14, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0463': { code: 0x14, altGr: true }, // ѣ CYRILLIC SMALL LETTER YAT
+ '\u0432': { code: 0x1a }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x1a, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0435': { code: 0x08 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x08, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u044d': { code: 0x08, altGr: true }, // э CYRILLIC SMALL LETTER E
+ '\u0440': { code: 0x15 }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x15, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ '\u0442': { code: 0x17 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x17, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u2122': { code: 0x17, altGr: true }, // ™ TRADE MARK SIGN
+ '\u044a': { code: 0x1c }, // ъ CYRILLIC SMALL LETTER HARD SIGN
+ '\u042a': { code: 0x1c, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+ '\u046b': { code: 0x1c, altGr: true }, // ѫ CYRILLIC SMALL LETTER BIG YUS
+ '\u0443': { code: 0x18 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x18, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u0438': { code: 0x0c }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x0c, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u045d': { code: 0x0c, altGr: true }, // ѝ CYRILLIC SMALL LETTER I WITH GRAVE
+ '\u043e': { code: 0x12 }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x12, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043f': { code: 0x13 }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x13, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0448': { code: 0x2f }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x2f, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u0449': { code: 0x30 }, // щ CYRILLIC SMALL LETTER SHCHA
+ '\u0429': { code: 0x30, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA
+ '\u0430': { code: 0x04 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x04, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u0441': { code: 0x16 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x16, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u00a9': { code: 0x16, altGr: true }, // © COPYRIGHT SIGN
+ '\u0434': { code: 0x07 }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x07, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0444': { code: 0x09 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x09, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u0433': { code: 0x0a }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x0a, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u0439': { code: 0x0d }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x0d, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u046d': { code: 0x0d, altGr: true }, // ѭ CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+ '\u043a': { code: 0x0e }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x0e, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\u2026': { code: 0x33, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\u2019': { code: 0x34, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '\u044e': { code: 0x31 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x31, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ '\u040d': { code: 0x64, shift: true }, // Ѝ CYRILLIC CAPITAL LETTER I WITH GRAVE
+ '\u0437': { code: 0x1d }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x1d, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u044c': { code: 0x1b }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u044b': { code: 0x1b, altGr: true }, // ы CYRILLIC SMALL LETTER YERU
+ '\u0446': { code: 0x06 }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x06, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0436': { code: 0x19 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x19, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u0431': { code: 0x05 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x05, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u043d': { code: 0x11 }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x11, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u043c': { code: 0x10 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x10, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ ',': { code: 0x36 },
+ '\u201e': { code: 0x36, shift: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '.': { code: 0x37 },
+ '\u201c': { code: 0x37, shift: true }, // “ LEFT DOUBLE QUOTATION MARK
+ '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '\u0300': { code: 0x38, altGr: true }, // ̀ COMBINING GRAVE ACCENT
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, altGr: true }, // NO-BREAK SPACE
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Canadian
+ 'ca': {
+ name: 'Canadian',
+ map: {
+ '#': { code: 0x35 },
+ '|': { code: 0x35, shift: true },
+ '\\': { code: 0x35, altGr: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b1': { code: 0x1e, altGr: true }, // ± PLUS-MINUS SIGN
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '/': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00a2': { code: 0x21, altGr: true }, // ¢ CENT SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00a4': { code: 0x22, altGr: true }, // ¤ CURRENCY SIGN
+ '6': { code: 0x23 },
+ '?': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u00a6': { code: 0x24, altGr: true }, // ¦ BROKEN BAR
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u00b2': { code: 0x25, altGr: true }, // ² SUPERSCRIPT TWO
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '\u00b3': { code: 0x26, altGr: true }, // ³ SUPERSCRIPT THREE
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u00bc': { code: 0x27, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u00bd': { code: 0x2d, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u00be': { code: 0x2e, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00a7': { code: 0x12, altGr: true }, // § SECTION SIGN
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00b6': { code: 0x13, altGr: true }, // ¶ PILCROW SIGN
+ '[': { code: 0x2f, altGr: true },
+ ']': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '~': { code: 0x33, altGr: true },
+ '{': { code: 0x34, altGr: true },
+ '<': { code: 0x31 },
+ '>': { code: 0x31, shift: true },
+ '}': { code: 0x31, altGr: true },
+ '\u00ab': { code: 0x64 }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u00bb': { code: 0x64, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u00b0': { code: 0x64, altGr: true }, // ° DEGREE SIGN
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '\'': { code: 0x36, shift: true },
+ '\u00af': { code: 0x36, altGr: true }, // ¯ MACRON
+ '.': { code: 0x37 },
+ '\u00ad': { code: 0x37, altGr: true }, // SOFT HYPHEN
+ '\u00e9': { code: 0x38 }, // é LATIN SMALL LETTER E WITH ACUTE
+ '\u00c9': { code: 0x38, shift: true }, // É LATIN CAPITAL LETTER E WITH ACUTE
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, altGr: true }, // NO-BREAK SPACE
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Croatian
+ 'hr': {
+ name: 'Croatian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '~': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '^': { code: 0x20, altGr: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00b0': { code: 0x22, altGr: true }, // ° DEGREE SIGN
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '`': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '+': { code: 0x2e },
+ '*': { code: 0x2e, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ '|': { code: 0x1a, altGr: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN
+ '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '\u201d': { code: 0x07, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ '[': { code: 0x09, altGr: true },
+ ']': { code: 0x0a, altGr: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN
+ '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ '@': { code: 0x19, altGr: true },
+ '{': { code: 0x05, altGr: true },
+ '}': { code: 0x11, altGr: true },
+ '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Czech
+ 'cz': {
+ name: 'Czech',
+ map: {
+ '+': { code: 0x1e },
+ '1': { code: 0x1e, shift: true },
+ '!': { code: 0x1e, altGr: true },
+ '\u011b': { code: 0x1f }, // ě LATIN SMALL LETTER E WITH CARON
+ '2': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '\u0161': { code: 0x20 }, // š LATIN SMALL LETTER S WITH CARON
+ '3': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '\u010d': { code: 0x21 }, // č LATIN SMALL LETTER C WITH CARON
+ '4': { code: 0x21, shift: true },
+ '$': { code: 0x21, altGr: true },
+ '\u0159': { code: 0x22 }, // ř LATIN SMALL LETTER R WITH CARON
+ '5': { code: 0x22, shift: true },
+ '%': { code: 0x22, altGr: true },
+ '\u017e': { code: 0x23 }, // ž LATIN SMALL LETTER Z WITH CARON
+ '6': { code: 0x23, shift: true },
+ '^': { code: 0x23, altGr: true },
+ '\u00fd': { code: 0x24 }, // ý LATIN SMALL LETTER Y WITH ACUTE
+ '7': { code: 0x24, shift: true },
+ '&': { code: 0x24, altGr: true },
+ '\u00e1': { code: 0x25 }, // á LATIN SMALL LETTER A WITH ACUTE
+ '8': { code: 0x25, shift: true },
+ '*': { code: 0x25, altGr: true },
+ '\u00ed': { code: 0x26 }, // í LATIN SMALL LETTER I WITH ACUTE
+ '9': { code: 0x26, shift: true },
+ '{': { code: 0x26, altGr: true },
+ '\u00e9': { code: 0x27 }, // é LATIN SMALL LETTER E WITH ACUTE
+ '0': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '=': { code: 0x2d },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '|': { code: 0x1a, altGr: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fa': { code: 0x2f }, // ú LATIN SMALL LETTER U WITH ACUTE
+ '/': { code: 0x2f, shift: true },
+ '[': { code: 0x2f, altGr: true },
+ ')': { code: 0x30 },
+ '(': { code: 0x30, shift: true },
+ ']': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '~': { code: 0x04, altGr: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '`': { code: 0x0b, altGr: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\'': { code: 0x0d, altGr: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0141': { code: 0x0f, altGr: true }, // Ł LATIN CAPITAL LETTER L WITH STROKE
+ '\u016f': { code: 0x33 }, // ů LATIN SMALL LETTER U WITH RING ABOVE
+ '"': { code: 0x33, shift: true },
+ '\u00a7': { code: 0x34 }, // § SECTION SIGN
+ ';': { code: 0x35 },
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ '\u00b0': { code: 0x1d, altGr: true }, // ° DEGREE SIGN
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '?': { code: 0x36, shift: true },
+ '<': { code: 0x36, altGr: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '>': { code: 0x37, altGr: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Danish
+ 'dk': {
+ name: 'Danish',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN
+ '$': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '+': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN
+ '|': { code: 0x2e, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE
+ '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00e6': { code: 0x33 }, // æ LATIN SMALL LETTER AE
+ '\u00c6': { code: 0x33, shift: true }, // Æ LATIN CAPITAL LETTER AE
+ '\u00f8': { code: 0x34 }, // ø LATIN SMALL LETTER O WITH STROKE
+ '\u00d8': { code: 0x34, shift: true }, // Ø LATIN CAPITAL LETTER O WITH STROKE
+ '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN
+ '\u00be': { code: 0x35, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '\'': { code: 0x31 },
+ '*': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '\\': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Dutch
+ 'nl': {
+ name: 'Dutch',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '7': { code: 0x24 },
+ '_': { code: 0x24, shift: true },
+ '\u00a3': { code: 0x24, altGr: true }, // £ POUND SIGN
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '{': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '}': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '\'': { code: 0x27, shift: true },
+ '\u00b0': { code: 0x27, altGr: true }, // ° DEGREE SIGN
+ '/': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u00ff': { code: 0x1c, altGr: true }, // ÿ LATIN SMALL LETTER Y WITH DIAERESIS
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u00fc': { code: 0x18, altGr: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u00ef': { code: 0x0c, altGr: true }, // ï LATIN SMALL LETTER I WITH DIAERESIS
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f2': { code: 0x12, altGr: true }, // ò LATIN SMALL LETTER O WITH GRAVE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '~': { code: 0x2f, altGr: true },
+ '*': { code: 0x30 },
+ '|': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u00aa': { code: 0x09, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '+': { code: 0x33 },
+ '\u00b1': { code: 0x33, shift: true }, // ± PLUS-MINUS SIGN
+ '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN
+ '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN
+ '<': { code: 0x31 },
+ '>': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201c': { code: 0x19, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u03bc': { code: 0x10, altGr: true }, // μ GREEK SMALL LETTER MU
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u00b8': { code: 0x36, altGr: true }, // ¸ CEDILLA
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '-': { code: 0x38 },
+ '=': { code: 0x38, shift: true },
+ '\u00ad': { code: 0x38, altGr: true }, // SOFT HYPHEN
+ ']': { code: 0x64 },
+ '[': { code: 0x64, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Estonian
+ 'ee': {
+ name: 'Estonian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN
+ '$': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '+': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '`': { code: 0x2e, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u00df': { code: 0x1a, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+ '\u00f5': { code: 0x30 }, // õ LATIN SMALL LETTER O WITH TILDE
+ '\u00d5': { code: 0x30, shift: true }, // Õ LATIN CAPITAL LETTER O WITH TILDE
+ '\u00a7': { code: 0x30, altGr: true }, // § SECTION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0161': { code: 0x16, altGr: true }, // š LATIN SMALL LETTER S WITH CARON
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS
+ '^': { code: 0x34, altGr: true },
+ '\u2022': { code: 0x35, altGr: true }, // • BULLET
+ '\'': { code: 0x31 },
+ '*': { code: 0x31, shift: true },
+ '\u00bd': { code: 0x31, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u017e': { code: 0x1d, altGr: true }, // ž LATIN SMALL LETTER Z WITH CARON
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '<': { code: 0x36, altGr: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '>': { code: 0x37, altGr: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '|': { code: 0x38, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Faroese
+ 'fo': {
+ name: 'Faroese',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN
+ '$': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '+': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN
+ '|': { code: 0x2e, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE
+ '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE
+ '\u00f0': { code: 0x30 }, // ð LATIN SMALL LETTER ETH
+ '\u00d0': { code: 0x30, shift: true }, // Ð LATIN CAPITAL LETTER ETH
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00e6': { code: 0x33 }, // æ LATIN SMALL LETTER AE
+ '\u00c6': { code: 0x33, shift: true }, // Æ LATIN CAPITAL LETTER AE
+ '\u00f8': { code: 0x34 }, // ø LATIN SMALL LETTER O WITH STROKE
+ '\u00d8': { code: 0x34, shift: true }, // Ø LATIN CAPITAL LETTER O WITH STROKE
+ '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN
+ '\u00be': { code: 0x35, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '\'': { code: 0x31 },
+ '*': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '\u00ad': { code: 0x38, altGr: true }, // SOFT HYPHEN
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '\\': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, altGr: true }, // NO-BREAK SPACE
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Filipino
+ 'ph': {
+ name: 'Filipino',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u0300': { code: 0x35, altGr: true }, // ̀ COMBINING GRAVE ACCENT
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u215b': { code: 0x24, altGr: true }, // ⅛ VULGAR FRACTION ONE EIGHTH
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u215c': { code: 0x25, altGr: true }, // ⅜ VULGAR FRACTION THREE EIGHTHS
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '\u215d': { code: 0x26, altGr: true }, // ⅝ VULGAR FRACTION FIVE EIGHTHS
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u215e': { code: 0x27, altGr: true }, // ⅞ VULGAR FRACTION SEVEN EIGHTHS
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u00ac': { code: 0x2d, altGr: true }, // ¬ NOT SIGN
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u00b1': { code: 0x2e, altGr: true }, // ± PLUS-MINUS SIGN
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u0153': { code: 0x08, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u2122': { code: 0x17, altGr: true }, // ™ TRADE MARK SIGN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u0131': { code: 0x0c, altGr: true }, // ı LATIN SMALL LETTER DOTLESS I
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u20b1': { code: 0x13, altGr: true }, // ₱ PESO SIGN
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u0259': { code: 0x31, altGr: true }, // ə LATIN SMALL LETTER SCHWA
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00a7': { code: 0x16, altGr: true }, // § SECTION SIGN
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\u0301': { code: 0x34, altGr: true }, // ́ COMBINING ACUTE ACCENT
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00d7': { code: 0x1b, altGr: true }, // × MULTIPLICATION SIGN
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201c': { code: 0x19, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u0327': { code: 0x36, altGr: true }, // ̧ COMBINING CEDILLA
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '\u00f7': { code: 0x38, altGr: true }, // ÷ DIVISION SIGN
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Finnish
+ 'fi': {
+ name: 'Finnish',
+ map: {
+ '\u00a7': { code: 0x35 }, // § SECTION SIGN
+ '\u00bd': { code: 0x35, shift: true }, // ½ VULGAR FRACTION ONE HALF
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN
+ '$': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u2030': { code: 0x22, altGr: true }, // ‰ PER MILLE SIGN
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u201a': { code: 0x23, altGr: true }, // ‚ SINGLE LOW-9 QUOTATION MARK
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '+': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u0131': { code: 0x0c, altGr: true }, // ı LATIN SMALL LETTER DOTLESS I
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE
+ '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u0259': { code: 0x04, altGr: true }, // ə LATIN SMALL LETTER SCHWA
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u00f8': { code: 0x33, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS
+ '\u00e6': { code: 0x34, altGr: true }, // æ LATIN SMALL LETTER AE
+ '\'': { code: 0x31 },
+ '*': { code: 0x31, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '|': { code: 0x64, altGr: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u0292': { code: 0x1d, altGr: true }, // ʒ LATIN SMALL LETTER EZH
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00d7': { code: 0x1b, altGr: true }, // × MULTIPLICATION SIGN
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u014b': { code: 0x11, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u2019': { code: 0x36, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '\u2013': { code: 0x38, altGr: true }, // – EN DASH
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // French (AZERTY)
+ 'fr': {
+ name: 'French (AZERTY)',
+ map: {
+ '&': { code: 0x1e },
+ '1': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '\u00e9': { code: 0x1f }, // é LATIN SMALL LETTER E WITH ACUTE
+ '2': { code: 0x1f, shift: true },
+ '~': { code: 0x1f, altGr: true },
+ '"': { code: 0x20 },
+ '3': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '\'': { code: 0x21 },
+ '4': { code: 0x21, shift: true },
+ '{': { code: 0x21, altGr: true },
+ '(': { code: 0x22 },
+ '5': { code: 0x22, shift: true },
+ '[': { code: 0x22, altGr: true },
+ '-': { code: 0x23 },
+ '6': { code: 0x23, shift: true },
+ '|': { code: 0x23, altGr: true },
+ '\u00e8': { code: 0x24 }, // è LATIN SMALL LETTER E WITH GRAVE
+ '7': { code: 0x24, shift: true },
+ '`': { code: 0x24, altGr: true },
+ '_': { code: 0x25 },
+ '8': { code: 0x25, shift: true },
+ '\\': { code: 0x25, altGr: true },
+ '\u00e7': { code: 0x26 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '9': { code: 0x26, shift: true },
+ '^': { code: 0x26, altGr: true },
+ '\u00e0': { code: 0x27 }, // à LATIN SMALL LETTER A WITH GRAVE
+ '0': { code: 0x27, shift: true },
+ '@': { code: 0x27, altGr: true },
+ ')': { code: 0x2d },
+ '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN
+ ']': { code: 0x2d, altGr: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '}': { code: 0x2e, altGr: true },
+ 'a': { code: 0x14 },
+ 'A': { code: 0x14, shift: true },
+ '\u00e6': { code: 0x14, altGr: true }, // æ LATIN SMALL LETTER AE
+ 'z': { code: 0x1a },
+ 'Z': { code: 0x1a, shift: true },
+ '\u00ab': { code: 0x1a, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '$': { code: 0x30 },
+ '\u00a3': { code: 0x30, shift: true }, // £ POUND SIGN
+ '\u00a4': { code: 0x30, altGr: true }, // ¤ CURRENCY SIGN
+ 'q': { code: 0x04 },
+ 'Q': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'm': { code: 0x33 },
+ 'M': { code: 0x33, shift: true },
+ '\u00b5': { code: 0x33, altGr: true }, // µ MICRO SIGN
+ '\u00f9': { code: 0x34 }, // ù LATIN SMALL LETTER U WITH GRAVE
+ '%': { code: 0x34, shift: true },
+ '\u00b2': { code: 0x35 }, // ² SUPERSCRIPT TWO
+ '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN
+ '*': { code: 0x31 },
+ 'w': { code: 0x1d },
+ 'W': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ ',': { code: 0x10 },
+ '?': { code: 0x10, shift: true },
+ ';': { code: 0x36 },
+ '.': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ ':': { code: 0x37 },
+ '/': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '!': { code: 0x38 },
+ '\u00a7': { code: 0x38, shift: true }, // § SECTION SIGN
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // French (BÉPO)
+ 'fr-bepo': {
+ name: 'French (BÉPO)',
+ map: {
+ '$': { code: 0x35 },
+ '#': { code: 0x35, shift: true },
+ '\u2013': { code: 0x35, altGr: true }, // – EN DASH
+ '=': { code: 0x2d },
+ '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN
+ '\u2260': { code: 0x2d, altGr: true }, // ≠ NOT EQUAL TO
+ '%': { code: 0x2e },
+ '`': { code: 0x2e, shift: true },
+ '\u2030': { code: 0x2e, altGr: true }, // ‰ PER MILLE SIGN
+ 'b': { code: 0x14 },
+ 'B': { code: 0x14, shift: true },
+ '|': { code: 0x14, altGr: true },
+ '\u00e9': { code: 0x1a }, // é LATIN SMALL LETTER E WITH ACUTE
+ '\u00c9': { code: 0x1a, shift: true }, // É LATIN CAPITAL LETTER E WITH ACUTE
+ 'p': { code: 0x08 },
+ 'P': { code: 0x08, shift: true },
+ '&': { code: 0x08, altGr: true },
+ 'o': { code: 0x15 },
+ 'O': { code: 0x15, shift: true },
+ '\u0153': { code: 0x15, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ '\u00e8': { code: 0x17 }, // è LATIN SMALL LETTER E WITH GRAVE
+ '\u00c8': { code: 0x17, shift: true }, // È LATIN CAPITAL LETTER E WITH GRAVE
+ '!': { code: 0x1c, shift: true },
+ '\u00a1': { code: 0x1c, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ 'v': { code: 0x18 },
+ 'V': { code: 0x18, shift: true },
+ 'd': { code: 0x0c },
+ 'D': { code: 0x0c, shift: true },
+ '\u00f0': { code: 0x0c, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'l': { code: 0x12 },
+ 'L': { code: 0x12, shift: true },
+ 'j': { code: 0x13 },
+ 'J': { code: 0x13, shift: true },
+ '\u0133': { code: 0x13, altGr: true }, // ij LATIN SMALL LIGATURE IJ
+ 'z': { code: 0x2f },
+ 'Z': { code: 0x2f, shift: true },
+ '\u0259': { code: 0x2f, altGr: true }, // ə LATIN SMALL LETTER SCHWA
+ 'w': { code: 0x30 },
+ 'W': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 'u': { code: 0x16 },
+ 'U': { code: 0x16, shift: true },
+ '\u00f9': { code: 0x16, altGr: true }, // ù LATIN SMALL LETTER U WITH GRAVE
+ 'i': { code: 0x07 },
+ 'I': { code: 0x07, shift: true },
+ 'e': { code: 0x09 },
+ 'E': { code: 0x09, shift: true },
+ '\u20ac': { code: 0x09, altGr: true }, // € EURO SIGN
+ ',': { code: 0x0a },
+ ';': { code: 0x0a, shift: true },
+ '\u2019': { code: 0x0a, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ 'c': { code: 0x0b },
+ 'C': { code: 0x0b, shift: true },
+ '\u00a9': { code: 0x0b, altGr: true }, // © COPYRIGHT SIGN
+ 't': { code: 0x0d },
+ 'T': { code: 0x0d, shift: true },
+ '\u00fe': { code: 0x0d, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 's': { code: 0x0e },
+ 'S': { code: 0x0e, shift: true },
+ '\u00df': { code: 0x0e, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'r': { code: 0x0f },
+ 'R': { code: 0x0f, shift: true },
+ '\u00ae': { code: 0x0f, altGr: true }, // ® REGISTERED SIGN
+ 'n': { code: 0x33 },
+ 'N': { code: 0x33, shift: true },
+ 'm': { code: 0x34 },
+ 'M': { code: 0x34, shift: true },
+ '\u00e7': { code: 0x31 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00c7': { code: 0x31, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA
+ '\u00ea': { code: 0x64 }, // ê LATIN SMALL LETTER E WITH CIRCUMFLEX
+ '\u00ca': { code: 0x64, shift: true }, // Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ '/': { code: 0x64, altGr: true },
+ '\u00e0': { code: 0x1d }, // à LATIN SMALL LETTER A WITH GRAVE
+ '\u00c0': { code: 0x1d, shift: true }, // À LATIN CAPITAL LETTER A WITH GRAVE
+ '\\': { code: 0x1d, altGr: true },
+ 'y': { code: 0x1b },
+ 'Y': { code: 0x1b, shift: true },
+ '{': { code: 0x1b, altGr: true },
+ 'x': { code: 0x06 },
+ 'X': { code: 0x06, shift: true },
+ '}': { code: 0x06, altGr: true },
+ '.': { code: 0x19 },
+ ':': { code: 0x19, shift: true },
+ '\u2026': { code: 0x19, altGr: true }, // … HORIZONTAL ELLIPSIS
+ 'k': { code: 0x05 },
+ 'K': { code: 0x05, shift: true },
+ '~': { code: 0x05, altGr: true },
+ '\'': { code: 0x11 },
+ '?': { code: 0x11, shift: true },
+ '\u00bf': { code: 0x11, altGr: true }, // ¿ INVERTED QUESTION MARK
+ 'q': { code: 0x10 },
+ 'Q': { code: 0x10, shift: true },
+ 'g': { code: 0x36 },
+ 'G': { code: 0x36, shift: true },
+ 'h': { code: 0x37 },
+ 'H': { code: 0x37, shift: true },
+ '\u2020': { code: 0x37, altGr: true }, // † DAGGER
+ 'f': { code: 0x38 },
+ 'F': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, shift: true }, // NO-BREAK SPACE
+ '_': { code: 0x2c, altGr: true },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // French (no dead keys)
+ 'fr-nodeadkeys': {
+ name: 'French (no dead keys)',
+ map: {
+ '&': { code: 0x1e },
+ '1': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '\u00e9': { code: 0x1f }, // é LATIN SMALL LETTER E WITH ACUTE
+ '2': { code: 0x1f, shift: true },
+ '~': { code: 0x1f, altGr: true },
+ '"': { code: 0x20 },
+ '3': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '\'': { code: 0x21 },
+ '4': { code: 0x21, shift: true },
+ '{': { code: 0x21, altGr: true },
+ '(': { code: 0x22 },
+ '5': { code: 0x22, shift: true },
+ '[': { code: 0x22, altGr: true },
+ '-': { code: 0x23 },
+ '6': { code: 0x23, shift: true },
+ '|': { code: 0x23, altGr: true },
+ '\u00e8': { code: 0x24 }, // è LATIN SMALL LETTER E WITH GRAVE
+ '7': { code: 0x24, shift: true },
+ '`': { code: 0x24, altGr: true },
+ '_': { code: 0x25 },
+ '8': { code: 0x25, shift: true },
+ '\\': { code: 0x25, altGr: true },
+ '\u00e7': { code: 0x26 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '9': { code: 0x26, shift: true },
+ '^': { code: 0x26, altGr: true },
+ '\u00e0': { code: 0x27 }, // à LATIN SMALL LETTER A WITH GRAVE
+ '0': { code: 0x27, shift: true },
+ '@': { code: 0x27, altGr: true },
+ ')': { code: 0x2d },
+ '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN
+ ']': { code: 0x2d, altGr: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '}': { code: 0x2e, altGr: true },
+ 'a': { code: 0x14 },
+ 'A': { code: 0x14, shift: true },
+ '\u00e6': { code: 0x14, altGr: true }, // æ LATIN SMALL LETTER AE
+ 'z': { code: 0x1a },
+ 'Z': { code: 0x1a, shift: true },
+ '\u00ab': { code: 0x1a, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00a8': { code: 0x2f, shift: true }, // ¨ DIAERESIS
+ '\u221a': { code: 0x2f, altGr: true }, // √ SQUARE ROOT
+ '$': { code: 0x30 },
+ '\u00a3': { code: 0x30, shift: true }, // £ POUND SIGN
+ '\u00a4': { code: 0x30, altGr: true }, // ¤ CURRENCY SIGN
+ 'q': { code: 0x04 },
+ 'Q': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0292': { code: 0x0d, altGr: true }, // ʒ LATIN SMALL LETTER EZH
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'm': { code: 0x33 },
+ 'M': { code: 0x33, shift: true },
+ '\u00b5': { code: 0x33, altGr: true }, // µ MICRO SIGN
+ '\u00f9': { code: 0x34 }, // ù LATIN SMALL LETTER U WITH GRAVE
+ '%': { code: 0x34, shift: true },
+ '\u00b2': { code: 0x35 }, // ² SUPERSCRIPT TWO
+ '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN
+ '*': { code: 0x31 },
+ 'w': { code: 0x1d },
+ 'W': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ ',': { code: 0x10 },
+ '?': { code: 0x10, shift: true },
+ '\u00b4': { code: 0x10, altGr: true }, // ´ ACUTE ACCENT
+ ';': { code: 0x36 },
+ '.': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ ':': { code: 0x37 },
+ '/': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '!': { code: 0x38 },
+ '\u00a7': { code: 0x38, shift: true }, // § SECTION SIGN
+ '\u2026': { code: 0x38, altGr: true }, // … HORIZONTAL ELLIPSIS
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Georgian
+ 'ge': {
+ name: 'Georgian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\'': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u00a7': { code: 0x24, altGr: true }, // § SECTION SIGN
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u00b0': { code: 0x25, altGr: true }, // ° DEGREE SIGN
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u10e5': { code: 0x14 }, // ქ GEORGIAN LETTER KHAR
+ 'Q': { code: 0x14, shift: true },
+ '\u10ec': { code: 0x1a }, // წ GEORGIAN LETTER CIL
+ '\u10ed': { code: 0x1a, shift: true }, // ჭ GEORGIAN LETTER CHAR
+ '\u10d4': { code: 0x08 }, // ე GEORGIAN LETTER EN
+ 'E': { code: 0x08, shift: true },
+ '\u10f1': { code: 0x08, altGr: true }, // ჱ GEORGIAN LETTER HE
+ '\u10e0': { code: 0x15 }, // რ GEORGIAN LETTER RAE
+ '\u10e6': { code: 0x15, shift: true }, // ღ GEORGIAN LETTER GHAN
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ '\u10e2': { code: 0x17 }, // ტ GEORGIAN LETTER TAR
+ '\u10d7': { code: 0x17, shift: true }, // თ GEORGIAN LETTER TAN
+ '\u10e7': { code: 0x1c }, // ყ GEORGIAN LETTER QAR
+ 'Y': { code: 0x1c, shift: true },
+ '\u10e3': { code: 0x18 }, // უ GEORGIAN LETTER UN
+ 'U': { code: 0x18, shift: true },
+ '\u10d8': { code: 0x0c }, // ი GEORGIAN LETTER IN
+ 'I': { code: 0x0c, shift: true },
+ '\u10f2': { code: 0x0c, altGr: true }, // ჲ GEORGIAN LETTER HIE
+ '\u10dd': { code: 0x12 }, // ო GEORGIAN LETTER ON
+ 'O': { code: 0x12, shift: true },
+ '\u10de': { code: 0x13 }, // პ GEORGIAN LETTER PAR
+ 'P': { code: 0x13, shift: true },
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u10d0': { code: 0x04 }, // ა GEORGIAN LETTER AN
+ 'A': { code: 0x04, shift: true },
+ '\u10e1': { code: 0x16 }, // ს GEORGIAN LETTER SAN
+ '\u10e8': { code: 0x16, shift: true }, // შ GEORGIAN LETTER SHIN
+ '\u10d3': { code: 0x07 }, // დ GEORGIAN LETTER DON
+ 'D': { code: 0x07, shift: true },
+ '\u10e4': { code: 0x09 }, // ფ GEORGIAN LETTER PHAR
+ 'F': { code: 0x09, shift: true },
+ '\u10f6': { code: 0x09, altGr: true }, // ჶ GEORGIAN LETTER FI
+ '\u10d2': { code: 0x0a }, // გ GEORGIAN LETTER GAN
+ 'G': { code: 0x0a, shift: true },
+ '\u10f0': { code: 0x0b }, // ჰ GEORGIAN LETTER HAE
+ 'H': { code: 0x0b, shift: true },
+ '\u10f5': { code: 0x0b, altGr: true }, // ჵ GEORGIAN LETTER HOE
+ '\u10ef': { code: 0x0d }, // ჯ GEORGIAN LETTER JHAN
+ '\u10df': { code: 0x0d, shift: true }, // ჟ GEORGIAN LETTER ZHAR
+ '\u10d9': { code: 0x0e }, // კ GEORGIAN LETTER KAN
+ 'K': { code: 0x0e, shift: true },
+ '\u10da': { code: 0x0f }, // ლ GEORGIAN LETTER LAS
+ 'L': { code: 0x0f, shift: true },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '~': { code: 0x31, altGr: true },
+ '\u00ab': { code: 0x64 }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u00bb': { code: 0x64, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u10d6': { code: 0x1d }, // ზ GEORGIAN LETTER ZEN
+ '\u10eb': { code: 0x1d, shift: true }, // ძ GEORGIAN LETTER JIL
+ '\u10ee': { code: 0x1b }, // ხ GEORGIAN LETTER XAN
+ 'X': { code: 0x1b, shift: true },
+ '\u10f4': { code: 0x1b, altGr: true }, // ჴ GEORGIAN LETTER HAR
+ '\u10ea': { code: 0x06 }, // ც GEORGIAN LETTER CAN
+ '\u10e9': { code: 0x06, shift: true }, // ჩ GEORGIAN LETTER CHIN
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ '\u10d5': { code: 0x19 }, // ვ GEORGIAN LETTER VIN
+ 'V': { code: 0x19, shift: true },
+ '\u10f3': { code: 0x19, altGr: true }, // ჳ GEORGIAN LETTER WE
+ '\u10d1': { code: 0x05 }, // ბ GEORGIAN LETTER BAN
+ 'B': { code: 0x05, shift: true },
+ '\u10dc': { code: 0x11 }, // ნ GEORGIAN LETTER NAR
+ 'N': { code: 0x11, shift: true },
+ '\u10db': { code: 0x10 }, // მ GEORGIAN LETTER MAN
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // German
+ 'de': {
+ name: 'German',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '\u00a7': { code: 0x20, shift: true }, // § SECTION SIGN
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\u00df': { code: 0x2d }, // ß LATIN SMALL LETTER SHARP S
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+ '*': { code: 0x30, shift: true },
+ '~': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS
+ '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN
+ '\u2032': { code: 0x35, altGr: true }, // ′ PRIME
+ '#': { code: 0x31 },
+ '\'': { code: 0x31, shift: true },
+ '\u2019': { code: 0x31, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u00b7': { code: 0x36, altGr: true }, // · MIDDLE DOT
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '\u2013': { code: 0x38, altGr: true }, // – EN DASH
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '|': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // German (no dead keys)
+ 'de-nodeadkeys': {
+ name: 'German (no dead keys)',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '\u00a7': { code: 0x20, shift: true }, // § SECTION SIGN
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\u00df': { code: 0x2d }, // ß LATIN SMALL LETTER SHARP S
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '\u00b4': { code: 0x2e }, // ´ ACUTE ACCENT
+ '`': { code: 0x2e, shift: true },
+ '\u00b8': { code: 0x2e, altGr: true }, // ¸ CEDILLA
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+ '\u00a8': { code: 0x2f, altGr: true }, // ¨ DIAERESIS
+ '+': { code: 0x30 },
+ '*': { code: 0x30, shift: true },
+ '~': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0292': { code: 0x0d, altGr: true }, // ʒ LATIN SMALL LETTER EZH
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u02dd': { code: 0x33, altGr: true }, // ˝ DOUBLE ACUTE ACCENT
+ '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS
+ '^': { code: 0x34, altGr: true },
+ '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN
+ '#': { code: 0x31 },
+ '\'': { code: 0x31, shift: true },
+ '\u2019': { code: 0x31, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u00b7': { code: 0x36, altGr: true }, // · MIDDLE DOT
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '\u2013': { code: 0x38, altGr: true }, // – EN DASH
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '|': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Greek
+ 'gr': {
+ name: 'Greek',
+ map: {
+ '\u2015': { code: 0x35, altGr: true }, // ― HORIZONTAL BAR
+ '\u2022': { code: 0x1e, altGr: true }, // • BULLET
+ '\u00bd': { code: 0x1f, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN
+ '\u03f0': { code: 0x23, altGr: true }, // ϰ GREEK KAPPA SYMBOL
+ '\u03d7': { code: 0x24, altGr: true }, // ϗ GREEK KAI SYMBOL
+ '\u20af': { code: 0x25, altGr: true }, // ₯ DRACHMA SIGN
+ '\u00a6': { code: 0x26, altGr: true }, // ¦ BROKEN BAR
+ '\u00b0': { code: 0x27, altGr: true }, // ° DEGREE SIGN
+ '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u00b7': { code: 0x14, altGr: true }, // · MIDDLE DOT
+ '\u03db': { code: 0x1a, altGr: true }, // ϛ GREEK SMALL LETTER STIGMA
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ '\u03c4': { code: 0x17 }, // τ GREEK SMALL LETTER TAU
+ '\u03a4': { code: 0x17, shift: true }, // Τ GREEK CAPITAL LETTER TAU
+ '\u03d2': { code: 0x1c, altGr: true }, // ϒ GREEK UPSILON WITH HOOK SYMBOL
+ '\u03d1': { code: 0x18, altGr: true }, // ϑ GREEK THETA SYMBOL
+ '\u037b': { code: 0x0c, altGr: true }, // ͻ GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+ '\u03d9': { code: 0x12, altGr: true }, // ϙ GREEK SMALL LETTER ARCHAIC KOPPA
+ '\u03e1': { code: 0x13, altGr: true }, // ϡ GREEK SMALL LETTER SAMPI
+ '\u03b1': { code: 0x04 }, // α GREEK SMALL LETTER ALPHA
+ '\u0391': { code: 0x04, shift: true }, // Α GREEK CAPITAL LETTER ALPHA
+ '\u00a7': { code: 0x16, altGr: true }, // § SECTION SIGN
+ '\u2193': { code: 0x07, altGr: true }, // ↓ DOWNWARDS ARROW
+ '\u03d5': { code: 0x09, altGr: true }, // ϕ GREEK PHI SYMBOL
+ '\u03dd': { code: 0x0a, altGr: true }, // ϝ GREEK SMALL LETTER DIGAMMA
+ '\u03f3': { code: 0x0b, altGr: true }, // ϳ GREEK LETTER YOT
+ '\u037c': { code: 0x0d, altGr: true }, // ͼ GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+ '\u03df': { code: 0x0e, altGr: true }, // ϟ GREEK SMALL LETTER KOPPA
+ '\u03f2': { code: 0x0f, altGr: true }, // ϲ GREEK LUNATE SIGMA SYMBOL
+ '\u00ac': { code: 0x31, altGr: true }, // ¬ NOT SIGN
+ '\u00ab': { code: 0x64 }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u00bb': { code: 0x64, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u037d': { code: 0x1d, altGr: true }, // ͽ GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+ '\u2192': { code: 0x1b, altGr: true }, // → RIGHTWARDS ARROW
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ '\u03d6': { code: 0x19, altGr: true }, // ϖ GREEK PI SYMBOL
+ '\u03d0': { code: 0x05, altGr: true }, // ϐ GREEK BETA SYMBOL
+ '\u0374': { code: 0x11, altGr: true }, // ʹ GREEK NUMERAL SIGN
+ '\u03fb': { code: 0x10, altGr: true }, // ϻ GREEK SMALL LETTER SAN
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Hebrew
+ 'il': {
+ name: 'Hebrew',
+ map: {
+ ';': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u05f3': { code: 0x35, altGr: true }, // ׳ HEBREW PUNCTUATION GERESH
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u20ac': { code: 0x20, altGr: true }, // € EURO SIGN
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u20aa': { code: 0x21, altGr: true }, // ₪ NEW SHEQEL SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00b0': { code: 0x22, altGr: true }, // ° DEGREE SIGN
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u05ab': { code: 0x23, altGr: true }, // ֫ HEBREW ACCENT OLE
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u05bd': { code: 0x24, altGr: true }, // ֽ HEBREW POINT METEG
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u00d7': { code: 0x25, altGr: true }, // × MULTIPLICATION SIGN
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '\u200e': { code: 0x26, altGr: true }, // LEFT-TO-RIGHT MARK
+ '0': { code: 0x27 },
+ '(': { code: 0x27, shift: true },
+ '\u200f': { code: 0x27, altGr: true }, // RIGHT-TO-LEFT MARK
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u05be': { code: 0x2d, altGr: true }, // ־ HEBREW PUNCTUATION MAQAF
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2013': { code: 0x2e, altGr: true }, // – EN DASH
+ '/': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u05c2': { code: 0x14, altGr: true }, // ׂ HEBREW POINT SIN DOT
+ '\'': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u05c1': { code: 0x1a, altGr: true }, // ׁ HEBREW POINT SHIN DOT
+ '\u05e7': { code: 0x08 }, // ק HEBREW LETTER QOF
+ 'E': { code: 0x08, shift: true },
+ '\u05b8': { code: 0x08, altGr: true }, // ָ HEBREW POINT QAMATS
+ '\u05e8': { code: 0x15 }, // ר HEBREW LETTER RESH
+ 'R': { code: 0x15, shift: true },
+ '\u05b3': { code: 0x15, altGr: true }, // ֳ HEBREW POINT HATAF QAMATS
+ '\u05d0': { code: 0x17 }, // א HEBREW LETTER ALEF
+ 'T': { code: 0x17, shift: true },
+ '\u05d8': { code: 0x1c }, // ט HEBREW LETTER TET
+ 'Y': { code: 0x1c, shift: true },
+ '\u05f0': { code: 0x1c, altGr: true }, // װ HEBREW LIGATURE YIDDISH DOUBLE VAV
+ '\u05d5': { code: 0x18 }, // ו HEBREW LETTER VAV
+ 'U': { code: 0x18, shift: true },
+ '\u05b9': { code: 0x18, altGr: true }, // ֹ HEBREW POINT HOLAM
+ '\u05df': { code: 0x0c }, // ן HEBREW LETTER FINAL NUN
+ 'I': { code: 0x0c, shift: true },
+ '\u05dd': { code: 0x12 }, // ם HEBREW LETTER FINAL MEM
+ 'O': { code: 0x12, shift: true },
+ '\u05e4': { code: 0x13 }, // פ HEBREW LETTER PE
+ 'P': { code: 0x13, shift: true },
+ '\u05b7': { code: 0x13, altGr: true }, // ַ HEBREW POINT PATAH
+ '\u05e9': { code: 0x04 }, // ש HEBREW LETTER SHIN
+ 'A': { code: 0x04, shift: true },
+ '\u05b0': { code: 0x04, altGr: true }, // ְ HEBREW POINT SHEVA
+ '\u05d3': { code: 0x16 }, // ד HEBREW LETTER DALET
+ 'S': { code: 0x16, shift: true },
+ '\u05bc': { code: 0x16, altGr: true }, // ּ HEBREW POINT DAGESH OR MAPIQ
+ '\u05d2': { code: 0x07 }, // ג HEBREW LETTER GIMEL
+ 'D': { code: 0x07, shift: true },
+ '\u05db': { code: 0x09 }, // כ HEBREW LETTER KAF
+ 'F': { code: 0x09, shift: true },
+ '\u05e2': { code: 0x0a }, // ע HEBREW LETTER AYIN
+ 'G': { code: 0x0a, shift: true },
+ '\u05f1': { code: 0x0a, altGr: true }, // ױ HEBREW LIGATURE YIDDISH VAV YOD
+ '\u05d9': { code: 0x0b }, // י HEBREW LETTER YOD
+ 'H': { code: 0x0b, shift: true },
+ '\u05f2': { code: 0x0b, altGr: true }, // ײ HEBREW LIGATURE YIDDISH DOUBLE YOD
+ '\u05d7': { code: 0x0d }, // ח HEBREW LETTER HET
+ 'J': { code: 0x0d, shift: true },
+ '\u05b4': { code: 0x0d, altGr: true }, // ִ HEBREW POINT HIRIQ
+ '\u05dc': { code: 0x0e }, // ל HEBREW LETTER LAMED
+ 'K': { code: 0x0e, shift: true },
+ '\u05da': { code: 0x0f }, // ך HEBREW LETTER FINAL KAF
+ 'L': { code: 0x0f, shift: true },
+ '\u201d': { code: 0x0f, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ '\u05e3': { code: 0x33 }, // ף HEBREW LETTER FINAL PE
+ ':': { code: 0x33, shift: true },
+ '\u201e': { code: 0x33, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '\u05d6': { code: 0x1d }, // ז HEBREW LETTER ZAYIN
+ 'Z': { code: 0x1d, shift: true },
+ '\u05e1': { code: 0x1b }, // ס HEBREW LETTER SAMEKH
+ 'X': { code: 0x1b, shift: true },
+ '\u05b6': { code: 0x1b, altGr: true }, // ֶ HEBREW POINT SEGOL
+ '\u05d1': { code: 0x06 }, // ב HEBREW LETTER BET
+ 'C': { code: 0x06, shift: true },
+ '\u05b1': { code: 0x06, altGr: true }, // ֱ HEBREW POINT HATAF SEGOL
+ '\u05d4': { code: 0x19 }, // ה HEBREW LETTER HE
+ 'V': { code: 0x19, shift: true },
+ '\u05e0': { code: 0x05 }, // נ HEBREW LETTER NUN
+ 'B': { code: 0x05, shift: true },
+ '\u05de': { code: 0x11 }, // מ HEBREW LETTER MEM
+ 'N': { code: 0x11, shift: true },
+ '\u05e6': { code: 0x10 }, // צ HEBREW LETTER TSADI
+ 'M': { code: 0x10, shift: true },
+ '\u05b5': { code: 0x10, altGr: true }, // ֵ HEBREW POINT TSERE
+ '\u05ea': { code: 0x36 }, // ת HEBREW LETTER TAV
+ '>': { code: 0x36, shift: true },
+ '\u2019': { code: 0x36, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '\u05e5': { code: 0x37 }, // ץ HEBREW LETTER FINAL TSADI
+ '<': { code: 0x37, shift: true },
+ '\u201a': { code: 0x37, altGr: true }, // ‚ SINGLE LOW-9 QUOTATION MARK
+ ']': { code: 0x2f },
+ '}': { code: 0x2f, shift: true },
+ '\u05b2': { code: 0x2f, altGr: true }, // ֲ HEBREW POINT HATAF PATAH
+ '[': { code: 0x30 },
+ '{': { code: 0x30, shift: true },
+ '\u05bf': { code: 0x30, altGr: true }, // ֿ HEBREW POINT RAFE
+ ',': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\u05f4': { code: 0x34, altGr: true }, // ״ HEBREW PUNCTUATION GERSHAYIM
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u05bb': { code: 0x31, altGr: true }, // ֻ HEBREW POINT QUBUTS
+ '.': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '\u00f7': { code: 0x38, altGr: true }, // ÷ DIVISION SIGN
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Hungarian
+ 'hu': {
+ name: 'Hungarian',
+ map: {
+ '1': { code: 0x1e },
+ '\'': { code: 0x1e, shift: true },
+ '~': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '+': { code: 0x20, shift: true },
+ '^': { code: 0x20, altGr: true },
+ '4': { code: 0x21 },
+ '!': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '/': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '=': { code: 0x24, shift: true },
+ '`': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '\u00f6': { code: 0x27 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x27, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u00fc': { code: 0x2d }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00dc': { code: 0x2d, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+ '\u00f3': { code: 0x2e }, // ó LATIN SMALL LETTER O WITH ACUTE
+ '\u00d3': { code: 0x2e, shift: true }, // Ó LATIN CAPITAL LETTER O WITH ACUTE
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '|': { code: 0x1a, altGr: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u00c4': { code: 0x08, altGr: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ '\u2013': { code: 0x1c, altGr: true }, // – EN DASH
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u20ac': { code: 0x18, altGr: true }, // € EURO SIGN
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u00cd': { code: 0x0c, altGr: true }, // Í LATIN CAPITAL LETTER I WITH ACUTE
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u201e': { code: 0x12, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u201d': { code: 0x13, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ '\u0151': { code: 0x2f }, // ő LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ '\u0150': { code: 0x2f, shift: true }, // Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN
+ '\u00fa': { code: 0x30 }, // ú LATIN SMALL LETTER U WITH ACUTE
+ '\u00da': { code: 0x30, shift: true }, // Ú LATIN CAPITAL LETTER U WITH ACUTE
+ '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e4': { code: 0x04, altGr: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '[': { code: 0x09, altGr: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ ']': { code: 0x0a, altGr: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u00ed': { code: 0x0d, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0141': { code: 0x0f, altGr: true }, // Ł LATIN CAPITAL LETTER L WITH STROKE
+ '\u00e9': { code: 0x33 }, // é LATIN SMALL LETTER E WITH ACUTE
+ '\u00c9': { code: 0x33, shift: true }, // É LATIN CAPITAL LETTER E WITH ACUTE
+ '$': { code: 0x33, altGr: true },
+ '\u00e1': { code: 0x34 }, // á LATIN SMALL LETTER A WITH ACUTE
+ '\u00c1': { code: 0x34, shift: true }, // Á LATIN CAPITAL LETTER A WITH ACUTE
+ '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ '0': { code: 0x35 },
+ '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN
+ '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN
+ '\u0171': { code: 0x31 }, // ű LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ '\u0170': { code: 0x31, shift: true }, // Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ '>': { code: 0x1d, altGr: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '#': { code: 0x1b, altGr: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '&': { code: 0x06, altGr: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '@': { code: 0x19, altGr: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '{': { code: 0x05, altGr: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '}': { code: 0x11, altGr: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '<': { code: 0x10, altGr: true },
+ ',': { code: 0x36 },
+ '?': { code: 0x36, shift: true },
+ ';': { code: 0x36, altGr: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '*': { code: 0x38, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Icelandic
+ 'is': {
+ name: 'Icelandic',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\u00f6': { code: 0x2d }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x2d, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\\': { code: 0x2d, altGr: true },
+ '-': { code: 0x2e },
+ '_': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '|': { code: 0x13, altGr: true },
+ '\u00f0': { code: 0x2f }, // ð LATIN SMALL LETTER ETH
+ '\u00d0': { code: 0x2f, shift: true }, // Ð LATIN CAPITAL LETTER ETH
+ '\'': { code: 0x30 },
+ '?': { code: 0x30, shift: true },
+ '~': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u201e': { code: 0x07, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00c6': { code: 0x33, shift: true }, // Æ LATIN CAPITAL LETTER AE
+ '^': { code: 0x33, altGr: true },
+ '+': { code: 0x31 },
+ '*': { code: 0x31, shift: true },
+ '`': { code: 0x31, altGr: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '\u00fe': { code: 0x38 }, // þ LATIN SMALL LETTER THORN
+ '\u00de': { code: 0x38, shift: true }, // Þ LATIN CAPITAL LETTER THORN
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Indonesian
+ 'id': {
+ name: 'Indonesian',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Iraqi
+ 'iq': {
+ name: 'Iraqi',
+ map: {
+ '\u0630': { code: 0x35 }, // ذ ARABIC LETTER THAL
+ '\u0651': { code: 0x35, shift: true }, // ّ ARABIC SHADDA
+ '\u066a': { code: 0x35, altGr: true }, // ٪ ARABIC PERCENT SIGN
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u0661': { code: 0x1e, altGr: true }, // ١ ARABIC-INDIC DIGIT ONE
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u0662': { code: 0x1f, altGr: true }, // ٢ ARABIC-INDIC DIGIT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u0663': { code: 0x20, altGr: true }, // ٣ ARABIC-INDIC DIGIT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u0664': { code: 0x21, altGr: true }, // ٤ ARABIC-INDIC DIGIT FOUR
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u0665': { code: 0x22, altGr: true }, // ٥ ARABIC-INDIC DIGIT FIVE
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u0666': { code: 0x23, altGr: true }, // ٦ ARABIC-INDIC DIGIT SIX
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u0667': { code: 0x24, altGr: true }, // ٧ ARABIC-INDIC DIGIT SEVEN
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u0668': { code: 0x25, altGr: true }, // ٨ ARABIC-INDIC DIGIT EIGHT
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '\u0669': { code: 0x26, altGr: true }, // ٩ ARABIC-INDIC DIGIT NINE
+ '0': { code: 0x27 },
+ '(': { code: 0x27, shift: true },
+ '\u0660': { code: 0x27, altGr: true }, // ٠ ARABIC-INDIC DIGIT ZERO
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u2013': { code: 0x2d, altGr: true }, // – EN DASH
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO
+ '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD
+ '\u064e': { code: 0x14, shift: true }, // َ ARABIC FATHA
+ '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD
+ '\u064b': { code: 0x1a, shift: true }, // ً ARABIC FATHATAN
+ '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH
+ '\u064f': { code: 0x08, shift: true }, // ُ ARABIC DAMMA
+ '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF
+ '\u064c': { code: 0x15, shift: true }, // ٌ ARABIC DAMMATAN
+ '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH
+ '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+ '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH
+ '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN
+ '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW
+ '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN
+ '`': { code: 0x18, shift: true },
+ '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH
+ '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN
+ '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH
+ '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN
+ '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH
+ '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON
+ '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM
+ '<': { code: 0x2f, shift: true },
+ '\u0686': { code: 0x2f, altGr: true }, // چ ARABIC LETTER TCHEH
+ '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL
+ '>': { code: 0x30, shift: true },
+ '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN
+ '\u0650': { code: 0x04, shift: true }, // ِ ARABIC KASRA
+ '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN
+ '\u064d': { code: 0x16, shift: true }, // ٍ ARABIC KASRATAN
+ '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH
+ ']': { code: 0x07, shift: true },
+ '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH
+ '[': { code: 0x09, shift: true },
+ '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH
+ '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM
+ '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+ '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF
+ '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE
+ '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA
+ '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH
+ '\u0640': { code: 0x0d, shift: true }, // ـ ARABIC TATWEEL
+ '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON
+ '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA
+ '\u066b': { code: 0x0e, altGr: true }, // ٫ ARABIC DECIMAL SEPARATOR
+ '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM
+ '/': { code: 0x0f, shift: true },
+ '\u0643': { code: 0x33 }, // ك ARABIC LETTER KAF
+ ':': { code: 0x33, shift: true },
+ '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF
+ '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH
+ '"': { code: 0x34, shift: true },
+ '\u27e9': { code: 0x34, altGr: true }, // ⟩ MATHEMATICAL RIGHT ANGLE BRACKET
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u27e8': { code: 0x31, altGr: true }, // ⟨ MATHEMATICAL LEFT ANGLE BRACKET
+ '\u2026': { code: 0x64, shift: true }, // … HORIZONTAL ELLIPSIS
+ '\u00a6': { code: 0x64, altGr: true }, // ¦ BROKEN BAR
+ '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE
+ '~': { code: 0x1d, shift: true },
+ '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA
+ '\u0652': { code: 0x1b, shift: true }, // ْ ARABIC SUKUN
+ '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE
+ '}': { code: 0x06, shift: true },
+ '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH
+ '{': { code: 0x19, shift: true },
+ '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+ '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA
+ '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE
+ '\u0670': { code: 0x11, altGr: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF
+ '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA
+ '\'': { code: 0x10, shift: true },
+ '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW
+ ',': { code: 0x36, shift: true },
+ '\u066c': { code: 0x36, altGr: true }, // ٬ ARABIC THOUSANDS SEPARATOR
+ '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN
+ '.': { code: 0x37, shift: true },
+ '\u0698': { code: 0x37, altGr: true }, // ژ ARABIC LETTER JEH
+ '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH
+ '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK
+ '\u066d': { code: 0x38, altGr: true }, // ٭ ARABIC FIVE POINTED STAR
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Irish
+ 'ie': {
+ name: 'Irish',
+ map: {
+ '`': { code: 0x35 },
+ '\u00ac': { code: 0x35, shift: true }, // ¬ NOT SIGN
+ '\u00a6': { code: 0x35, altGr: true }, // ¦ BROKEN BAR
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u2122': { code: 0x1f, altGr: true }, // ™ TRADE MARK SIGN
+ '3': { code: 0x20 },
+ '\u00a3': { code: 0x20, shift: true }, // £ POUND SIGN
+ '\u00a9': { code: 0x20, altGr: true }, // © COPYRIGHT SIGN
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00a7': { code: 0x22, altGr: true }, // § SECTION SIGN
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u00b6': { code: 0x24, altGr: true }, // ¶ PILCROW SIGN
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '\u00aa': { code: 0x26, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u00ba': { code: 0x27, altGr: true }, // º MASCULINE ORDINAL INDICATOR
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u2013': { code: 0x2d, altGr: true }, // – EN DASH
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u0153': { code: 0x14, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u00e9': { code: 0x08, altGr: true }, // é LATIN SMALL LETTER E WITH ACUTE
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u00fa': { code: 0x18, altGr: true }, // ú LATIN SMALL LETTER U WITH ACUTE
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u00ed': { code: 0x0c, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f3': { code: 0x12, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u201a': { code: 0x13, altGr: true }, // ‚ SINGLE LOW-9 QUOTATION MARK
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ '\u201c': { code: 0x2f, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u2018': { code: 0x30, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0192': { code: 0x09, altGr: true }, // ƒ LATIN SMALL LETTER F WITH HOOK
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0131': { code: 0x0d, altGr: true }, // ı LATIN SMALL LETTER DOTLESS I
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u00b4': { code: 0x0f, altGr: true }, // ´ ACUTE ACCENT
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\u2026': { code: 0x33, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '\'': { code: 0x34 },
+ '@': { code: 0x34, shift: true },
+ '\u00e6': { code: 0x34, altGr: true }, // æ LATIN SMALL LETTER AE
+ '#': { code: 0x31 },
+ '~': { code: 0x31, shift: true },
+ '\u00ab': { code: 0x31, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\\': { code: 0x64 },
+ '|': { code: 0x64, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u2329': { code: 0x1d, altGr: true }, // 〈 LEFT-POINTING ANGLE BRACKET
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00d7': { code: 0x1b, altGr: true }, // × MULTIPLICATION SIGN
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u00a8': { code: 0x05, altGr: true }, // ¨ DIAERESIS
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00af': { code: 0x10, altGr: true }, // ¯ MACRON
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u2264': { code: 0x36, altGr: true }, // ≤ LESS-THAN OR EQUAL TO
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u2265': { code: 0x37, altGr: true }, // ≥ GREATER-THAN OR EQUAL TO
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '\u00f7': { code: 0x38, altGr: true }, // ÷ DIVISION SIGN
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, altGr: true }, // NO-BREAK SPACE
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Italian
+ 'it': {
+ name: 'Italian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '\u00a3': { code: 0x20, shift: true }, // £ POUND SIGN
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '`': { code: 0x2d, altGr: true },
+ '\u00ec': { code: 0x2e }, // ì LATIN SMALL LETTER I WITH GRAVE
+ '^': { code: 0x2e, shift: true },
+ '~': { code: 0x2e, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00e8': { code: 0x2f }, // è LATIN SMALL LETTER E WITH GRAVE
+ '\u00e9': { code: 0x2f, shift: true }, // é LATIN SMALL LETTER E WITH ACUTE
+ '+': { code: 0x30 },
+ '*': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f2': { code: 0x33 }, // ò LATIN SMALL LETTER O WITH GRAVE
+ '\u00e7': { code: 0x33, shift: true }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00e0': { code: 0x34 }, // à LATIN SMALL LETTER A WITH GRAVE
+ '\u00b0': { code: 0x34, shift: true }, // ° DEGREE SIGN
+ '#': { code: 0x34, altGr: true },
+ '\\': { code: 0x35 },
+ '|': { code: 0x35, shift: true },
+ '\u00f9': { code: 0x31 }, // ù LATIN SMALL LETTER U WITH GRAVE
+ '\u00a7': { code: 0x31, shift: true }, // § SECTION SIGN
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201c': { code: 0x19, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Kazakh
+ 'kz': {
+ name: 'Kazakh',
+ map: {
+ '(': { code: 0x35 },
+ ')': { code: 0x35, shift: true },
+ '\u0451': { code: 0x35, altGr: true }, // ё CYRILLIC SMALL LETTER IO
+ '"': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ ',': { code: 0x23 },
+ ';': { code: 0x23, shift: true },
+ '.': { code: 0x24 },
+ ':': { code: 0x24, shift: true },
+ '\\': { code: 0x31 },
+ '/': { code: 0x31, shift: true },
+ '\u2116': { code: 0x38 }, // № NUMERO SIGN
+ '?': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '|': { code: 0x64, altGr: true },
+ '\u04d9': { code: 0x1f }, // ә CYRILLIC SMALL LETTER SCHWA
+ '\u04d8': { code: 0x1f, shift: true }, // Ә CYRILLIC CAPITAL LETTER SCHWA
+ '\u0456': { code: 0x20 }, // і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u0406': { code: 0x20, shift: true }, // І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u04a3': { code: 0x21 }, // ң CYRILLIC SMALL LETTER EN WITH DESCENDER
+ '\u04a2': { code: 0x21, shift: true }, // Ң CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+ '\u0493': { code: 0x22 }, // ғ CYRILLIC SMALL LETTER GHE WITH STROKE
+ '\u0492': { code: 0x22, shift: true }, // Ғ CYRILLIC CAPITAL LETTER GHE WITH STROKE
+ '\u04af': { code: 0x25 }, // ү CYRILLIC SMALL LETTER STRAIGHT U
+ '\u04ae': { code: 0x25, shift: true }, // Ү CYRILLIC CAPITAL LETTER STRAIGHT U
+ '\u04b1': { code: 0x26 }, // ұ CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+ '\u04b0': { code: 0x26, shift: true }, // Ұ CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+ '\u049b': { code: 0x27 }, // қ CYRILLIC SMALL LETTER KA WITH DESCENDER
+ '\u049a': { code: 0x27, shift: true }, // Қ CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+ '\u04e9': { code: 0x2d }, // ө CYRILLIC SMALL LETTER BARRED O
+ '\u04e8': { code: 0x2d, shift: true }, // Ө CYRILLIC CAPITAL LETTER BARRED O
+ '\u04bb': { code: 0x2e }, // һ CYRILLIC SMALL LETTER SHHA
+ '\u04ba': { code: 0x2e, shift: true }, // Һ CYRILLIC CAPITAL LETTER SHHA
+ '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA
+ '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN
+ '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+ '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU
+ '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU
+ '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E
+ '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Kyrgyz
+ 'kg': {
+ name: 'Kyrgyz',
+ map: {
+ '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO
+ '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ ';': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ ':': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '?': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u04e9': { code: 0x2d }, // ө CYRILLIC SMALL LETTER BARRED O
+ '\u04e8': { code: 0x2d, shift: true }, // Ө CYRILLIC CAPITAL LETTER BARRED O
+ '\u04a3': { code: 0x2e }, // ң CYRILLIC SMALL LETTER EN WITH DESCENDER
+ '\u04a2': { code: 0x2e, shift: true }, // Ң CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+ '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA
+ '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN
+ '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+ '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU
+ '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU
+ '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E
+ '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E
+ '\u04af': { code: 0x31 }, // ү CYRILLIC SMALL LETTER STRAIGHT U
+ '\u04ae': { code: 0x31, shift: true }, // Ү CYRILLIC CAPITAL LETTER STRAIGHT U
+ '/': { code: 0x64 },
+ '|': { code: 0x64, shift: true },
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ '.': { code: 0x38 },
+ ',': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Latin American
+ 'latam': {
+ name: 'Latin American',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '|': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b7': { code: 0x20, altGr: true }, // · MIDDLE DOT
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '~': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '\u00bf': { code: 0x2e }, // ¿ INVERTED QUESTION MARK
+ '\u00a1': { code: 0x2e, shift: true }, // ¡ INVERTED EXCLAMATION MARK
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '+': { code: 0x30 },
+ '*': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f1': { code: 0x33 }, // ñ LATIN SMALL LETTER N WITH TILDE
+ '\u00d1': { code: 0x33, shift: true }, // Ñ LATIN CAPITAL LETTER N WITH TILDE
+ '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Latvian
+ 'lv': {
+ name: 'Latvian',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u00b4': { code: 0x35, altGr: true }, // ´ ACUTE ACCENT
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2013': { code: 0x2e, altGr: true }, // – EN DASH
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u0113': { code: 0x08, altGr: true }, // ē LATIN SMALL LETTER E WITH MACRON
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u0157': { code: 0x15, altGr: true }, // ŗ LATIN SMALL LETTER R WITH CEDILLA
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u016b': { code: 0x18, altGr: true }, // ū LATIN SMALL LETTER U WITH MACRON
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u012b': { code: 0x0c, altGr: true }, // ī LATIN SMALL LETTER I WITH MACRON
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u014d': { code: 0x12, altGr: true }, // ō LATIN SMALL LETTER O WITH MACRON
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00ab': { code: 0x2f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u00bb': { code: 0x30, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u0101': { code: 0x04, altGr: true }, // ā LATIN SMALL LETTER A WITH MACRON
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0161': { code: 0x16, altGr: true }, // š LATIN SMALL LETTER S WITH CARON
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u0123': { code: 0x0a, altGr: true }, // ģ LATIN SMALL LETTER G WITH CEDILLA
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0137': { code: 0x0e, altGr: true }, // ķ LATIN SMALL LETTER K WITH CEDILLA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u013c': { code: 0x0f, altGr: true }, // ļ LATIN SMALL LETTER L WITH CEDILLA
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\u201c': { code: 0x34, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u017e': { code: 0x1d, altGr: true }, // ž LATIN SMALL LETTER Z WITH CARON
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u010d': { code: 0x06, altGr: true }, // č LATIN SMALL LETTER C WITH CARON
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u0146': { code: 0x11, altGr: true }, // ņ LATIN SMALL LETTER N WITH CEDILLA
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '|': { code: 0x31, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Lithuanian
+ 'lt': {
+ name: 'Lithuanian',
+ map: {
+ '\u0105': { code: 0x1e }, // ą LATIN SMALL LETTER A WITH OGONEK
+ '\u0104': { code: 0x1e, shift: true }, // Ą LATIN CAPITAL LETTER A WITH OGONEK
+ '1': { code: 0x1e, altGr: true },
+ '\u010d': { code: 0x1f }, // č LATIN SMALL LETTER C WITH CARON
+ '\u010c': { code: 0x1f, shift: true }, // Č LATIN CAPITAL LETTER C WITH CARON
+ '2': { code: 0x1f, altGr: true },
+ '\u0119': { code: 0x20 }, // ę LATIN SMALL LETTER E WITH OGONEK
+ '\u0118': { code: 0x20, shift: true }, // Ę LATIN CAPITAL LETTER E WITH OGONEK
+ '3': { code: 0x20, altGr: true },
+ '\u0117': { code: 0x21 }, // ė LATIN SMALL LETTER E WITH DOT ABOVE
+ '\u0116': { code: 0x21, shift: true }, // Ė LATIN CAPITAL LETTER E WITH DOT ABOVE
+ '4': { code: 0x21, altGr: true },
+ '\u012f': { code: 0x22 }, // į LATIN SMALL LETTER I WITH OGONEK
+ '\u012e': { code: 0x22, shift: true }, // Į LATIN CAPITAL LETTER I WITH OGONEK
+ '5': { code: 0x22, altGr: true },
+ '\u0161': { code: 0x23 }, // š LATIN SMALL LETTER S WITH CARON
+ '\u0160': { code: 0x23, shift: true }, // Š LATIN CAPITAL LETTER S WITH CARON
+ '6': { code: 0x23, altGr: true },
+ '\u0173': { code: 0x24 }, // ų LATIN SMALL LETTER U WITH OGONEK
+ '\u0172': { code: 0x24, shift: true }, // Ų LATIN CAPITAL LETTER U WITH OGONEK
+ '7': { code: 0x24, altGr: true },
+ '\u016b': { code: 0x25 }, // ū LATIN SMALL LETTER U WITH MACRON
+ '\u016a': { code: 0x25, shift: true }, // Ū LATIN CAPITAL LETTER U WITH MACRON
+ '8': { code: 0x25, altGr: true },
+ '\u201e': { code: 0x26 }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '(': { code: 0x26, shift: true },
+ '9': { code: 0x26, altGr: true },
+ '\u201c': { code: 0x27 }, // “ LEFT DOUBLE QUOTATION MARK
+ ')': { code: 0x27, shift: true },
+ '0': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u2013': { code: 0x2d, altGr: true }, // – EN DASH
+ '\u017e': { code: 0x2e }, // ž LATIN SMALL LETTER Z WITH CARON
+ '\u017d': { code: 0x2e, shift: true }, // Ž LATIN CAPITAL LETTER Z WITH CARON
+ '=': { code: 0x2e, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u00b4': { code: 0x35, altGr: true }, // ´ ACUTE ACCENT
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Macedonian
+ 'mk': {
+ name: 'Macedonian',
+ map: {
+ '\u0437': { code: 0x1d }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x1d, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0441': { code: 0x16 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x16, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u0430': { code: 0x04 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x04, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u0459': { code: 0x14 }, // љ CYRILLIC SMALL LETTER LJE
+ '\u0409': { code: 0x14, shift: true }, // Љ CYRILLIC CAPITAL LETTER LJE
+ '\u045a': { code: 0x1a }, // њ CYRILLIC SMALL LETTER NJE
+ '\u040a': { code: 0x1a, shift: true }, // Њ CYRILLIC CAPITAL LETTER NJE
+ '\u0446': { code: 0x06 }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x06, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u045f': { code: 0x1b }, // џ CYRILLIC SMALL LETTER DZHE
+ '\u040f': { code: 0x1b, shift: true }, // Џ CYRILLIC CAPITAL LETTER DZHE
+ '\u0434': { code: 0x07 }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x07, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0435': { code: 0x08 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x08, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u0432': { code: 0x19 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x19, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0444': { code: 0x09 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x09, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u0442': { code: 0x17 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x17, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u0440': { code: 0x15 }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x15, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043d': { code: 0x11 }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x11, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0431': { code: 0x05 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x05, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u0433': { code: 0x0a }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x0a, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0455': { code: 0x1c }, // ѕ CYRILLIC SMALL LETTER DZE
+ '\u0405': { code: 0x1c, shift: true }, // Ѕ CYRILLIC CAPITAL LETTER DZE
+ '\u043c': { code: 0x10 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x10, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0458': { code: 0x0d }, // ј CYRILLIC SMALL LETTER JE
+ '\u0408': { code: 0x0d, shift: true }, // Ј CYRILLIC CAPITAL LETTER JE
+ '\u0443': { code: 0x18 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x18, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x0e }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x0e, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0438': { code: 0x0c }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x0c, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u043e': { code: 0x12 }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x12, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0447': { code: 0x33 }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x33, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u043f': { code: 0x13 }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x13, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u045c': { code: 0x34 }, // ќ CYRILLIC SMALL LETTER KJE
+ '\u040c': { code: 0x34, shift: true }, // Ќ CYRILLIC CAPITAL LETTER KJE
+ '\u0448': { code: 0x2f }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x2f, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u0453': { code: 0x30 }, // ѓ CYRILLIC SMALL LETTER GJE
+ '\u0403': { code: 0x30, shift: true }, // Ѓ CYRILLIC CAPITAL LETTER GJE
+ '\u0436': { code: 0x31 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x31, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '\u201e': { code: 0x1f, shift: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '3': { code: 0x20 },
+ '\u201c': { code: 0x20, shift: true }, // “ LEFT DOUBLE QUOTATION MARK
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Malay
+ 'my': {
+ name: 'Malay',
+ map: {
+ '\u0661': { code: 0x1e }, // ١ ARABIC-INDIC DIGIT ONE
+ '!': { code: 0x1e, shift: true },
+ '1': { code: 0x1e, altGr: true },
+ '\u0662': { code: 0x1f }, // ٢ ARABIC-INDIC DIGIT TWO
+ '@': { code: 0x1f, shift: true },
+ '2': { code: 0x1f, altGr: true },
+ '\u0663': { code: 0x20 }, // ٣ ARABIC-INDIC DIGIT THREE
+ '#': { code: 0x20, shift: true },
+ '3': { code: 0x20, altGr: true },
+ '\u0664': { code: 0x21 }, // ٤ ARABIC-INDIC DIGIT FOUR
+ '$': { code: 0x21, shift: true },
+ '4': { code: 0x21, altGr: true },
+ '\u0665': { code: 0x22 }, // ٥ ARABIC-INDIC DIGIT FIVE
+ '\u066a': { code: 0x22, shift: true }, // ٪ ARABIC PERCENT SIGN
+ '5': { code: 0x22, altGr: true },
+ '\u0666': { code: 0x23 }, // ٦ ARABIC-INDIC DIGIT SIX
+ '^': { code: 0x23, shift: true },
+ '6': { code: 0x23, altGr: true },
+ '\u0667': { code: 0x24 }, // ٧ ARABIC-INDIC DIGIT SEVEN
+ '&': { code: 0x24, shift: true },
+ '7': { code: 0x24, altGr: true },
+ '\u0668': { code: 0x25 }, // ٨ ARABIC-INDIC DIGIT EIGHT
+ '*': { code: 0x25, shift: true },
+ '8': { code: 0x25, altGr: true },
+ '\u0669': { code: 0x26 }, // ٩ ARABIC-INDIC DIGIT NINE
+ ')': { code: 0x26, shift: true },
+ '9': { code: 0x26, altGr: true },
+ '\u0660': { code: 0x27 }, // ٠ ARABIC-INDIC DIGIT ZERO
+ '(': { code: 0x27, shift: true },
+ '0': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD
+ '\u0686': { code: 0x14, shift: true }, // چ ARABIC LETTER TCHEH
+ '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD
+ '\u06a0': { code: 0x1a, shift: true }, // ڠ ARABIC LETTER AIN WITH THREE DOTS ABOVE
+ '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH
+ '\u06ac': { code: 0x08, shift: true }, // ڬ ARABIC LETTER KAF WITH DOT ABOVE
+ '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF
+ '\u0640': { code: 0x15, shift: true }, // ـ ARABIC TATWEEL
+ '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH
+ '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+ '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH
+ '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN
+ '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW
+ '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN
+ '`': { code: 0x18, shift: true },
+ '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH
+ '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN
+ '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH
+ '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN
+ '\u06a9': { code: 0x13 }, // ک ARABIC LETTER KEHEH
+ '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON
+ '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM
+ '<': { code: 0x2f, shift: true },
+ '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL
+ '>': { code: 0x30, shift: true },
+ '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN
+ '\u06cf': { code: 0x04, shift: true }, // ۏ ARABIC LETTER WAW WITH DOT ABOVE
+ '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN
+ '\u06a8': { code: 0x16, shift: true }, // ڨ ARABIC LETTER QAF WITH THREE DOTS ABOVE
+ '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH
+ ']': { code: 0x07, shift: true },
+ '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH
+ '[': { code: 0x09, shift: true },
+ '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH
+ '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM
+ '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+ '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF
+ '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE
+ '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH
+ '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON
+ '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA
+ '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM
+ '/': { code: 0x0f, shift: true },
+ ':': { code: 0x33, shift: true },
+ '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF
+ '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH
+ '"': { code: 0x34, shift: true },
+ '|': { code: 0x64 },
+ '\u00a6': { code: 0x64, shift: true }, // ¦ BROKEN BAR
+ '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE
+ '~': { code: 0x1d, shift: true },
+ '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA
+ '\u06bd': { code: 0x1b, shift: true }, // ڽ ARABIC LETTER NOON WITH THREE DOTS ABOVE
+ '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE
+ '}': { code: 0x06, shift: true },
+ '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH
+ '{': { code: 0x19, shift: true },
+ '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+ '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA
+ '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE
+ '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA
+ '\'': { code: 0x10, shift: true },
+ '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW
+ '\u200c': { code: 0x36, shift: true }, // ZERO WIDTH NON-JOINER
+ ',': { code: 0x36, altGr: true },
+ '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN
+ '.': { code: 0x37, shift: true },
+ '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH
+ '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Maltese
+ 'mt': {
+ name: 'Maltese',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '\u20ac': { code: 0x20, shift: true }, // € EURO SIGN
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u00e8': { code: 0x08, altGr: true }, // è LATIN SMALL LETTER E WITH GRAVE
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u00f9': { code: 0x18, altGr: true }, // ù LATIN SMALL LETTER U WITH GRAVE
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u00ec': { code: 0x0c, altGr: true }, // ì LATIN SMALL LETTER I WITH GRAVE
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f2': { code: 0x12, altGr: true }, // ò LATIN SMALL LETTER O WITH GRAVE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u0121': { code: 0x2f }, // ġ LATIN SMALL LETTER G WITH DOT ABOVE
+ '\u0120': { code: 0x2f, shift: true }, // Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE
+ '\u0127': { code: 0x30 }, // ħ LATIN SMALL LETTER H WITH STROKE
+ '\u0126': { code: 0x30, shift: true }, // Ħ LATIN CAPITAL LETTER H WITH STROKE
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e0': { code: 0x04, altGr: true }, // à LATIN SMALL LETTER A WITH GRAVE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '\u010b': { code: 0x35 }, // ċ LATIN SMALL LETTER C WITH DOT ABOVE
+ '\u010a': { code: 0x35, shift: true }, // Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE
+ '`': { code: 0x35, altGr: true },
+ '#': { code: 0x31 },
+ '~': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '\u017c': { code: 0x64 }, // ż LATIN SMALL LETTER Z WITH DOT ABOVE
+ '\u017b': { code: 0x64, shift: true }, // Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Moldovan
+ 'md': {
+ name: 'Moldovan',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u00e2': { code: 0x14, altGr: true }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u00df': { code: 0x1a, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u021b': { code: 0x17, altGr: true }, // ț LATIN SMALL LETTER T WITH COMMA BELOW
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u00ee': { code: 0x0c, altGr: true }, // î LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00a7': { code: 0x13, altGr: true }, // § SECTION SIGN
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ '\u201e': { code: 0x2f, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u201d': { code: 0x30, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u0103': { code: 0x04, altGr: true }, // ă LATIN SMALL LETTER A WITH BREVE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0219': { code: 0x16, altGr: true }, // ș LATIN SMALL LETTER S WITH COMMA BELOW
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u0111': { code: 0x07, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Mongolian
+ 'mn': {
+ name: 'Mongolian',
+ map: {
+ '=': { code: 0x35 },
+ '+': { code: 0x35, shift: true },
+ '\u00b0': { code: 0x35, altGr: true }, // ° DEGREE SIGN
+ '1': { code: 0x1e },
+ '\u2116': { code: 0x1e, shift: true }, // № NUMERO SIGN
+ '\u00d7': { code: 0x1e, altGr: true }, // × MULTIPLICATION SIGN
+ '2': { code: 0x1f },
+ '-': { code: 0x1f, shift: true },
+ '\u00f7': { code: 0x1f, altGr: true }, // ÷ DIVISION SIGN
+ '3': { code: 0x20 },
+ '"': { code: 0x20, shift: true },
+ '\u00b1': { code: 0x20, altGr: true }, // ± PLUS-MINUS SIGN
+ '4': { code: 0x21 },
+ '\u20ae': { code: 0x21, shift: true }, // ₮ TUGRIK SIGN
+ '\u00ac': { code: 0x21, altGr: true }, // ¬ NOT SIGN
+ '5': { code: 0x22 },
+ ':': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '.': { code: 0x23, shift: true },
+ '\u2260': { code: 0x23, altGr: true }, // ≠ NOT EQUAL TO
+ '7': { code: 0x24 },
+ '_': { code: 0x24, shift: true },
+ '&': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ ',': { code: 0x25, shift: true },
+ '*': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ '%': { code: 0x26, shift: true },
+ '[': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '?': { code: 0x27, shift: true },
+ ']': { code: 0x27, altGr: true },
+ '\u0435': { code: 0x2d }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x2d, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ 'X': { code: 0x2d, altGr: true },
+ '\u0449': { code: 0x2e }, // щ CYRILLIC SMALL LETTER SHCHA
+ '\u0429': { code: 0x2e, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA
+ 'L': { code: 0x2e, altGr: true },
+ '\u0444': { code: 0x14 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x14, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\'': { code: 0x14, altGr: true },
+ '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '`': { code: 0x1a, altGr: true },
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ '\u0436': { code: 0x15 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x15, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ '\u044d': { code: 0x17 }, // э CYRILLIC SMALL LETTER E
+ '\u042d': { code: 0x17, shift: true }, // Э CYRILLIC CAPITAL LETTER E
+ '\u2122': { code: 0x17, altGr: true }, // ™ TRADE MARK SIGN
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u201e': { code: 0x18, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u201c': { code: 0x0c, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ '\u04af': { code: 0x12 }, // ү CYRILLIC SMALL LETTER STRAIGHT U
+ '\u04ae': { code: 0x12, shift: true }, // Ү CYRILLIC CAPITAL LETTER STRAIGHT U
+ '\u201d': { code: 0x12, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u043a': { code: 0x2f }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x2f, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '{': { code: 0x2f, altGr: true },
+ '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN
+ '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+ '}': { code: 0x30, altGr: true },
+ '\u0439': { code: 0x04 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x04, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u00b5': { code: 0x04, altGr: true }, // µ MICRO SIGN
+ '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU
+ '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU
+ '\u00a3': { code: 0x16, altGr: true }, // £ POUND SIGN
+ '\u0431': { code: 0x07 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x07, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '$': { code: 0x07, altGr: true },
+ '\u04e9': { code: 0x09 }, // ө CYRILLIC SMALL LETTER BARRED O
+ '\u04e8': { code: 0x09, shift: true }, // Ө CYRILLIC CAPITAL LETTER BARRED O
+ '\u0430': { code: 0x0a }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x0a, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u0440': { code: 0x0d }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0d, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0e }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0e, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x33 }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x33, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u00a7': { code: 0x33, altGr: true }, // § SECTION SIGN
+ '\u043f': { code: 0x34 }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x34, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u2026': { code: 0x34, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '!': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '(': { code: 0x64 },
+ ')': { code: 0x64, shift: true },
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u2014': { code: 0x1d, altGr: true }, // — EM DASH
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u2013': { code: 0x1b, altGr: true }, // – EN DASH
+ '\u0451': { code: 0x06 }, // ё CYRILLIC SMALL LETTER IO
+ '\u0401': { code: 0x06, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ '\u0441': { code: 0x19 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x19, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x05 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x05, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0438': { code: 0x11 }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x11, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '<': { code: 0x11, altGr: true },
+ '\u0442': { code: 0x10 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x10, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '>': { code: 0x10, altGr: true },
+ '\u044c': { code: 0x36 }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u042c': { code: 0x36, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0432': { code: 0x37 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x37, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u044e': { code: 0x38 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x38, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ '\\': { code: 0x38, altGr: true },
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, altGr: true }, // NO-BREAK SPACE
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Montenegrin
+ 'me': {
+ name: 'Montenegrin',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '+': { code: 0x2e },
+ '*': { code: 0x2e, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ '|': { code: 0x1a, altGr: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ '\u017a': { code: 0x1c, altGr: true }, // ź LATIN SMALL LETTER Z WITH ACUTE
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN
+ '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ '\u015b': { code: 0x16, altGr: true }, // ś LATIN SMALL LETTER S WITH ACUTE
+ '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ '[': { code: 0x09, altGr: true },
+ ']': { code: 0x0a, altGr: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN
+ '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ '@': { code: 0x19, altGr: true },
+ '{': { code: 0x05, altGr: true },
+ '}': { code: 0x11, altGr: true },
+ '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Myanmar
+ 'mm': {
+ name: 'Myanmar',
+ map: {
+ '`': { code: 0x35 },
+ '\u100e': { code: 0x35, shift: true }, // ဎ MYANMAR LETTER DDHA
+ '\u1041': { code: 0x1e }, // ၁ MYANMAR DIGIT ONE
+ '\u100d': { code: 0x1e, shift: true }, // ဍ MYANMAR LETTER DDA
+ '1': { code: 0x1e, altGr: true },
+ '\u1042': { code: 0x1f }, // ၂ MYANMAR DIGIT TWO
+ '\u1052': { code: 0x1f, shift: true }, // ၒ MYANMAR LETTER VOCALIC R
+ '2': { code: 0x1f, altGr: true },
+ '\u1043': { code: 0x20 }, // ၃ MYANMAR DIGIT THREE
+ '\u100b': { code: 0x20, shift: true }, // ဋ MYANMAR LETTER TTA
+ '3': { code: 0x20, altGr: true },
+ '\u1044': { code: 0x21 }, // ၄ MYANMAR DIGIT FOUR
+ '$': { code: 0x21, shift: true },
+ '4': { code: 0x21, altGr: true },
+ '\u1045': { code: 0x22 }, // ၅ MYANMAR DIGIT FIVE
+ '%': { code: 0x22, shift: true },
+ '5': { code: 0x22, altGr: true },
+ '\u1046': { code: 0x23 }, // ၆ MYANMAR DIGIT SIX
+ '^': { code: 0x23, shift: true },
+ '6': { code: 0x23, altGr: true },
+ '\u1047': { code: 0x24 }, // ၇ MYANMAR DIGIT SEVEN
+ '\u101b': { code: 0x24, shift: true }, // ရ MYANMAR LETTER RA
+ '7': { code: 0x24, altGr: true },
+ '\u1048': { code: 0x25 }, // ၈ MYANMAR DIGIT EIGHT
+ '*': { code: 0x25, shift: true },
+ '8': { code: 0x25, altGr: true },
+ '\u1049': { code: 0x26 }, // ၉ MYANMAR DIGIT NINE
+ '(': { code: 0x26, shift: true },
+ '9': { code: 0x26, altGr: true },
+ '\u1040': { code: 0x27 }, // ၀ MYANMAR DIGIT ZERO
+ ')': { code: 0x27, shift: true },
+ '0': { code: 0x27, altGr: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u1006': { code: 0x14 }, // ဆ MYANMAR LETTER CHA
+ '\u1008': { code: 0x14, shift: true }, // ဈ MYANMAR LETTER JHA
+ 'q': { code: 0x14, altGr: true },
+ '\u1010': { code: 0x1a }, // တ MYANMAR LETTER TA
+ '\u101d': { code: 0x1a, shift: true }, // ဝ MYANMAR LETTER WA
+ 'w': { code: 0x1a, altGr: true },
+ '\u1014': { code: 0x08 }, // န MYANMAR LETTER NA
+ '\u1023': { code: 0x08, shift: true }, // ဣ MYANMAR LETTER I
+ 'e': { code: 0x08, altGr: true },
+ '\u1019': { code: 0x15 }, // မ MYANMAR LETTER MA
+ '\u104e': { code: 0x15, shift: true }, // ၎ MYANMAR SYMBOL AFOREMENTIONED
+ 'r': { code: 0x15, altGr: true },
+ '\u1021': { code: 0x17 }, // အ MYANMAR LETTER A
+ '\u1024': { code: 0x17, shift: true }, // ဤ MYANMAR LETTER II
+ 't': { code: 0x17, altGr: true },
+ '\u1015': { code: 0x1c }, // ပ MYANMAR LETTER PA
+ '\u104c': { code: 0x1c, shift: true }, // ၌ MYANMAR SYMBOL LOCATIVE
+ 'y': { code: 0x1c, altGr: true },
+ '\u1000': { code: 0x18 }, // က MYANMAR LETTER KA
+ '\u1025': { code: 0x18, shift: true }, // ဥ MYANMAR LETTER U
+ 'u': { code: 0x18, altGr: true },
+ '\u1004': { code: 0x0c }, // င MYANMAR LETTER NGA
+ '\u104d': { code: 0x0c, shift: true }, // ၍ MYANMAR SYMBOL COMPLETED
+ 'i': { code: 0x0c, altGr: true },
+ '\u101e': { code: 0x12 }, // သ MYANMAR LETTER SA
+ '\u103f': { code: 0x12, shift: true }, // ဿ MYANMAR LETTER GREAT SA
+ 'o': { code: 0x12, altGr: true },
+ '\u1005': { code: 0x13 }, // စ MYANMAR LETTER CA
+ '\u100f': { code: 0x13, shift: true }, // ဏ MYANMAR LETTER NNA
+ 'p': { code: 0x13, altGr: true },
+ '\u101f': { code: 0x2f }, // ဟ MYANMAR LETTER HA
+ '\u1027': { code: 0x2f, shift: true }, // ဧ MYANMAR LETTER E
+ '[': { code: 0x2f, altGr: true },
+ '\u1029': { code: 0x30 }, // ဩ MYANMAR LETTER O
+ '\u102a': { code: 0x30, shift: true }, // ဪ MYANMAR LETTER AU
+ ']': { code: 0x30, altGr: true },
+ '\u1031': { code: 0x04 }, // ေ MYANMAR VOWEL SIGN E
+ '\u1017': { code: 0x04, shift: true }, // ဗ MYANMAR LETTER BA
+ 'a': { code: 0x04, altGr: true },
+ '\u103b': { code: 0x16 }, // ျ MYANMAR CONSONANT SIGN MEDIAL YA
+ '\u103e': { code: 0x16, shift: true }, // ှ MYANMAR CONSONANT SIGN MEDIAL HA
+ 's': { code: 0x16, altGr: true },
+ '\u102d': { code: 0x07 }, // ိ MYANMAR VOWEL SIGN I
+ '\u102e': { code: 0x07, shift: true }, // ီ MYANMAR VOWEL SIGN II
+ 'd': { code: 0x07, altGr: true },
+ '\u103a': { code: 0x09 }, // ် MYANMAR SIGN ASAT
+ '\u1039': { code: 0x09, shift: true }, // ္ MYANMAR SIGN VIRAMA
+ 'f': { code: 0x09, altGr: true },
+ '\u102b': { code: 0x0a }, // ါ MYANMAR VOWEL SIGN TALL AA
+ '\u103d': { code: 0x0a, shift: true }, // ွ MYANMAR CONSONANT SIGN MEDIAL WA
+ 'g': { code: 0x0a, altGr: true },
+ '\u1037': { code: 0x0b }, // ့ MYANMAR SIGN DOT BELOW
+ '\u1036': { code: 0x0b, shift: true }, // ံ MYANMAR SIGN ANUSVARA
+ 'h': { code: 0x0b, altGr: true },
+ '\u103c': { code: 0x0d }, // ြ MYANMAR CONSONANT SIGN MEDIAL RA
+ '\u1032': { code: 0x0d, shift: true }, // ဲ MYANMAR VOWEL SIGN AI
+ 'j': { code: 0x0d, altGr: true },
+ '\u102f': { code: 0x0e }, // ု MYANMAR VOWEL SIGN U
+ '\u1012': { code: 0x0e, shift: true }, // ဒ MYANMAR LETTER DA
+ 'k': { code: 0x0e, altGr: true },
+ '\u1030': { code: 0x0f }, // ူ MYANMAR VOWEL SIGN UU
+ '\u1013': { code: 0x0f, shift: true }, // ဓ MYANMAR LETTER DHA
+ 'l': { code: 0x0f, altGr: true },
+ '\u1038': { code: 0x33 }, // း MYANMAR SIGN VISARGA
+ '\u1002': { code: 0x33, shift: true }, // ဂ MYANMAR LETTER GA
+ ';': { code: 0x33, altGr: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\u104f': { code: 0x31 }, // ၏ MYANMAR SYMBOL GENITIVE
+ '\\': { code: 0x31, shift: true },
+ '\u1016': { code: 0x1d }, // ဖ MYANMAR LETTER PHA
+ '\u1007': { code: 0x1d, shift: true }, // ဇ MYANMAR LETTER JA
+ 'z': { code: 0x1d, altGr: true },
+ '\u1011': { code: 0x1b }, // ထ MYANMAR LETTER THA
+ '\u100c': { code: 0x1b, shift: true }, // ဌ MYANMAR LETTER TTHA
+ 'x': { code: 0x1b, altGr: true },
+ '\u1001': { code: 0x06 }, // ခ MYANMAR LETTER KHA
+ '\u1003': { code: 0x06, shift: true }, // ဃ MYANMAR LETTER GHA
+ 'c': { code: 0x06, altGr: true },
+ '\u101c': { code: 0x19 }, // လ MYANMAR LETTER LA
+ '\u1020': { code: 0x19, shift: true }, // ဠ MYANMAR LETTER LLA
+ 'v': { code: 0x19, altGr: true },
+ '\u1018': { code: 0x05 }, // ဘ MYANMAR LETTER BHA
+ '\u101a': { code: 0x05, shift: true }, // ယ MYANMAR LETTER YA
+ 'b': { code: 0x05, altGr: true },
+ '\u100a': { code: 0x11 }, // ည MYANMAR LETTER NNYA
+ '\u1009': { code: 0x11, shift: true }, // ဉ MYANMAR LETTER NYA
+ 'n': { code: 0x11, altGr: true },
+ '\u102c': { code: 0x10 }, // ာ MYANMAR VOWEL SIGN AA
+ '\u1026': { code: 0x10, shift: true }, // ဦ MYANMAR LETTER UU
+ 'm': { code: 0x10, altGr: true },
+ ',': { code: 0x36 },
+ '\u104a': { code: 0x36, shift: true }, // ၊ MYANMAR SIGN LITTLE SECTION
+ '.': { code: 0x37 },
+ '\u104b': { code: 0x37, shift: true }, // ။ MYANMAR SIGN SECTION
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Nepali
+ 'np': {
+ name: 'Nepali',
+ map: {
+ '!': { code: 0x1e, shift: true },
+ '@': { code: 0x1f, shift: true },
+ '#': { code: 0x20, shift: true },
+ '$': { code: 0x21, shift: true },
+ '%': { code: 0x22, shift: true },
+ '^': { code: 0x23, shift: true },
+ '&': { code: 0x24, shift: true },
+ '*': { code: 0x25, shift: true },
+ '(': { code: 0x26, shift: true },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ ',': { code: 0x36 },
+ '.': { code: 0x37, shift: true },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Norwegian
+ 'no': {
+ name: 'Norwegian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN
+ '$': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '+': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN
+ '\\': { code: 0x2e },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u03c0': { code: 0x13, altGr: true }, // π GREEK SMALL LETTER PI
+ '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE
+ '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f8': { code: 0x33 }, // ø LATIN SMALL LETTER O WITH STROKE
+ '\u00d8': { code: 0x33, shift: true }, // Ø LATIN CAPITAL LETTER O WITH STROKE
+ '\u00e6': { code: 0x34 }, // æ LATIN SMALL LETTER AE
+ '\u00c6': { code: 0x34, shift: true }, // Æ LATIN CAPITAL LETTER AE
+ '|': { code: 0x35 },
+ '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN
+ '\u00a6': { code: 0x35, altGr: true }, // ¦ BROKEN BAR
+ '\'': { code: 0x31 },
+ '*': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '\u2013': { code: 0x38, altGr: true }, // – EN DASH
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Persian (Farsi)
+ 'ir': {
+ name: 'Persian (Farsi)',
+ map: {
+ '\u06f1': { code: 0x1e }, // ۱ EXTENDED ARABIC-INDIC DIGIT ONE
+ '!': { code: 0x1e, shift: true },
+ '`': { code: 0x1e, altGr: true },
+ '\u06f2': { code: 0x1f }, // ۲ EXTENDED ARABIC-INDIC DIGIT TWO
+ '\u066c': { code: 0x1f, shift: true }, // ٬ ARABIC THOUSANDS SEPARATOR
+ '@': { code: 0x1f, altGr: true },
+ '\u06f3': { code: 0x20 }, // ۳ EXTENDED ARABIC-INDIC DIGIT THREE
+ '\u066b': { code: 0x20, shift: true }, // ٫ ARABIC DECIMAL SEPARATOR
+ '#': { code: 0x20, altGr: true },
+ '\u06f4': { code: 0x21 }, // ۴ EXTENDED ARABIC-INDIC DIGIT FOUR
+ '\ufdfc': { code: 0x21, shift: true }, // ﷼ RIAL SIGN
+ '$': { code: 0x21, altGr: true },
+ '\u06f5': { code: 0x22 }, // ۵ EXTENDED ARABIC-INDIC DIGIT FIVE
+ '\u066a': { code: 0x22, shift: true }, // ٪ ARABIC PERCENT SIGN
+ '%': { code: 0x22, altGr: true },
+ '\u06f6': { code: 0x23 }, // ۶ EXTENDED ARABIC-INDIC DIGIT SIX
+ '\u00d7': { code: 0x23, shift: true }, // × MULTIPLICATION SIGN
+ '^': { code: 0x23, altGr: true },
+ '\u06f7': { code: 0x24 }, // ۷ EXTENDED ARABIC-INDIC DIGIT SEVEN
+ '\u060c': { code: 0x24, shift: true }, // ، ARABIC COMMA
+ '&': { code: 0x24, altGr: true },
+ '\u06f8': { code: 0x25 }, // ۸ EXTENDED ARABIC-INDIC DIGIT EIGHT
+ '*': { code: 0x25, shift: true },
+ '\u2022': { code: 0x25, altGr: true }, // • BULLET
+ '\u06f9': { code: 0x26 }, // ۹ EXTENDED ARABIC-INDIC DIGIT NINE
+ ')': { code: 0x26, shift: true },
+ '\u200e': { code: 0x26, altGr: true }, // LEFT-TO-RIGHT MARK
+ '\u06f0': { code: 0x27 }, // ۰ EXTENDED ARABIC-INDIC DIGIT ZERO
+ '(': { code: 0x27, shift: true },
+ '\u200f': { code: 0x27, altGr: true }, // RIGHT-TO-LEFT MARK
+ '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD
+ '\u0652': { code: 0x14, shift: true }, // ْ ARABIC SUKUN
+ '\u00b0': { code: 0x14, altGr: true }, // ° DEGREE SIGN
+ '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD
+ '\u064c': { code: 0x1a, shift: true }, // ٌ ARABIC DAMMATAN
+ '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH
+ '\u064d': { code: 0x08, shift: true }, // ٍ ARABIC KASRATAN
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF
+ '\u064b': { code: 0x15, shift: true }, // ً ARABIC FATHATAN
+ '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH
+ '\u064f': { code: 0x17, shift: true }, // ُ ARABIC DAMMA
+ '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN
+ '\u0650': { code: 0x1c, shift: true }, // ِ ARABIC KASRA
+ '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN
+ '\u064e': { code: 0x18, shift: true }, // َ ARABIC FATHA
+ '\u0651': { code: 0x0c, shift: true }, // ّ ARABIC SHADDA
+ '\u202d': { code: 0x0c, altGr: true }, // LEFT-TO-RIGHT OVERRIDE
+ '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH
+ ']': { code: 0x12, shift: true },
+ '\u202e': { code: 0x12, altGr: true }, // RIGHT-TO-LEFT OVERRIDE
+ '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH
+ '[': { code: 0x13, shift: true },
+ '\u202c': { code: 0x13, altGr: true }, // POP DIRECTIONAL FORMATTING
+ '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM
+ '}': { code: 0x2f, shift: true },
+ '\u202a': { code: 0x2f, altGr: true }, // LEFT-TO-RIGHT EMBEDDING
+ '\u0686': { code: 0x30 }, // چ ARABIC LETTER TCHEH
+ '{': { code: 0x30, shift: true },
+ '\u202b': { code: 0x30, altGr: true }, // RIGHT-TO-LEFT EMBEDDING
+ '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN
+ '\u0624': { code: 0x04, shift: true }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE
+ '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN
+ '\u0626': { code: 0x16, shift: true }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE
+ '\u06cc': { code: 0x07 }, // ی ARABIC LETTER FARSI YEH
+ '\u064a': { code: 0x07, shift: true }, // ي ARABIC LETTER YEH
+ '\u0649': { code: 0x07, altGr: true }, // ى ARABIC LETTER ALEF MAKSURA
+ '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH
+ '\u0625': { code: 0x09, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW
+ '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM
+ '\u0623': { code: 0x0a, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE
+ '\u06c0': { code: 0x0a, altGr: true }, // ۀ ARABIC LETTER HEH WITH YEH ABOVE
+ '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF
+ '\u0622': { code: 0x0b, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE
+ '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA
+ '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH
+ '\u0629': { code: 0x0d, shift: true }, // ة ARABIC LETTER TEH MARBUTA
+ '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON
+ '\u00bb': { code: 0x0e, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\ufd3e': { code: 0x0e, altGr: true }, // ﴾ ORNATE LEFT PARENTHESIS
+ '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM
+ '\u00ab': { code: 0x0f, shift: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\ufd3f': { code: 0x0f, altGr: true }, // ﴿ ORNATE RIGHT PARENTHESIS
+ '\u06a9': { code: 0x33 }, // ک ARABIC LETTER KEHEH
+ ':': { code: 0x33, shift: true },
+ ';': { code: 0x33, altGr: true },
+ '\u06af': { code: 0x34 }, // گ ARABIC LETTER GAF
+ '\u061b': { code: 0x34, shift: true }, // ؛ ARABIC SEMICOLON
+ '"': { code: 0x34, altGr: true },
+ '\u0638': { code: 0x1d }, // ظ ARABIC LETTER ZAH
+ '\u0643': { code: 0x1d, shift: true }, // ك ARABIC LETTER KAF
+ '\u0637': { code: 0x1b }, // ط ARABIC LETTER TAH
+ '\u0653': { code: 0x1b, shift: true }, // ٓ ARABIC MADDAH ABOVE
+ '\u0632': { code: 0x06 }, // ز ARABIC LETTER ZAIN
+ '\u0698': { code: 0x06, shift: true }, // ژ ARABIC LETTER JEH
+ '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH
+ '\u0670': { code: 0x19, shift: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF
+ '\u0656': { code: 0x19, altGr: true }, // ٖ ARABIC SUBSCRIPT ALEF
+ '\u0630': { code: 0x05 }, // ذ ARABIC LETTER THAL
+ '\u200c': { code: 0x05, shift: true }, // ZERO WIDTH NON-JOINER
+ '\u200d': { code: 0x05, altGr: true }, // ZERO WIDTH JOINER
+ '\u062f': { code: 0x11 }, // د ARABIC LETTER DAL
+ '\u0654': { code: 0x11, shift: true }, // ٔ ARABIC HAMZA ABOVE
+ '\u0655': { code: 0x11, altGr: true }, // ٕ ARABIC HAMZA BELOW
+ '\u067e': { code: 0x10 }, // پ ARABIC LETTER PEH
+ '\u0621': { code: 0x10, shift: true }, // ء ARABIC LETTER HAMZA
+ '\u2026': { code: 0x10, altGr: true }, // … HORIZONTAL ELLIPSIS
+ '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW
+ '>': { code: 0x36, shift: true },
+ ',': { code: 0x36, altGr: true },
+ '.': { code: 0x37 },
+ '<': { code: 0x37, shift: true },
+ '\'': { code: 0x37, altGr: true },
+ '/': { code: 0x38 },
+ '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK
+ '?': { code: 0x38, altGr: true },
+ '\u00f7': { code: 0x35, shift: true }, // ÷ DIVISION SIGN
+ '~': { code: 0x35, altGr: true },
+ '-': { code: 0x2d },
+ '\u0640': { code: 0x2d, shift: true }, // ـ ARABIC TATWEEL
+ '_': { code: 0x2d, altGr: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2212': { code: 0x2e, altGr: true }, // − MINUS SIGN
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u2010': { code: 0x31, altGr: true }, // ‐ HYPHEN
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Polish
+ 'pl': {
+ name: 'Polish',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u2260': { code: 0x1e, altGr: true }, // ≠ NOT EQUAL TO
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00a2': { code: 0x21, altGr: true }, // ¢ CENT SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u00bd': { code: 0x23, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u00a7': { code: 0x24, altGr: true }, // § SECTION SIGN
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u00b7': { code: 0x25, altGr: true }, // · MIDDLE DOT
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '\u00ab': { code: 0x26, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u00bb': { code: 0x27, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u2013': { code: 0x2d, altGr: true }, // – EN DASH
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u03c0': { code: 0x14, altGr: true }, // π GREEK SMALL LETTER PI
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u0153': { code: 0x1a, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u0119': { code: 0x08, altGr: true }, // ę LATIN SMALL LETTER E WITH OGONEK
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00a9': { code: 0x15, altGr: true }, // © COPYRIGHT SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00df': { code: 0x17, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f3': { code: 0x12, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u0105': { code: 0x04, altGr: true }, // ą LATIN SMALL LETTER A WITH OGONEK
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u015b': { code: 0x16, altGr: true }, // ś LATIN SMALL LETTER S WITH ACUTE
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u00e6': { code: 0x09, altGr: true }, // æ LATIN SMALL LETTER AE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u2019': { code: 0x0b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0259': { code: 0x0d, altGr: true }, // ə LATIN SMALL LETTER SCHWA
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u2026': { code: 0x0e, altGr: true }, // … HORIZONTAL ELLIPSIS
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u017c': { code: 0x1d, altGr: true }, // ż LATIN SMALL LETTER Z WITH DOT ABOVE
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u017a': { code: 0x1b, altGr: true }, // ź LATIN SMALL LETTER Z WITH ACUTE
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u0107': { code: 0x06, altGr: true }, // ć LATIN SMALL LETTER C WITH ACUTE
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u0144': { code: 0x11, altGr: true }, // ń LATIN SMALL LETTER N WITH ACUTE
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u2264': { code: 0x36, altGr: true }, // ≤ LESS-THAN OR EQUAL TO
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u2265': { code: 0x37, altGr: true }, // ≥ GREATER-THAN OR EQUAL TO
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, altGr: true }, // NO-BREAK SPACE
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Portuguese
+ 'pt': {
+ name: 'Portuguese',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00a7': { code: 0x21, altGr: true }, // § SECTION SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '\u00ab': { code: 0x2e }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u00bb': { code: 0x2e, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '+': { code: 0x2f },
+ '*': { code: 0x2f, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00e7': { code: 0x33 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00c7': { code: 0x33, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA
+ '\u00ba': { code: 0x34 }, // º MASCULINE ORDINAL INDICATOR
+ '\u00aa': { code: 0x34, shift: true }, // ª FEMININE ORDINAL INDICATOR
+ '|': { code: 0x35, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Romanian
+ 'ro': {
+ name: 'Romanian',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u00e2': { code: 0x14, altGr: true }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u00df': { code: 0x1a, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u021b': { code: 0x17, altGr: true }, // ț LATIN SMALL LETTER T WITH COMMA BELOW
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u00ee': { code: 0x0c, altGr: true }, // î LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00a7': { code: 0x13, altGr: true }, // § SECTION SIGN
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ '\u201e': { code: 0x2f, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u201d': { code: 0x30, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u0103': { code: 0x04, altGr: true }, // ă LATIN SMALL LETTER A WITH BREVE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0219': { code: 0x16, altGr: true }, // ș LATIN SMALL LETTER S WITH COMMA BELOW
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u0111': { code: 0x07, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Russian
+ 'ru': {
+ name: 'Russian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ ';': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ ':': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '?': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u20bd': { code: 0x25, altGr: true }, // ₽ RUBLE SIGN
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\\': { code: 0x31 },
+ '/': { code: 0x31, shift: true },
+ '.': { code: 0x38 },
+ ',': { code: 0x38, shift: true },
+ '|': { code: 0x64, shift: true },
+ '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO
+ '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO
+ '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA
+ '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN
+ '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+ '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU
+ '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU
+ '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E
+ '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Serbian (Cyrillic)
+ 'rs': {
+ name: 'Serbian (Cyrillic)',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\u0459': { code: 0x14 }, // љ CYRILLIC SMALL LETTER LJE
+ '\u0409': { code: 0x14, shift: true }, // Љ CYRILLIC CAPITAL LETTER LJE
+ '\u045a': { code: 0x1a }, // њ CYRILLIC SMALL LETTER NJE
+ '\u040a': { code: 0x1a, shift: true }, // Њ CYRILLIC CAPITAL LETTER NJE
+ '\u0435': { code: 0x08 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x08, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u0440': { code: 0x15 }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x15, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u0442': { code: 0x17 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x17, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u0437': { code: 0x1c }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x1c, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0443': { code: 0x18 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x18, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u0438': { code: 0x0c }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x0c, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u043e': { code: 0x12 }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x12, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u0448': { code: 0x2f }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x2f, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u0452': { code: 0x30 }, // ђ CYRILLIC SMALL LETTER DJE
+ '\u0402': { code: 0x30, shift: true }, // Ђ CYRILLIC CAPITAL LETTER DJE
+ '\u0441': { code: 0x16 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x16, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u0434': { code: 0x07 }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x07, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0444': { code: 0x09 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x09, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u0433': { code: 0x0a }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x0a, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0436': { code: 0x31 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x31, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u045f': { code: 0x1b }, // џ CYRILLIC SMALL LETTER DZHE
+ '\u040f': { code: 0x1b, shift: true }, // Џ CYRILLIC CAPITAL LETTER DZHE
+ '\u0446': { code: 0x06 }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x06, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0432': { code: 0x19 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x19, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0431': { code: 0x05 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x05, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u043d': { code: 0x11 }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x11, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u043c': { code: 0x10 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x10, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '+': { code: 0x2e },
+ '*': { code: 0x2e, shift: true },
+ '\u043f': { code: 0x13 }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x13, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0430': { code: 0x04 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x04, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u0458': { code: 0x0d }, // ј CYRILLIC SMALL LETTER JE
+ '\u0408': { code: 0x0d, shift: true }, // Ј CYRILLIC CAPITAL LETTER JE
+ '\u043a': { code: 0x0e }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x0e, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0447': { code: 0x33 }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x33, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u045b': { code: 0x34 }, // ћ CYRILLIC SMALL LETTER TSHE
+ '\u040b': { code: 0x34, shift: true }, // Ћ CYRILLIC CAPITAL LETTER TSHE
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Serbian (Latin)
+ 'rs-latin': {
+ name: 'Serbian (Latin)',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '+': { code: 0x2e },
+ '*': { code: 0x2e, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ '|': { code: 0x1a, altGr: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN
+ '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ '[': { code: 0x09, altGr: true },
+ ']': { code: 0x0a, altGr: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN
+ '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ '@': { code: 0x19, altGr: true },
+ '{': { code: 0x05, altGr: true },
+ '}': { code: 0x11, altGr: true },
+ '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Sinhala
+ 'lk': {
+ name: 'Sinhala',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u0d8d': { code: 0x14 }, // ඍ SINHALA LETTER IRUYANNA
+ '\u0d8e': { code: 0x14, shift: true }, // ඎ SINHALA LETTER IRUUYANNA
+ '\u0dd8': { code: 0x14, altGr: true }, // ෘ SINHALA VOWEL SIGN GAETTA-PILLA
+ '\u0d87': { code: 0x1a }, // ඇ SINHALA LETTER AEYANNA
+ '\u0d88': { code: 0x1a, shift: true }, // ඈ SINHALA LETTER AEEYANNA
+ '\u0dd0': { code: 0x1a, altGr: true }, // ැ SINHALA VOWEL SIGN KETTI AEDA-PILLA
+ '\u0d91': { code: 0x08 }, // එ SINHALA LETTER EYANNA
+ '\u0d92': { code: 0x08, shift: true }, // ඒ SINHALA LETTER EEYANNA
+ '\u0dd9': { code: 0x08, altGr: true }, // ෙ SINHALA VOWEL SIGN KOMBUVA
+ '\u0dbb': { code: 0x15 }, // ර SINHALA LETTER RAYANNA
+ '\u0dca': { code: 0x15, shift: true }, // ් SINHALA SIGN AL-LAKUNA
+ '\u0dad': { code: 0x17 }, // ත SINHALA LETTER ALPAPRAANA TAYANNA
+ '\u0dae': { code: 0x17, shift: true }, // ථ SINHALA LETTER MAHAAPRAANA TAYANNA
+ '\u0da7': { code: 0x17, altGr: true }, // ට SINHALA LETTER ALPAPRAANA TTAYANNA
+ '\u0dba': { code: 0x1c }, // ය SINHALA LETTER YAYANNA
+ '\u0d8b': { code: 0x18 }, // උ SINHALA LETTER UYANNA
+ '\u0d8c': { code: 0x18, shift: true }, // ඌ SINHALA LETTER UUYANNA
+ '\u0dd4': { code: 0x18, altGr: true }, // ු SINHALA VOWEL SIGN KETTI PAA-PILLA
+ '\u0d89': { code: 0x0c }, // ඉ SINHALA LETTER IYANNA
+ '\u0d8a': { code: 0x0c, shift: true }, // ඊ SINHALA LETTER IIYANNA
+ '\u0dd2': { code: 0x0c, altGr: true }, // ි SINHALA VOWEL SIGN KETTI IS-PILLA
+ '\u0d94': { code: 0x12 }, // ඔ SINHALA LETTER OYANNA
+ '\u0d95': { code: 0x12, shift: true }, // ඕ SINHALA LETTER OOYANNA
+ '\u0ddc': { code: 0x12, altGr: true }, // ො SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+ '\u0db4': { code: 0x13 }, // ප SINHALA LETTER ALPAPRAANA PAYANNA
+ '\u0db5': { code: 0x13, shift: true }, // ඵ SINHALA LETTER MAHAAPRAANA PAYANNA
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u0d85': { code: 0x04 }, // අ SINHALA LETTER AYANNA
+ '\u0d86': { code: 0x04, shift: true }, // ආ SINHALA LETTER AAYANNA
+ '\u0dc3': { code: 0x16 }, // ස SINHALA LETTER DANTAJA SAYANNA
+ '\u0dc1': { code: 0x16, shift: true }, // ශ SINHALA LETTER TAALUJA SAYANNA
+ '\u0dc2': { code: 0x16, altGr: true }, // ෂ SINHALA LETTER MUURDHAJA SAYANNA
+ '\u0daf': { code: 0x07 }, // ද SINHALA LETTER ALPAPRAANA DAYANNA
+ '\u0db0': { code: 0x07, shift: true }, // ධ SINHALA LETTER MAHAAPRAANA DAYANNA
+ '\u0da9': { code: 0x07, altGr: true }, // ඩ SINHALA LETTER ALPAPRAANA DDAYANNA
+ '\u0dc6': { code: 0x09 }, // ෆ SINHALA LETTER FAYANNA
+ '\u0ddb': { code: 0x09, altGr: true }, // ෛ SINHALA VOWEL SIGN KOMBU DEKA
+ '\u0d9c': { code: 0x0a }, // ග SINHALA LETTER ALPAPRAANA GAYANNA
+ '\u0d9d': { code: 0x0a, shift: true }, // ඝ SINHALA LETTER MAHAAPRAANA GAYANNA
+ '\u0d9f': { code: 0x0a, altGr: true }, // ඟ SINHALA LETTER SANYAKA GAYANNA
+ '\u0dc4': { code: 0x0b }, // හ SINHALA LETTER HAYANNA
+ '\u0d83': { code: 0x0b, shift: true }, // ඃ SINHALA SIGN VISARGAYA
+ '\u0dde': { code: 0x0b, altGr: true }, // ෞ SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+ '\u0da2': { code: 0x0d }, // ජ SINHALA LETTER ALPAPRAANA JAYANNA
+ '\u0da3': { code: 0x0d, shift: true }, // ඣ SINHALA LETTER MAHAAPRAANA JAYANNA
+ '\u0da6': { code: 0x0d, altGr: true }, // ඦ SINHALA LETTER SANYAKA JAYANNA
+ '\u0d9a': { code: 0x0e }, // ක SINHALA LETTER ALPAPRAANA KAYANNA
+ '\u0d9b': { code: 0x0e, shift: true }, // ඛ SINHALA LETTER MAHAAPRAANA KAYANNA
+ '\u0d8f': { code: 0x0e, altGr: true }, // ඏ SINHALA LETTER ILUYANNA
+ '\u0dbd': { code: 0x0f }, // ල SINHALA LETTER DANTAJA LAYANNA
+ '\u0dc5': { code: 0x0f, shift: true }, // ළ SINHALA LETTER MUURDHAJA LAYANNA
+ '\u0ddf': { code: 0x0f, altGr: true }, // ෟ SINHALA VOWEL SIGN GAYANUKITTA
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u0da4': { code: 0x1d }, // ඤ SINHALA LETTER TAALUJA NAASIKYAYA
+ '\u0da5': { code: 0x1d, shift: true }, // ඥ SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+ '\u0db3': { code: 0x1b }, // ඳ SINHALA LETTER SANYAKA DAYANNA
+ '\u0dac': { code: 0x1b, shift: true }, // ඬ SINHALA LETTER SANYAKA DDAYANNA
+ '\u0da0': { code: 0x06 }, // ච SINHALA LETTER ALPAPRAANA CAYANNA
+ '\u0da1': { code: 0x06, shift: true }, // ඡ SINHALA LETTER MAHAAPRAANA CAYANNA
+ '\u0dc0': { code: 0x19 }, // ව SINHALA LETTER VAYANNA
+ '\u0db6': { code: 0x05 }, // බ SINHALA LETTER ALPAPRAANA BAYANNA
+ '\u0db7': { code: 0x05, shift: true }, // භ SINHALA LETTER MAHAAPRAANA BAYANNA
+ '\u0db1': { code: 0x11 }, // න SINHALA LETTER DANTAJA NAYANNA
+ '\u0dab': { code: 0x11, shift: true }, // ණ SINHALA LETTER MUURDHAJA NAYANNA
+ '\u0d82': { code: 0x11, altGr: true }, // ං SINHALA SIGN ANUSVARAYA
+ '\u0db8': { code: 0x10 }, // ම SINHALA LETTER MAYANNA
+ '\u0db9': { code: 0x10, shift: true }, // ඹ SINHALA LETTER AMBA BAYANNA
+ '\u0df4': { code: 0x37, altGr: true }, // ෴ SINHALA PUNCTUATION KUNDDALIYA
+ '\u200d': { code: 0x38, altGr: true }, // ZERO WIDTH JOINER
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, shift: true }, // NO-BREAK SPACE
+ '\u200c': { code: 0x2c, altGr: true }, // ZERO WIDTH NON-JOINER
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Slovak
+ 'sk': {
+ name: 'Slovak',
+ map: {
+ '+': { code: 0x1e },
+ '1': { code: 0x1e, shift: true },
+ '!': { code: 0x1e, altGr: true },
+ '\u013e': { code: 0x1f }, // ľ LATIN SMALL LETTER L WITH CARON
+ '2': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '\u0161': { code: 0x20 }, // š LATIN SMALL LETTER S WITH CARON
+ '3': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '\u010d': { code: 0x21 }, // č LATIN SMALL LETTER C WITH CARON
+ '4': { code: 0x21, shift: true },
+ '$': { code: 0x21, altGr: true },
+ '\u0165': { code: 0x22 }, // ť LATIN SMALL LETTER T WITH CARON
+ '5': { code: 0x22, shift: true },
+ '%': { code: 0x22, altGr: true },
+ '\u017e': { code: 0x23 }, // ž LATIN SMALL LETTER Z WITH CARON
+ '6': { code: 0x23, shift: true },
+ '^': { code: 0x23, altGr: true },
+ '\u00fd': { code: 0x24 }, // ý LATIN SMALL LETTER Y WITH ACUTE
+ '7': { code: 0x24, shift: true },
+ '&': { code: 0x24, altGr: true },
+ '\u00e1': { code: 0x25 }, // á LATIN SMALL LETTER A WITH ACUTE
+ '8': { code: 0x25, shift: true },
+ '*': { code: 0x25, altGr: true },
+ '\u00ed': { code: 0x26 }, // í LATIN SMALL LETTER I WITH ACUTE
+ '9': { code: 0x26, shift: true },
+ '{': { code: 0x26, altGr: true },
+ '\u00e9': { code: 0x27 }, // é LATIN SMALL LETTER E WITH ACUTE
+ '0': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '=': { code: 0x2d },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '|': { code: 0x1a, altGr: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fa': { code: 0x2f }, // ú LATIN SMALL LETTER U WITH ACUTE
+ '/': { code: 0x2f, shift: true },
+ '[': { code: 0x2f, altGr: true },
+ '\u00e4': { code: 0x30 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '(': { code: 0x30, shift: true },
+ ']': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '~': { code: 0x04, altGr: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '`': { code: 0x0b, altGr: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\'': { code: 0x0d, altGr: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0141': { code: 0x0f, altGr: true }, // Ł LATIN CAPITAL LETTER L WITH STROKE
+ '\u00f4': { code: 0x33 }, // ô LATIN SMALL LETTER O WITH CIRCUMFLEX
+ '"': { code: 0x33, shift: true },
+ '\u00a7': { code: 0x34 }, // § SECTION SIGN
+ ';': { code: 0x35 },
+ '\u0148': { code: 0x31 }, // ň LATIN SMALL LETTER N WITH CARON
+ ')': { code: 0x31, shift: true },
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ '\u00b0': { code: 0x1d, altGr: true }, // ° DEGREE SIGN
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '?': { code: 0x36, shift: true },
+ '<': { code: 0x36, altGr: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '>': { code: 0x37, altGr: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\u00a0': { code: 0x2c, altGr: true }, // NO-BREAK SPACE
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Slovenian
+ 'si': {
+ name: 'Slovenian',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '+': { code: 0x2e },
+ '*': { code: 0x2e, shift: true },
+ '\\': { code: 0x14, altGr: true },
+ '|': { code: 0x1a, altGr: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN
+ '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ '[': { code: 0x09, altGr: true },
+ ']': { code: 0x0a, altGr: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN
+ '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ '@': { code: 0x19, altGr: true },
+ '{': { code: 0x05, altGr: true },
+ '}': { code: 0x11, altGr: true },
+ '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Spanish
+ 'es': {
+ name: 'Spanish',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '|': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '\u00b7': { code: 0x20, shift: true }, // · MIDDLE DOT
+ '#': { code: 0x20, altGr: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '~': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '\u00a1': { code: 0x2e }, // ¡ INVERTED EXCLAMATION MARK
+ '\u00bf': { code: 0x2e, shift: true }, // ¿ INVERTED QUESTION MARK
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '+': { code: 0x30 },
+ '*': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f1': { code: 0x33 }, // ñ LATIN SMALL LETTER N WITH TILDE
+ '\u00d1': { code: 0x33, shift: true }, // Ñ LATIN CAPITAL LETTER N WITH TILDE
+ '\u00ba': { code: 0x35 }, // º MASCULINE ORDINAL INDICATOR
+ '\u00aa': { code: 0x35, shift: true }, // ª FEMININE ORDINAL INDICATOR
+ '\u00e7': { code: 0x31 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00c7': { code: 0x31, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '\u2022': { code: 0x36, altGr: true }, // • BULLET
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Swedish
+ 'se': {
+ name: 'Swedish',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN
+ '4': { code: 0x21 },
+ '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN
+ '$': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '+': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '\u00b1': { code: 0x2e, altGr: true }, // ± PLUS-MINUS SIGN
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u03c9': { code: 0x14, altGr: true }, // ω GREEK SMALL LETTER OMEGA
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u03c3': { code: 0x1a, altGr: true }, // σ GREEK SMALL LETTER SIGMA
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u03c0': { code: 0x13, altGr: true }, // π GREEK SMALL LETTER PI
+ '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE
+ '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u00f8': { code: 0x33, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS
+ '\u00e6': { code: 0x34, altGr: true }, // æ LATIN SMALL LETTER AE
+ '\u00a7': { code: 0x35 }, // § SECTION SIGN
+ '\u00bd': { code: 0x35, shift: true }, // ½ VULGAR FRACTION ONE HALF
+ '\u00b6': { code: 0x35, altGr: true }, // ¶ PILCROW SIGN
+ '\'': { code: 0x31 },
+ '*': { code: 0x31, shift: true },
+ '\u00b4': { code: 0x31, altGr: true }, // ´ ACUTE ACCENT
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '|': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Swiss French
+ 'ch-fr': {
+ name: 'Swiss French',
+ map: {
+ '1': { code: 0x1e },
+ '+': { code: 0x1e, shift: true },
+ '|': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '*': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '4': { code: 0x21 },
+ '\u00e7': { code: 0x21, shift: true }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '\u00a2': { code: 0x25, altGr: true }, // ¢ CENT SIGN
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00e8': { code: 0x2f }, // è LATIN SMALL LETTER E WITH GRAVE
+ '\u00fc': { code: 0x2f, shift: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '[': { code: 0x2f, altGr: true },
+ '!': { code: 0x30, shift: true },
+ ']': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00e9': { code: 0x33 }, // é LATIN SMALL LETTER E WITH ACUTE
+ '\u00f6': { code: 0x33, shift: true }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00e0': { code: 0x34 }, // à LATIN SMALL LETTER A WITH GRAVE
+ '\u00e4': { code: 0x34, shift: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '{': { code: 0x34, altGr: true },
+ '\u00a7': { code: 0x35 }, // § SECTION SIGN
+ '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN
+ '$': { code: 0x31 },
+ '\u00a3': { code: 0x31, shift: true }, // £ POUND SIGN
+ '}': { code: 0x31, altGr: true },
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '\\': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Swiss German
+ 'ch': {
+ name: 'Swiss German',
+ map: {
+ '1': { code: 0x1e },
+ '+': { code: 0x1e, shift: true },
+ '|': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '@': { code: 0x1f, altGr: true },
+ '3': { code: 0x20 },
+ '*': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '4': { code: 0x21 },
+ '\u00e7': { code: 0x21, shift: true }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '\u00a2': { code: 0x25, altGr: true }, // ¢ CENT SIGN
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '\'': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE
+ 'z': { code: 0x1c },
+ 'Z': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00e8': { code: 0x2f, shift: true }, // è LATIN SMALL LETTER E WITH GRAVE
+ '[': { code: 0x2f, altGr: true },
+ '!': { code: 0x30, shift: true },
+ ']': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00e9': { code: 0x33, shift: true }, // é LATIN SMALL LETTER E WITH ACUTE
+ '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ '\u00e0': { code: 0x34, shift: true }, // à LATIN SMALL LETTER A WITH GRAVE
+ '{': { code: 0x34, altGr: true },
+ '\u00a7': { code: 0x35 }, // § SECTION SIGN
+ '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN
+ '$': { code: 0x31 },
+ '\u00a3': { code: 0x31, shift: true }, // £ POUND SIGN
+ '}': { code: 0x31, altGr: true },
+ 'y': { code: 0x1d },
+ 'Y': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ ';': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ ':': { code: 0x37, shift: true },
+ '-': { code: 0x38 },
+ '_': { code: 0x38, shift: true },
+ '<': { code: 0x64 },
+ '>': { code: 0x64, shift: true },
+ '\\': { code: 0x64, altGr: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Syriac
+ 'sy': {
+ name: 'Syriac',
+ map: {
+ '\u0630': { code: 0x35 }, // ذ ARABIC LETTER THAL
+ '\u0651': { code: 0x35, shift: true }, // ّ ARABIC SHADDA
+ '\u066a': { code: 0x35, altGr: true }, // ٪ ARABIC PERCENT SIGN
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u0661': { code: 0x1e, altGr: true }, // ١ ARABIC-INDIC DIGIT ONE
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u0662': { code: 0x1f, altGr: true }, // ٢ ARABIC-INDIC DIGIT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u0663': { code: 0x20, altGr: true }, // ٣ ARABIC-INDIC DIGIT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u0664': { code: 0x21, altGr: true }, // ٤ ARABIC-INDIC DIGIT FOUR
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u0665': { code: 0x22, altGr: true }, // ٥ ARABIC-INDIC DIGIT FIVE
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u0666': { code: 0x23, altGr: true }, // ٦ ARABIC-INDIC DIGIT SIX
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u0667': { code: 0x24, altGr: true }, // ٧ ARABIC-INDIC DIGIT SEVEN
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u0668': { code: 0x25, altGr: true }, // ٨ ARABIC-INDIC DIGIT EIGHT
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '\u0669': { code: 0x26, altGr: true }, // ٩ ARABIC-INDIC DIGIT NINE
+ '0': { code: 0x27 },
+ '(': { code: 0x27, shift: true },
+ '\u0660': { code: 0x27, altGr: true }, // ٠ ARABIC-INDIC DIGIT ZERO
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u2013': { code: 0x2d, altGr: true }, // – EN DASH
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO
+ '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD
+ '\u064e': { code: 0x14, shift: true }, // َ ARABIC FATHA
+ '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD
+ '\u064b': { code: 0x1a, shift: true }, // ً ARABIC FATHATAN
+ '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH
+ '\u064f': { code: 0x08, shift: true }, // ُ ARABIC DAMMA
+ '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF
+ '\u064c': { code: 0x15, shift: true }, // ٌ ARABIC DAMMATAN
+ '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH
+ '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+ '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH
+ '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN
+ '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW
+ '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN
+ '`': { code: 0x18, shift: true },
+ '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH
+ '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN
+ '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH
+ '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN
+ '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH
+ '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON
+ '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM
+ '<': { code: 0x2f, shift: true },
+ '\u0686': { code: 0x2f, altGr: true }, // چ ARABIC LETTER TCHEH
+ '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL
+ '>': { code: 0x30, shift: true },
+ '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN
+ '\u0650': { code: 0x04, shift: true }, // ِ ARABIC KASRA
+ '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN
+ '\u064d': { code: 0x16, shift: true }, // ٍ ARABIC KASRATAN
+ '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH
+ ']': { code: 0x07, shift: true },
+ '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH
+ '[': { code: 0x09, shift: true },
+ '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH
+ '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM
+ '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+ '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF
+ '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE
+ '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA
+ '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH
+ '\u0640': { code: 0x0d, shift: true }, // ـ ARABIC TATWEEL
+ '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON
+ '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA
+ '\u066b': { code: 0x0e, altGr: true }, // ٫ ARABIC DECIMAL SEPARATOR
+ '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM
+ '/': { code: 0x0f, shift: true },
+ '\u0643': { code: 0x33 }, // ك ARABIC LETTER KAF
+ ':': { code: 0x33, shift: true },
+ '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF
+ '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH
+ '"': { code: 0x34, shift: true },
+ '\u27e9': { code: 0x34, altGr: true }, // ⟩ MATHEMATICAL RIGHT ANGLE BRACKET
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u27e8': { code: 0x31, altGr: true }, // ⟨ MATHEMATICAL LEFT ANGLE BRACKET
+ '\u2026': { code: 0x64, shift: true }, // … HORIZONTAL ELLIPSIS
+ '\u00a6': { code: 0x64, altGr: true }, // ¦ BROKEN BAR
+ '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE
+ '~': { code: 0x1d, shift: true },
+ '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA
+ '\u0652': { code: 0x1b, shift: true }, // ْ ARABIC SUKUN
+ '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE
+ '}': { code: 0x06, shift: true },
+ '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH
+ '{': { code: 0x19, shift: true },
+ '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+ '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA
+ '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE
+ '\u0670': { code: 0x11, altGr: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF
+ '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA
+ '\'': { code: 0x10, shift: true },
+ '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW
+ ',': { code: 0x36, shift: true },
+ '\u066c': { code: 0x36, altGr: true }, // ٬ ARABIC THOUSANDS SEPARATOR
+ '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN
+ '.': { code: 0x37, shift: true },
+ '\u0698': { code: 0x37, altGr: true }, // ژ ARABIC LETTER JEH
+ '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH
+ '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK
+ '\u066d': { code: 0x38, altGr: true }, // ٭ ARABIC FIVE POINTED STAR
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Tajik
+ 'tj': {
+ name: 'Tajik',
+ map: {
+ '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO
+ '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a7': { code: 0x1e, altGr: true }, // § SECTION SIGN
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '\u00ab': { code: 0x1f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ ';': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ ':': { code: 0x23, shift: true },
+ '\u2013': { code: 0x23, altGr: true }, // – EN DASH
+ '7': { code: 0x24 },
+ '?': { code: 0x24, shift: true },
+ '&': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u00b0': { code: 0x27, altGr: true }, // ° DEGREE SIGN
+ '\u0493': { code: 0x2d }, // ғ CYRILLIC SMALL LETTER GHE WITH STROKE
+ '\u0492': { code: 0x2d, shift: true }, // Ғ CYRILLIC CAPITAL LETTER GHE WITH STROKE
+ '-': { code: 0x2d, altGr: true },
+ '\u04ef': { code: 0x2e }, // ӯ CYRILLIC SMALL LETTER U WITH MACRON
+ '\u04ee': { code: 0x2e, shift: true }, // Ӯ CYRILLIC CAPITAL LETTER U WITH MACRON
+ '=': { code: 0x2e, altGr: true },
+ '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u049b': { code: 0x1a }, // қ CYRILLIC SMALL LETTER KA WITH DESCENDER
+ '\u049a': { code: 0x1a, shift: true }, // Қ CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u04b3': { code: 0x12 }, // ҳ CYRILLIC SMALL LETTER HA WITH DESCENDER
+ '\u04b2': { code: 0x12, shift: true }, // Ҳ CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN
+ '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+ '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u04b7': { code: 0x16 }, // ҷ CYRILLIC SMALL LETTER CHE WITH DESCENDER
+ '\u04b6': { code: 0x16, shift: true }, // Ҷ CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+ '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E
+ '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E
+ '\\': { code: 0x31 },
+ '/': { code: 0x31, shift: true },
+ '|': { code: 0x64, shift: true },
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u04e3': { code: 0x10 }, // ӣ CYRILLIC SMALL LETTER I WITH MACRON
+ '\u04e2': { code: 0x10, shift: true }, // Ӣ CYRILLIC CAPITAL LETTER I WITH MACRON
+ '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ '.': { code: 0x38 },
+ ',': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Thai
+ 'th': {
+ name: 'Thai',
+ map: {
+ '_': { code: 0x35 },
+ '%': { code: 0x35, shift: true },
+ '\u0e45': { code: 0x1e }, // ๅ THAI CHARACTER LAKKHANGYAO
+ '+': { code: 0x1e, shift: true },
+ '/': { code: 0x1f },
+ '\u0e51': { code: 0x1f, shift: true }, // ๑ THAI DIGIT ONE
+ '-': { code: 0x20 },
+ '\u0e52': { code: 0x20, shift: true }, // ๒ THAI DIGIT TWO
+ '\u0e20': { code: 0x21 }, // ภ THAI CHARACTER PHO SAMPHAO
+ '\u0e53': { code: 0x21, shift: true }, // ๓ THAI DIGIT THREE
+ '\u0e16': { code: 0x22 }, // ถ THAI CHARACTER THO THUNG
+ '\u0e54': { code: 0x22, shift: true }, // ๔ THAI DIGIT FOUR
+ '\u0e38': { code: 0x23 }, // ุ THAI CHARACTER SARA U
+ '\u0e39': { code: 0x23, shift: true }, // ู THAI CHARACTER SARA UU
+ '\u0e36': { code: 0x24 }, // ึ THAI CHARACTER SARA UE
+ '\u0e3f': { code: 0x24, shift: true }, // ฿ THAI CURRENCY SYMBOL BAHT
+ '\u0e04': { code: 0x25 }, // ค THAI CHARACTER KHO KHWAI
+ '\u0e55': { code: 0x25, shift: true }, // ๕ THAI DIGIT FIVE
+ '\u0e15': { code: 0x26 }, // ต THAI CHARACTER TO TAO
+ '\u0e56': { code: 0x26, shift: true }, // ๖ THAI DIGIT SIX
+ '\u0e08': { code: 0x27 }, // จ THAI CHARACTER CHO CHAN
+ '\u0e57': { code: 0x27, shift: true }, // ๗ THAI DIGIT SEVEN
+ '\u0e02': { code: 0x2d }, // ข THAI CHARACTER KHO KHAI
+ '\u0e58': { code: 0x2d, shift: true }, // ๘ THAI DIGIT EIGHT
+ '\u0e0a': { code: 0x2e }, // ช THAI CHARACTER CHO CHANG
+ '\u0e59': { code: 0x2e, shift: true }, // ๙ THAI DIGIT NINE
+ '\u0e46': { code: 0x14 }, // ๆ THAI CHARACTER MAIYAMOK
+ '\u0e50': { code: 0x14, shift: true }, // ๐ THAI DIGIT ZERO
+ '\u0e44': { code: 0x1a }, // ไ THAI CHARACTER SARA AI MAIMALAI
+ '"': { code: 0x1a, shift: true },
+ '\u0e33': { code: 0x08 }, // ำ THAI CHARACTER SARA AM
+ '\u0e0e': { code: 0x08, shift: true }, // ฎ THAI CHARACTER DO CHADA
+ '\u0e1e': { code: 0x15 }, // พ THAI CHARACTER PHO PHAN
+ '\u0e11': { code: 0x15, shift: true }, // ฑ THAI CHARACTER THO NANGMONTHO
+ '\u0e30': { code: 0x17 }, // ะ THAI CHARACTER SARA A
+ '\u0e18': { code: 0x17, shift: true }, // ธ THAI CHARACTER THO THONG
+ '\u0e31': { code: 0x1c }, // ั THAI CHARACTER MAI HAN-AKAT
+ '\u0e4d': { code: 0x1c, shift: true }, // ํ THAI CHARACTER NIKHAHIT
+ '\u0e35': { code: 0x18 }, // ี THAI CHARACTER SARA II
+ '\u0e4a': { code: 0x18, shift: true }, // ๊ THAI CHARACTER MAI TRI
+ '\u0e23': { code: 0x0c }, // ร THAI CHARACTER RO RUA
+ '\u0e13': { code: 0x0c, shift: true }, // ณ THAI CHARACTER NO NEN
+ '\u0e19': { code: 0x12 }, // น THAI CHARACTER NO NU
+ '\u0e2f': { code: 0x12, shift: true }, // ฯ THAI CHARACTER PAIYANNOI
+ '\u0e22': { code: 0x13 }, // ย THAI CHARACTER YO YAK
+ '\u0e0d': { code: 0x13, shift: true }, // ญ THAI CHARACTER YO YING
+ '\u0e1a': { code: 0x2f }, // บ THAI CHARACTER BO BAIMAI
+ '\u0e10': { code: 0x2f, shift: true }, // ฐ THAI CHARACTER THO THAN
+ '\u0e25': { code: 0x30 }, // ล THAI CHARACTER LO LING
+ ',': { code: 0x30, shift: true },
+ '\u0e1f': { code: 0x04 }, // ฟ THAI CHARACTER FO FAN
+ '\u0e24': { code: 0x04, shift: true }, // ฤ THAI CHARACTER RU
+ '\u0e2b': { code: 0x16 }, // ห THAI CHARACTER HO HIP
+ '\u0e06': { code: 0x16, shift: true }, // ฆ THAI CHARACTER KHO RAKHANG
+ '\u0e01': { code: 0x07 }, // ก THAI CHARACTER KO KAI
+ '\u0e0f': { code: 0x07, shift: true }, // ฏ THAI CHARACTER TO PATAK
+ '\u0e14': { code: 0x09 }, // ด THAI CHARACTER DO DEK
+ '\u0e42': { code: 0x09, shift: true }, // โ THAI CHARACTER SARA O
+ '\u0e40': { code: 0x0a }, // เ THAI CHARACTER SARA E
+ '\u0e0c': { code: 0x0a, shift: true }, // ฌ THAI CHARACTER CHO CHOE
+ '\u0e49': { code: 0x0b }, // ้ THAI CHARACTER MAI THO
+ '\u0e47': { code: 0x0b, shift: true }, // ็ THAI CHARACTER MAITAIKHU
+ '\u0e48': { code: 0x0d }, // ่ THAI CHARACTER MAI EK
+ '\u0e4b': { code: 0x0d, shift: true }, // ๋ THAI CHARACTER MAI CHATTAWA
+ '\u0e32': { code: 0x0e }, // า THAI CHARACTER SARA AA
+ '\u0e29': { code: 0x0e, shift: true }, // ษ THAI CHARACTER SO RUSI
+ '\u0e2a': { code: 0x0f }, // ส THAI CHARACTER SO SUA
+ '\u0e28': { code: 0x0f, shift: true }, // ศ THAI CHARACTER SO SALA
+ '\u0e27': { code: 0x33 }, // ว THAI CHARACTER WO WAEN
+ '\u0e0b': { code: 0x33, shift: true }, // ซ THAI CHARACTER SO SO
+ '\u0e07': { code: 0x34 }, // ง THAI CHARACTER NGO NGU
+ '.': { code: 0x34, shift: true },
+ '\u0e03': { code: 0x31 }, // ฃ THAI CHARACTER KHO KHUAT
+ '\u0e05': { code: 0x31, shift: true }, // ฅ THAI CHARACTER KHO KHON
+ '\u0e1c': { code: 0x1d }, // ผ THAI CHARACTER PHO PHUNG
+ '(': { code: 0x1d, shift: true },
+ '\u0e1b': { code: 0x1b }, // ป THAI CHARACTER PO PLA
+ ')': { code: 0x1b, shift: true },
+ '\u0e41': { code: 0x06 }, // แ THAI CHARACTER SARA AE
+ '\u0e09': { code: 0x06, shift: true }, // ฉ THAI CHARACTER CHO CHING
+ '\u0e2d': { code: 0x19 }, // อ THAI CHARACTER O ANG
+ '\u0e2e': { code: 0x19, shift: true }, // ฮ THAI CHARACTER HO NOKHUK
+ '\u0e34': { code: 0x05 }, // ิ THAI CHARACTER SARA I
+ '\u0e3a': { code: 0x05, shift: true }, // ฺ THAI CHARACTER PHINTHU
+ '\u0e37': { code: 0x11 }, // ื THAI CHARACTER SARA UEE
+ '\u0e4c': { code: 0x11, shift: true }, // ์ THAI CHARACTER THANTHAKHAT
+ '\u0e17': { code: 0x10 }, // ท THAI CHARACTER THO THAHAN
+ '?': { code: 0x10, shift: true },
+ '\u0e21': { code: 0x36 }, // ม THAI CHARACTER MO MA
+ '\u0e12': { code: 0x36, shift: true }, // ฒ THAI CHARACTER THO PHUTHAO
+ '\u0e43': { code: 0x37 }, // ใ THAI CHARACTER SARA AI MAIMUAN
+ '\u0e2c': { code: 0x37, shift: true }, // ฬ THAI CHARACTER LO CHULA
+ '\u0e1d': { code: 0x38 }, // ฝ THAI CHARACTER FO FA
+ '\u0e26': { code: 0x38, shift: true }, // ฦ THAI CHARACTER LU
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Turkish
+ 'tr': {
+ name: 'Turkish',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '>': { code: 0x1e, altGr: true },
+ '2': { code: 0x1f },
+ '\'': { code: 0x1f, shift: true },
+ '\u00a3': { code: 0x1f, altGr: true }, // £ POUND SIGN
+ '3': { code: 0x20 },
+ '^': { code: 0x20, shift: true },
+ '#': { code: 0x20, altGr: true },
+ '4': { code: 0x21 },
+ '+': { code: 0x21, shift: true },
+ '$': { code: 0x21, altGr: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '6': { code: 0x23 },
+ '&': { code: 0x23, shift: true },
+ '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '7': { code: 0x24 },
+ '/': { code: 0x24, shift: true },
+ '{': { code: 0x24, altGr: true },
+ '8': { code: 0x25 },
+ '(': { code: 0x25, shift: true },
+ '[': { code: 0x25, altGr: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ ']': { code: 0x26, altGr: true },
+ '0': { code: 0x27 },
+ '=': { code: 0x27, shift: true },
+ '}': { code: 0x27, altGr: true },
+ '*': { code: 0x2d },
+ '?': { code: 0x2d, shift: true },
+ '\\': { code: 0x2d, altGr: true },
+ '-': { code: 0x2e },
+ '_': { code: 0x2e, shift: true },
+ '|': { code: 0x2e, altGr: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '@': { code: 0x14, altGr: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u20ba': { code: 0x17, altGr: true }, // ₺ TURKISH LIRA SIGN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u00fb': { code: 0x18, altGr: true }, // û LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f4': { code: 0x12, altGr: true }, // ô LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u011f': { code: 0x2f }, // ğ LATIN SMALL LETTER G WITH BREVE
+ '\u011e': { code: 0x2f, shift: true }, // Ğ LATIN CAPITAL LETTER G WITH BREVE
+ '\u00fc': { code: 0x30 }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ '\u00dc': { code: 0x30, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+ '~': { code: 0x30, altGr: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e2': { code: 0x04, altGr: true }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u00aa': { code: 0x09, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u015f': { code: 0x33 }, // ş LATIN SMALL LETTER S WITH CEDILLA
+ '\u015e': { code: 0x33, shift: true }, // Ş LATIN CAPITAL LETTER S WITH CEDILLA
+ '\u00b4': { code: 0x33, altGr: true }, // ´ ACUTE ACCENT
+ '"': { code: 0x34, shift: true },
+ '\u00e9': { code: 0x35, shift: true }, // é LATIN SMALL LETTER E WITH ACUTE
+ '<': { code: 0x35, altGr: true },
+ ',': { code: 0x31 },
+ ';': { code: 0x31, shift: true },
+ '`': { code: 0x31, altGr: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ '\u00f6': { code: 0x36 }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '\u00d6': { code: 0x36, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\u00d7': { code: 0x36, altGr: true }, // × MULTIPLICATION SIGN
+ '\u00e7': { code: 0x37 }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '\u00c7': { code: 0x37, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA
+ '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT
+ '.': { code: 0x38 },
+ ':': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Ukrainian
+ 'ua': {
+ name: 'Ukrainian',
+ map: {
+ '\'': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ ';': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ ':': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '?': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA
+ '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u0457': { code: 0x30 }, // ї CYRILLIC SMALL LETTER YI
+ '\u0407': { code: 0x30, shift: true }, // Ї CYRILLIC CAPITAL LETTER YI
+ '\u0491': { code: 0x31 }, // ґ CYRILLIC SMALL LETTER GHE WITH UPTURN
+ '\u0490': { code: 0x31, shift: true }, // Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+ '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u0456': { code: 0x16 }, // і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u0406': { code: 0x16, shift: true }, // І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u0454': { code: 0x34 }, // є CYRILLIC SMALL LETTER UKRAINIAN IE
+ '\u0404': { code: 0x34, shift: true }, // Є CYRILLIC CAPITAL LETTER UKRAINIAN IE
+ '/': { code: 0x64 },
+ '|': { code: 0x64, shift: true },
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ '.': { code: 0x38 },
+ ',': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Urdu
+ 'pk': {
+ name: 'Urdu',
+ map: {
+ '\u064b': { code: 0x35 }, // ً ARABIC FATHATAN
+ '~': { code: 0x35, shift: true },
+ '\u200c': { code: 0x35, altGr: true }, // ZERO WIDTH NON-JOINER
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ ')': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ '(': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u0642': { code: 0x14 }, // ق ARABIC LETTER QAF
+ '\u0652': { code: 0x14, shift: true }, // ْ ARABIC SUKUN
+ '\u200d': { code: 0x14, altGr: true }, // ZERO WIDTH JOINER
+ '\u0648': { code: 0x1a }, // و ARABIC LETTER WAW
+ '\u0624': { code: 0x1a, shift: true }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE
+ '\u0639': { code: 0x08 }, // ع ARABIC LETTER AIN
+ '\u0670': { code: 0x08, shift: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF
+ '\u0631': { code: 0x15 }, // ر ARABIC LETTER REH
+ '\u0691': { code: 0x15, shift: true }, // ڑ ARABIC LETTER RREH
+ '\u062a': { code: 0x17 }, // ت ARABIC LETTER TEH
+ '\u0679': { code: 0x17, shift: true }, // ٹ ARABIC LETTER TTEH
+ '\u06d2': { code: 0x1c }, // ے ARABIC LETTER YEH BARREE
+ '\u064e': { code: 0x1c, shift: true }, // َ ARABIC FATHA
+ '\u0621': { code: 0x18 }, // ء ARABIC LETTER HAMZA
+ '\u0626': { code: 0x18, shift: true }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE
+ '\u06cc': { code: 0x0c }, // ی ARABIC LETTER FARSI YEH
+ '\u0650': { code: 0x0c, shift: true }, // ِ ARABIC KASRA
+ '\u06c1': { code: 0x12 }, // ہ ARABIC LETTER HEH GOAL
+ '\u06c3': { code: 0x12, shift: true }, // ۃ ARABIC LETTER TEH MARBUTA GOAL
+ '\u067e': { code: 0x13 }, // پ ARABIC LETTER PEH
+ '\u064f': { code: 0x13, shift: true }, // ُ ARABIC DAMMA
+ ']': { code: 0x2f },
+ '}': { code: 0x2f, shift: true },
+ '[': { code: 0x30 },
+ '{': { code: 0x30, shift: true },
+ '\u0627': { code: 0x04 }, // ا ARABIC LETTER ALEF
+ '\u0622': { code: 0x04, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE
+ '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN
+ '\u0635': { code: 0x16, shift: true }, // ص ARABIC LETTER SAD
+ '\u062f': { code: 0x07 }, // د ARABIC LETTER DAL
+ '\u0688': { code: 0x07, shift: true }, // ڈ ARABIC LETTER DDAL
+ '\u0641': { code: 0x09 }, // ف ARABIC LETTER FEH
+ '\u0651': { code: 0x09, shift: true }, // ّ ARABIC SHADDA
+ '\u06af': { code: 0x0a }, // گ ARABIC LETTER GAF
+ '\u063a': { code: 0x0a, shift: true }, // غ ARABIC LETTER GHAIN
+ '\u062d': { code: 0x0b }, // ح ARABIC LETTER HAH
+ '\u06be': { code: 0x0b, shift: true }, // ھ ARABIC LETTER HEH DOACHASHMEE
+ '\u062c': { code: 0x0d }, // ج ARABIC LETTER JEEM
+ '\u0636': { code: 0x0d, shift: true }, // ض ARABIC LETTER DAD
+ '\u06a9': { code: 0x0e }, // ک ARABIC LETTER KEHEH
+ '\u062e': { code: 0x0e, shift: true }, // خ ARABIC LETTER KHAH
+ '\u0644': { code: 0x0f }, // ل ARABIC LETTER LAM
+ '\u0654': { code: 0x0f, shift: true }, // ٔ ARABIC HAMZA ABOVE
+ '\u061b': { code: 0x33 }, // ؛ ARABIC SEMICOLON
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u00a6': { code: 0x64, shift: true }, // ¦ BROKEN BAR
+ '\u0632': { code: 0x1d }, // ز ARABIC LETTER ZAIN
+ '\u0630': { code: 0x1d, shift: true }, // ذ ARABIC LETTER THAL
+ '\u200e': { code: 0x1d, altGr: true }, // LEFT-TO-RIGHT MARK
+ '\u0634': { code: 0x1b }, // ش ARABIC LETTER SHEEN
+ '\u0698': { code: 0x1b, shift: true }, // ژ ARABIC LETTER JEH
+ '\u202a': { code: 0x1b, altGr: true }, // LEFT-TO-RIGHT EMBEDDING
+ '\u0686': { code: 0x06 }, // چ ARABIC LETTER TCHEH
+ '\u062b': { code: 0x06, shift: true }, // ث ARABIC LETTER THEH
+ '\u202d': { code: 0x06, altGr: true }, // LEFT-TO-RIGHT OVERRIDE
+ '\u0637': { code: 0x19 }, // ط ARABIC LETTER TAH
+ '\u0638': { code: 0x19, shift: true }, // ظ ARABIC LETTER ZAH
+ '\u202c': { code: 0x19, altGr: true }, // POP DIRECTIONAL FORMATTING
+ '\u0628': { code: 0x05 }, // ب ARABIC LETTER BEH
+ '.': { code: 0x05, shift: true },
+ '\u202e': { code: 0x05, altGr: true }, // RIGHT-TO-LEFT OVERRIDE
+ '\u0646': { code: 0x11 }, // ن ARABIC LETTER NOON
+ '\u06ba': { code: 0x11, shift: true }, // ں ARABIC LETTER NOON GHUNNA
+ '\u202b': { code: 0x11, altGr: true }, // RIGHT-TO-LEFT EMBEDDING
+ '\u0645': { code: 0x10 }, // م ARABIC LETTER MEEM
+ '\u0658': { code: 0x10, shift: true }, // ٘ ARABIC MARK NOON GHUNNA
+ '\u200f': { code: 0x10, altGr: true }, // RIGHT-TO-LEFT MARK
+ '\u060c': { code: 0x36 }, // ، ARABIC COMMA
+ '<': { code: 0x36, shift: true },
+ '\u06d4': { code: 0x37 }, // ۔ ARABIC FULL STOP
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // US Colemak
+ 'us-colemak': {
+ name: 'US Colemak',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u00ba': { code: 0x1f, altGr: true }, // º MASCULINE ORDINAL INDICATOR
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00aa': { code: 0x20, altGr: true }, // ª FEMININE ORDINAL INDICATOR
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00a2': { code: 0x21, altGr: true }, // ¢ CENT SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '\u0127': { code: 0x23, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u00f0': { code: 0x24, altGr: true }, // ð LATIN SMALL LETTER ETH
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u00fe': { code: 0x25, altGr: true }, // þ LATIN SMALL LETTER THORN
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '\u2018': { code: 0x26, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u2019': { code: 0x27, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u2013': { code: 0x2d, altGr: true }, // – EN DASH
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u00d7': { code: 0x2e, altGr: true }, // × MULTIPLICATION SIGN
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u00e4': { code: 0x14, altGr: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u00e5': { code: 0x1a, altGr: true }, // å LATIN SMALL LETTER A WITH RING ABOVE
+ 'f': { code: 0x08 },
+ 'F': { code: 0x08, shift: true },
+ '\u00e3': { code: 0x08, altGr: true }, // ã LATIN SMALL LETTER A WITH TILDE
+ 'p': { code: 0x15 },
+ 'P': { code: 0x15, shift: true },
+ '\u00f8': { code: 0x15, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ 'g': { code: 0x17 },
+ 'G': { code: 0x17, shift: true },
+ 'j': { code: 0x1c },
+ 'J': { code: 0x1c, shift: true },
+ '\u0111': { code: 0x1c, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE
+ 'l': { code: 0x18 },
+ 'L': { code: 0x18, shift: true },
+ '\u0142': { code: 0x18, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE
+ 'u': { code: 0x0c },
+ 'U': { code: 0x0c, shift: true },
+ '\u00fa': { code: 0x0c, altGr: true }, // ú LATIN SMALL LETTER U WITH ACUTE
+ 'y': { code: 0x12 },
+ 'Y': { code: 0x12, shift: true },
+ '\u00fc': { code: 0x12, altGr: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ ';': { code: 0x13 },
+ ':': { code: 0x13, shift: true },
+ '\u00f6': { code: 0x13, altGr: true }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ '\u00ab': { code: 0x2f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u00bb': { code: 0x30, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE
+ 'r': { code: 0x16 },
+ 'R': { code: 0x16, shift: true },
+ 's': { code: 0x07 },
+ 'S': { code: 0x07, shift: true },
+ '\u00df': { code: 0x07, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 't': { code: 0x09 },
+ 'T': { code: 0x09, shift: true },
+ 'd': { code: 0x0a },
+ 'D': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'n': { code: 0x0d },
+ 'N': { code: 0x0d, shift: true },
+ '\u00f1': { code: 0x0d, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE
+ 'e': { code: 0x0e },
+ 'E': { code: 0x0e, shift: true },
+ '\u00e9': { code: 0x0e, altGr: true }, // é LATIN SMALL LETTER E WITH ACUTE
+ 'i': { code: 0x0f },
+ 'I': { code: 0x0f, shift: true },
+ '\u00ed': { code: 0x0f, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE
+ 'o': { code: 0x33 },
+ 'O': { code: 0x33, shift: true },
+ '\u00f3': { code: 0x33, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\u00f5': { code: 0x34, altGr: true }, // õ LATIN SMALL LETTER O WITH TILDE
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00e6': { code: 0x1d, altGr: true }, // æ LATIN SMALL LETTER AE
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00e7': { code: 0x06, altGr: true }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ '\u0153': { code: 0x19, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'k': { code: 0x11 },
+ 'K': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '\u00bf': { code: 0x38, altGr: true }, // ¿ INVERTED QUESTION MARK
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // US Dvorak
+ 'us-dvorak': {
+ name: 'US Dvorak',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '[': { code: 0x2d },
+ '{': { code: 0x2d, shift: true },
+ ']': { code: 0x2e },
+ '}': { code: 0x2e, shift: true },
+ '\'': { code: 0x14 },
+ '"': { code: 0x14, shift: true },
+ ',': { code: 0x1a },
+ '<': { code: 0x1a, shift: true },
+ '.': { code: 0x08 },
+ '>': { code: 0x08, shift: true },
+ 'p': { code: 0x15 },
+ 'P': { code: 0x15, shift: true },
+ 'y': { code: 0x17 },
+ 'Y': { code: 0x17, shift: true },
+ 'f': { code: 0x1c },
+ 'F': { code: 0x1c, shift: true },
+ 'g': { code: 0x18 },
+ 'G': { code: 0x18, shift: true },
+ 'c': { code: 0x0c },
+ 'C': { code: 0x0c, shift: true },
+ 'r': { code: 0x12 },
+ 'R': { code: 0x12, shift: true },
+ 'l': { code: 0x13 },
+ 'L': { code: 0x13, shift: true },
+ '/': { code: 0x2f },
+ '?': { code: 0x2f, shift: true },
+ '=': { code: 0x30 },
+ '+': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ 'o': { code: 0x16 },
+ 'O': { code: 0x16, shift: true },
+ 'e': { code: 0x07 },
+ 'E': { code: 0x07, shift: true },
+ 'u': { code: 0x09 },
+ 'U': { code: 0x09, shift: true },
+ 'i': { code: 0x0a },
+ 'I': { code: 0x0a, shift: true },
+ 'd': { code: 0x0b },
+ 'D': { code: 0x0b, shift: true },
+ 'h': { code: 0x0d },
+ 'H': { code: 0x0d, shift: true },
+ 't': { code: 0x0e },
+ 'T': { code: 0x0e, shift: true },
+ 'n': { code: 0x0f },
+ 'N': { code: 0x0f, shift: true },
+ 's': { code: 0x33 },
+ 'S': { code: 0x33, shift: true },
+ '-': { code: 0x34 },
+ '_': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ ';': { code: 0x1d },
+ ':': { code: 0x1d, shift: true },
+ 'q': { code: 0x1b },
+ 'Q': { code: 0x1b, shift: true },
+ 'j': { code: 0x06 },
+ 'J': { code: 0x06, shift: true },
+ 'k': { code: 0x19 },
+ 'K': { code: 0x19, shift: true },
+ 'x': { code: 0x05 },
+ 'X': { code: 0x05, shift: true },
+ 'b': { code: 0x11 },
+ 'B': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ 'w': { code: 0x36 },
+ 'W': { code: 0x36, shift: true },
+ 'v': { code: 0x37 },
+ 'V': { code: 0x37, shift: true },
+ 'z': { code: 0x38 },
+ 'Z': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // US English
+ 'us': {
+ name: 'US English',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // US International
+ 'us-intl': {
+ name: 'US International',
+ map: {
+ '`': { code: 0x35, altGr: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '\u00a4': { code: 0x21, altGr: true }, // ¤ CURRENCY SIGN
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN
+ '6': { code: 0x23 },
+ '\u00bc': { code: 0x23, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '\u00bd': { code: 0x24, altGr: true }, // ½ VULGAR FRACTION ONE HALF
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '\u00be': { code: 0x25, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '\u2018': { code: 0x26, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\u2019': { code: 0x27, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u00a5': { code: 0x2d, altGr: true }, // ¥ YEN SIGN
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ '\u00d7': { code: 0x2e, altGr: true }, // × MULTIPLICATION SIGN
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ '\u00e4': { code: 0x14, altGr: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ '\u00e5': { code: 0x1a, altGr: true }, // å LATIN SMALL LETTER A WITH RING ABOVE
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ '\u00e9': { code: 0x08, altGr: true }, // é LATIN SMALL LETTER E WITH ACUTE
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ '\u00fc': { code: 0x1c, altGr: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ '\u00fa': { code: 0x18, altGr: true }, // ú LATIN SMALL LETTER U WITH ACUTE
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ '\u00ed': { code: 0x0c, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ '\u00f3': { code: 0x12, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u00f6': { code: 0x13, altGr: true }, // ö LATIN SMALL LETTER O WITH DIAERESIS
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ '\u00ab': { code: 0x2f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ '\u00bb': { code: 0x30, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ '\u00eb': { code: 0x09, altGr: true }, // ë LATIN SMALL LETTER E WITH DIAERESIS
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ '\u00ef': { code: 0x0d, altGr: true }, // ï LATIN SMALL LETTER I WITH DIAERESIS
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ '\u0153': { code: 0x0e, altGr: true }, // œ LATIN SMALL LIGATURE OE
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ '\u00f8': { code: 0x0f, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\u00b6': { code: 0x33, altGr: true }, // ¶ PILCROW SIGN
+ '\'': { code: 0x34, altGr: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ '\u00e6': { code: 0x1d, altGr: true }, // æ LATIN SMALL LETTER AE
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ '\u00b7': { code: 0x1b, altGr: true }, // · MIDDLE DOT
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '\u00e7': { code: 0x36, altGr: true }, // ç LATIN SMALL LETTER C WITH CEDILLA
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ '\u00bf': { code: 0x38, altGr: true }, // ¿ INVERTED QUESTION MARK
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '\u00ac': { code: 0x31, altGr: true }, // ¬ NOT SIGN
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Uzbek (Cyrillic)
+ 'uz-cyr': {
+ name: 'Uzbek (Cyrillic)',
+ map: {
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '"': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN
+ '4': { code: 0x21 },
+ ';': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ ':': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '?': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ '.': { code: 0x38 },
+ ',': { code: 0x38, shift: true },
+ '/': { code: 0x64 },
+ '\u0493': { code: 0x2d }, // ғ CYRILLIC SMALL LETTER GHE WITH STROKE
+ '\u0492': { code: 0x2d, shift: true }, // Ғ CYRILLIC CAPITAL LETTER GHE WITH STROKE
+ '\u04b3': { code: 0x2e }, // ҳ CYRILLIC SMALL LETTER HA WITH DESCENDER
+ '\u04b2': { code: 0x2e, shift: true }, // Ҳ CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+ '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO
+ '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO
+ '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I
+ '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I
+ '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE
+ '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE
+ '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U
+ '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U
+ '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA
+ '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA
+ '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE
+ '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE
+ '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN
+ '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN
+ '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE
+ '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE
+ '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA
+ '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA
+ '\u045e': { code: 0x12 }, // ў CYRILLIC SMALL LETTER SHORT U
+ '\u040e': { code: 0x12, shift: true }, // Ў CYRILLIC CAPITAL LETTER SHORT U
+ '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE
+ '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE
+ '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA
+ '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA
+ '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN
+ '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+ '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF
+ '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF
+ '\u049b': { code: 0x16 }, // қ CYRILLIC SMALL LETTER KA WITH DESCENDER
+ '\u049a': { code: 0x16, shift: true }, // Қ CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+ '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE
+ '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE
+ '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A
+ '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A
+ '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE
+ '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE
+ '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER
+ '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER
+ '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O
+ '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O
+ '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL
+ '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL
+ '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE
+ '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE
+ '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE
+ '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE
+ '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E
+ '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E
+ '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA
+ '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA
+ '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE
+ '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE
+ '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES
+ '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES
+ '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM
+ '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM
+ '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE
+ '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE
+ '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I
+ '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I
+ '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN
+ '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE
+ '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE
+ '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU
+ '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Uzbek (Latin)
+ 'uz': {
+ name: 'Uzbek (Latin)',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '1': { code: 0x1e },
+ '!': { code: 0x1e, shift: true },
+ '2': { code: 0x1f },
+ '@': { code: 0x1f, shift: true },
+ '3': { code: 0x20 },
+ '#': { code: 0x20, shift: true },
+ '4': { code: 0x21 },
+ '$': { code: 0x21, shift: true },
+ '5': { code: 0x22 },
+ '%': { code: 0x22, shift: true },
+ '6': { code: 0x23 },
+ '^': { code: 0x23, shift: true },
+ '7': { code: 0x24 },
+ '&': { code: 0x24, shift: true },
+ '8': { code: 0x25 },
+ '*': { code: 0x25, shift: true },
+ '9': { code: 0x26 },
+ '(': { code: 0x26, shift: true },
+ '0': { code: 0x27 },
+ ')': { code: 0x27, shift: true },
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '=': { code: 0x2e },
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '[': { code: 0x2f },
+ '{': { code: 0x2f, shift: true },
+ ']': { code: 0x30 },
+ '}': { code: 0x30, shift: true },
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\u02bb': { code: 0x34 }, // ʻ MODIFIER LETTER TURNED COMMA
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+ // Vietnamese
+ 'vn': {
+ name: 'Vietnamese',
+ map: {
+ '`': { code: 0x35 },
+ '~': { code: 0x35, shift: true },
+ '\u0103': { code: 0x1e }, // ă LATIN SMALL LETTER A WITH BREVE
+ '\u0102': { code: 0x1e, shift: true }, // Ă LATIN CAPITAL LETTER A WITH BREVE
+ '\u00e2': { code: 0x1f }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX
+ '\u00c2': { code: 0x1f, shift: true }, // Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ '\u00ea': { code: 0x20 }, // ê LATIN SMALL LETTER E WITH CIRCUMFLEX
+ '\u00ca': { code: 0x20, shift: true }, // Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ '\u00f4': { code: 0x21 }, // ô LATIN SMALL LETTER O WITH CIRCUMFLEX
+ '\u00d4': { code: 0x21, shift: true }, // Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ '%': { code: 0x22, shift: true },
+ '^': { code: 0x23, shift: true },
+ '&': { code: 0x24, shift: true },
+ '*': { code: 0x25, shift: true },
+ '(': { code: 0x26, shift: true },
+ '\u0111': { code: 0x27 }, // đ LATIN SMALL LETTER D WITH STROKE
+ '\u0110': { code: 0x27, shift: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE
+ '-': { code: 0x2d },
+ '_': { code: 0x2d, shift: true },
+ '\u20ab': { code: 0x2e }, // ₫ DONG SIGN
+ '+': { code: 0x2e, shift: true },
+ 'q': { code: 0x14 },
+ 'Q': { code: 0x14, shift: true },
+ 'w': { code: 0x1a },
+ 'W': { code: 0x1a, shift: true },
+ 'e': { code: 0x08 },
+ 'E': { code: 0x08, shift: true },
+ 'r': { code: 0x15 },
+ 'R': { code: 0x15, shift: true },
+ 't': { code: 0x17 },
+ 'T': { code: 0x17, shift: true },
+ 'y': { code: 0x1c },
+ 'Y': { code: 0x1c, shift: true },
+ 'u': { code: 0x18 },
+ 'U': { code: 0x18, shift: true },
+ 'i': { code: 0x0c },
+ 'I': { code: 0x0c, shift: true },
+ 'o': { code: 0x12 },
+ 'O': { code: 0x12, shift: true },
+ 'p': { code: 0x13 },
+ 'P': { code: 0x13, shift: true },
+ '\u01b0': { code: 0x2f }, // ư LATIN SMALL LETTER U WITH HORN
+ '\u01af': { code: 0x2f, shift: true }, // Ư LATIN CAPITAL LETTER U WITH HORN
+ '\u01a1': { code: 0x30 }, // ơ LATIN SMALL LETTER O WITH HORN
+ '\u01a0': { code: 0x30, shift: true }, // Ơ LATIN CAPITAL LETTER O WITH HORN
+ 'a': { code: 0x04 },
+ 'A': { code: 0x04, shift: true },
+ 's': { code: 0x16 },
+ 'S': { code: 0x16, shift: true },
+ 'd': { code: 0x07 },
+ 'D': { code: 0x07, shift: true },
+ 'f': { code: 0x09 },
+ 'F': { code: 0x09, shift: true },
+ 'g': { code: 0x0a },
+ 'G': { code: 0x0a, shift: true },
+ 'h': { code: 0x0b },
+ 'H': { code: 0x0b, shift: true },
+ 'j': { code: 0x0d },
+ 'J': { code: 0x0d, shift: true },
+ 'k': { code: 0x0e },
+ 'K': { code: 0x0e, shift: true },
+ 'l': { code: 0x0f },
+ 'L': { code: 0x0f, shift: true },
+ ';': { code: 0x33 },
+ ':': { code: 0x33, shift: true },
+ '\'': { code: 0x34 },
+ '"': { code: 0x34, shift: true },
+ '\\': { code: 0x31 },
+ '|': { code: 0x31, shift: true },
+ 'z': { code: 0x1d },
+ 'Z': { code: 0x1d, shift: true },
+ 'x': { code: 0x1b },
+ 'X': { code: 0x1b, shift: true },
+ 'c': { code: 0x06 },
+ 'C': { code: 0x06, shift: true },
+ 'v': { code: 0x19 },
+ 'V': { code: 0x19, shift: true },
+ 'b': { code: 0x05 },
+ 'B': { code: 0x05, shift: true },
+ 'n': { code: 0x11 },
+ 'N': { code: 0x11, shift: true },
+ 'm': { code: 0x10 },
+ 'M': { code: 0x10, shift: true },
+ ',': { code: 0x36 },
+ '<': { code: 0x36, shift: true },
+ '.': { code: 0x37 },
+ '>': { code: 0x37, shift: true },
+ '/': { code: 0x38 },
+ '?': { code: 0x38, shift: true },
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+ },
+ },
+};
diff --git a/browser/src/libs/keyboard/layouts.ts b/browser/src/libs/keyboard/layouts.ts
new file mode 100644
index 00000000..aac7cb1b
--- /dev/null
+++ b/browser/src/libs/keyboard/layouts.ts
@@ -0,0 +1,257 @@
+// Dynamic keyboard layout detection using browser's Keyboard API
+// This allows paste to work correctly regardless of keyboard layout
+//
+// Strategy:
+// 1. Use browser's Keyboard.getLayoutMap() to detect YOUR keyboard layout
+// 2. For "same layout" mode: assume target has same layout as you
+// 3. For "different layout" mode: user specifies target layout
+//
+// When local and target layouts match, paste will work correctly
+// because we map character -> physical key using YOUR layout
+
+import { KeycodeMap } from './keymap';
+
+export interface KeyMapping {
+ code: number; // HID keycode
+ shift?: boolean; // Requires Shift
+ altGr?: boolean; // Requires AltGr (Right Alt)
+ deadKey?: boolean; // Is a dead key (needs space after to produce standalone char)
+}
+
+export type LayoutMap = Record;
+
+// Cache for the detected layout
+let cachedLayoutMap: LayoutMap | null = null;
+let layoutDetectionPromise: Promise | null = null;
+
+// Map from DOM key code (e.g., "KeyA") to HID keycode
+function domCodeToHid(domCode: string): number | undefined {
+ return KeycodeMap[domCode];
+}
+
+// Fallback US QWERTY layout when browser API is unavailable
+function getFallbackLayout(): LayoutMap {
+ const layout: LayoutMap = {};
+
+ // Basic ASCII letters
+ const letters = 'abcdefghijklmnopqrstuvwxyz';
+ const letterCodes = [0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
+ 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d];
+
+ for (let i = 0; i < letters.length; i++) {
+ layout[letters[i]] = { code: letterCodes[i] };
+ layout[letters[i].toUpperCase()] = { code: letterCodes[i], shift: true };
+ }
+
+ // Numbers (US layout - number row)
+ const numbers = '1234567890';
+ const numCodes = [0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27];
+ for (let i = 0; i < numbers.length; i++) {
+ layout[numbers[i]] = { code: numCodes[i] };
+ }
+
+ // Basic punctuation (US layout)
+ layout[' '] = { code: 0x2c };
+ layout['\t'] = { code: 0x2b };
+ layout['\n'] = { code: 0x28 };
+ layout['\r'] = { code: 0x28 };
+ layout['-'] = { code: 0x2d };
+ layout['='] = { code: 0x2e };
+ layout['['] = { code: 0x2f };
+ layout[']'] = { code: 0x30 };
+ layout['\\'] = { code: 0x31 };
+ layout[';'] = { code: 0x33 };
+ layout["'"] = { code: 0x34 };
+ layout['`'] = { code: 0x35 };
+ layout[','] = { code: 0x36 };
+ layout['.'] = { code: 0x37 };
+ layout['/'] = { code: 0x38 };
+
+ return layout;
+}
+
+// Build shifted character mappings based on detected unshifted chars
+// This assumes Shift+key produces a related character (works for same-layout scenarios)
+function buildShiftedMappings(layoutMap: LayoutMap): void {
+ // For each unshifted punctuation, try to find shifted version on same key
+ // These are common patterns that work across many layouts
+ const shiftPairs: [string, string][] = [
+ ['.', ':'], // Period -> Colon (works for Danish, German, etc.)
+ [',', ';'], // Comma -> Semicolon
+ ['-', '_'], // Minus -> Underscore (varies by layout)
+ ];
+
+ for (const [unshifted, shifted] of shiftPairs) {
+ if (layoutMap[unshifted] && !layoutMap[shifted]) {
+ layoutMap[shifted] = { code: layoutMap[unshifted].code, shift: true };
+ }
+ }
+}
+
+// Baseline punctuation - only unshifted chars that are consistent across layouts
+function getBasePunctuation(): LayoutMap {
+ return {
+ // Basic controls
+ ' ': { code: 0x2c },
+ '\t': { code: 0x2b },
+ '\n': { code: 0x28 },
+ '\r': { code: 0x28 },
+
+ // Numbers are usually consistent
+ '1': { code: 0x1e }, '2': { code: 0x1f }, '3': { code: 0x20 },
+ '4': { code: 0x21 }, '5': { code: 0x22 }, '6': { code: 0x23 },
+ '7': { code: 0x24 }, '8': { code: 0x25 }, '9': { code: 0x26 },
+ '0': { code: 0x27 },
+ };
+}
+
+// Detect the current keyboard layout from the browser
+async function detectBrowserLayout(): Promise {
+ // Start with minimal baseline
+ const layoutMap: LayoutMap = { ...getBasePunctuation() };
+
+ // Add letters (consistent across layouts)
+ const letters = 'abcdefghijklmnopqrstuvwxyz';
+ const letterCodes = [0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
+ 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d];
+ for (let i = 0; i < letters.length; i++) {
+ layoutMap[letters[i]] = { code: letterCodes[i] };
+ layoutMap[letters[i].toUpperCase()] = { code: letterCodes[i], shift: true };
+ }
+
+ // Try to detect layout from browser API
+ if ('keyboard' in navigator && 'getLayoutMap' in (navigator as any).keyboard) {
+ try {
+ const keyboard = (navigator as any).keyboard;
+ const browserLayoutMap = await keyboard.getLayoutMap();
+
+ // Override with detected layout (accurate for user's actual keyboard)
+ browserLayoutMap.forEach((char: string, domCode: string) => {
+ const hidCode = domCodeToHid(domCode);
+ if (hidCode !== undefined && char && char.length === 1) {
+ layoutMap[char] = { code: hidCode };
+
+ // Also add uppercase for letters
+ if (char.match(/[a-z]/i)) {
+ const upper = char.toUpperCase();
+ const lower = char.toLowerCase();
+ if (upper !== lower) {
+ layoutMap[lower] = { code: hidCode };
+ layoutMap[upper] = { code: hidCode, shift: true };
+ }
+ }
+ }
+ });
+
+ // Build shifted mappings based on detected layout
+ buildShiftedMappings(layoutMap);
+
+ console.log(`Detected keyboard layout with ${Object.keys(layoutMap).length} mappings`);
+ } catch (err) {
+ console.warn('Failed to detect keyboard layout:', err);
+ }
+ } else {
+ console.warn('Keyboard API not available, using baseline layout');
+ }
+
+ return layoutMap;
+}
+
+// Event-based layout learning: call this when user types to learn shifted/altgr chars
+// This fills in gaps the browser API doesn't provide (like shifted number row chars)
+export function learnFromKeyEvent(event: KeyboardEvent): void {
+ if (!cachedLayoutMap) return;
+
+ const char = event.key;
+ if (char.length !== 1) return; // Only single characters
+
+ const hidCode = domCodeToHid(event.code);
+ if (hidCode === undefined) return;
+
+ // Skip if we already have this exact mapping
+ if (cachedLayoutMap[char]) return;
+
+ const shift = event.shiftKey;
+ const altGr = event.getModifierState('AltGraph');
+
+ cachedLayoutMap[char] = {
+ code: hidCode,
+ shift: shift || undefined,
+ altGr: altGr || undefined,
+ };
+
+ console.log(`Learned: '${char}' -> HID ${hidCode.toString(16)} (shift=${shift}, altGr=${altGr})`);
+}
+
+// Get the current layout (auto-detected from browser)
+export async function getDetectedLayout(): Promise {
+ if (cachedLayoutMap) {
+ return cachedLayoutMap;
+ }
+
+ if (layoutDetectionPromise) {
+ return layoutDetectionPromise;
+ }
+
+ layoutDetectionPromise = detectBrowserLayout().then(layout => {
+ cachedLayoutMap = layout;
+ return layout;
+ });
+
+ return layoutDetectionPromise;
+}
+
+// Get cached layout synchronously (may be incomplete if not yet detected)
+export function getCachedLayout(): LayoutMap | null {
+ return cachedLayoutMap;
+}
+
+// Initialize layout detection (call early in app startup)
+export function initLayoutDetection(): void {
+ getDetectedLayout().catch(err => {
+ console.error('Layout detection failed:', err);
+ });
+}
+
+// Mode selection
+export type LayoutMode = 'auto' | 'manual';
+
+export interface LayoutConfig {
+ mode: LayoutMode;
+ manualLayoutId?: string; // Only used when mode is 'manual'
+}
+
+// Import generated layouts from XKB data
+import { GENERATED_LAYOUTS } from './layouts.generated';
+
+export const LAYOUTS: Record = {
+ 'auto': { name: 'Auto-detect', map: {} }, // Special case, uses detected layout
+ ...GENERATED_LAYOUTS,
+};
+
+export function getLayout(config: LayoutConfig): LayoutMap {
+ if (config.mode === 'auto') {
+ return cachedLayoutMap ?? getFallbackLayout();
+ }
+
+ if (config.manualLayoutId && LAYOUTS[config.manualLayoutId]) {
+ return LAYOUTS[config.manualLayoutId].map;
+ }
+
+ return cachedLayoutMap ?? getFallbackLayout();
+}
+
+// Get layout by ID (for paste function)
+export function getLayoutById(layoutId: string): LayoutMap {
+ if (layoutId === 'auto') {
+ return cachedLayoutMap ?? getFallbackLayout();
+ }
+ return LAYOUTS[layoutId]?.map ?? cachedLayoutMap ?? getFallbackLayout();
+}
+
+// Simplified API for common use case (auto-detect, same layout on both sides)
+export function getAutoLayout(): LayoutMap {
+ return cachedLayoutMap ?? getFallbackLayout();
+}
diff --git a/browser/src/libs/storage/index.ts b/browser/src/libs/storage/index.ts
index 7583d973..77a106ce 100644
--- a/browser/src/libs/storage/index.ts
+++ b/browser/src/libs/storage/index.ts
@@ -13,6 +13,8 @@ const MOUSE_SCROLL_DIRECTION_KEY = 'nanokvm-usb-mouse-scroll-direction';
const MOUSE_SCROLL_INTERVAL_KEY = 'nanokvm-usb-mouse-scroll-interval';
const MOUSE_JIGGLER_MODE_KEY = 'nanokvm-usb-mouse-jiggler-mode';
const KEYBOARD_SHORTCUT_KEY = 'nanokvm-usb-keyboard-shortcut';
+const TARGET_KEYBOARD_LAYOUT_KEY = 'nanokvm-usb-target-keyboard-layout';
+const PASTE_SPEED_KEY = 'nanokvm-usb-paste-speed';
export function getLanguage() {
return localStorage.getItem(LANGUAGE_KEY);
@@ -155,3 +157,27 @@ export function getMouseJigglerMode(): 'enable' | 'disable' {
export function setMouseJigglerMode(jiggler: 'enable' | 'disable'): void {
localStorage.setItem(MOUSE_JIGGLER_MODE_KEY, jiggler);
}
+
+export function getTargetKeyboardLayout(): string {
+ return localStorage.getItem(TARGET_KEYBOARD_LAYOUT_KEY) ?? 'us';
+}
+
+export function setTargetKeyboardLayout(layout: string): void {
+ localStorage.setItem(TARGET_KEYBOARD_LAYOUT_KEY, layout);
+}
+
+// Paste speed in milliseconds (key down delay)
+export function getPasteSpeed(): number {
+ const speed = localStorage.getItem(PASTE_SPEED_KEY);
+ if (speed) {
+ const value = Number(speed);
+ if (!isNaN(value) && value >= 1 && value <= 200) {
+ return value;
+ }
+ }
+ return 1; // Default to 1ms (fastest)
+}
+
+export function setPasteSpeed(speed: number): void {
+ localStorage.setItem(PASTE_SPEED_KEY, String(speed));
+}