Files
PowerToys/src/modules/poweraccent/PowerAccent.Core/Languages.cs
PesBandi 63042dad31 [QuickAccent] Add vowels with acute, grave, and dieresis to Welsh (#41355)
## Summary of the Pull Request
Extends the Welsh character set by vowels with acute, grave, and
dieresis accents. Order is now circumflex, dieresis, grave, acute for
all letters. Decision based on the last paragraph of [wikipedia's
diacritics
section](https://en.wikipedia.org/wiki/Welsh_orthography#Diacritics).
See original issue for sources.
## PR Checklist
- [x] Closes: #41155
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [x] **Localization:** All end-user-facing strings can be localized
- [x] **Dev docs:** No need
- [x] **New binaries:** None
- [x] **Documentation updated:** No need
## Detailed Description of the Pull Request / Additional comments
## Validation Steps Performed
Tested manually
2025-09-08 11:06:19 +02:00

962 lines
40 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Collections.Concurrent;
using PowerToys.PowerAccentKeyboardService;
namespace PowerAccent.Core
{
public enum Language
{
SPECIAL,
BG,
CA,
CRH,
CUR,
CY,
CZ,
DK,
GA,
GD,
DE,
EL,
EST,
EPO,
FI,
FR,
HR,
HE,
HU,
IS,
IPA,
IT,
KU,
LT,
MK,
MT,
MI,
NL,
NO,
PI,
PIE,
PL,
PT,
RO,
ROM,
SK,
SL,
SP,
SR,
SR_CYRL,
SV,
TK,
VI,
}
internal sealed class Languages
{
public static string[] GetDefaultLetterKey(LetterKey letter, Language[] langs)
{
if (langs.Length == Enum.GetValues<Language>().Length)
{
return GetDefaultLetterKeyALL(letter);
}
if (langs.Length == 0)
{
return Array.Empty<string>();
}
var characters = new List<string>();
foreach (var lang in langs)
{
characters.AddRange(lang switch
{
Language.SPECIAL => GetDefaultLetterKeySPECIAL(letter), // Special Characters
Language.BG => GetDefaultLetterKeyBG(letter), // Bulgarian
Language.CA => GetDefaultLetterKeyCA(letter), // Catalan
Language.CRH => GetDefaultLetterKeyCRH(letter), // Crimean Tatar
Language.CUR => GetDefaultLetterKeyCUR(letter), // Currency
Language.CY => GetDefaultLetterKeyCY(letter), // Welsh
Language.CZ => GetDefaultLetterKeyCZ(letter), // Czech
Language.DK => GetDefaultLetterKeyDK(letter), // Danish
Language.GA => GetDefaultLetterKeyGA(letter), // Gaeilge (Irish)
Language.GD => GetDefaultLetterKeyGD(letter), // Gàidhlig (Scottish Gaelic)
Language.DE => GetDefaultLetterKeyDE(letter), // German
Language.EL => GetDefaultLetterKeyEL(letter), // Greek
Language.EST => GetDefaultLetterKeyEST(letter), // Estonian
Language.EPO => GetDefaultLetterKeyEPO(letter), // Esperanto
Language.FI => GetDefaultLetterKeyFI(letter), // Finnish
Language.FR => GetDefaultLetterKeyFR(letter), // French
Language.HR => GetDefaultLetterKeyHR(letter), // Croatian
Language.HE => GetDefaultLetterKeyHE(letter), // Hebrew
Language.HU => GetDefaultLetterKeyHU(letter), // Hungarian
Language.IS => GetDefaultLetterKeyIS(letter), // Iceland
Language.IPA => GetDefaultLetterKeyIPA(letter), // IPA (International phonetic alphabet)
Language.IT => GetDefaultLetterKeyIT(letter), // Italian
Language.KU => GetDefaultLetterKeyKU(letter), // Kurdish
Language.LT => GetDefaultLetterKeyLT(letter), // Lithuanian
Language.MK => GetDefaultLetterKeyMK(letter), // Macedonian
Language.MT => GetDefaultLetterKeyMT(letter), // Maltese
Language.MI => GetDefaultLetterKeyMI(letter), // Maori
Language.NL => GetDefaultLetterKeyNL(letter), // Dutch
Language.NO => GetDefaultLetterKeyNO(letter), // Norwegian
Language.PI => GetDefaultLetterKeyPI(letter), // Pinyin
Language.PIE => GetDefaultLetterKeyPIE(letter), // Proto-Indo-European
Language.PL => GetDefaultLetterKeyPL(letter), // Polish
Language.PT => GetDefaultLetterKeyPT(letter), // Portuguese
Language.RO => GetDefaultLetterKeyRO(letter), // Romanian
Language.ROM => GetDefaultLetterKeyROM(letter), // Middle Eastern Romanization
Language.SK => GetDefaultLetterKeySK(letter), // Slovak
Language.SL => GetDefaultLetterKeySL(letter), // Slovenian
Language.SP => GetDefaultLetterKeySP(letter), // Spain
Language.SR => GetDefaultLetterKeySR(letter), // Serbian
Language.SR_CYRL => GetDefaultLetterKeySRCyrillic(letter), // Serbian Cyrillic
Language.SV => GetDefaultLetterKeySV(letter), // Swedish
Language.TK => GetDefaultLetterKeyTK(letter), // Turkish
Language.VI => GetDefaultLetterKeyVI(letter), // Vietnamese
_ => throw new ArgumentException("The language {0} is not known in this context", lang.ToString()),
});
}
return characters.Distinct().ToArray();
}
// Store the computed letters for each key, so that subsequent calls don't take as long.
private static ConcurrentDictionary<LetterKey, string[]> _allLanguagesCache = new ConcurrentDictionary<LetterKey, string[]>();
// All
private static string[] GetDefaultLetterKeyALL(LetterKey letter)
{
if (!_allLanguagesCache.TryGetValue(letter, out string[] cachedValue))
{
cachedValue = GetDefaultLetterKeyBG(letter)
.Union(GetDefaultLetterKeyCA(letter))
.Union(GetDefaultLetterKeyCRH(letter))
.Union(GetDefaultLetterKeyCUR(letter))
.Union(GetDefaultLetterKeyCY(letter))
.Union(GetDefaultLetterKeyCZ(letter))
.Union(GetDefaultLetterKeyDK(letter))
.Union(GetDefaultLetterKeyGA(letter))
.Union(GetDefaultLetterKeyGD(letter))
.Union(GetDefaultLetterKeyDE(letter))
.Union(GetDefaultLetterKeyEL(letter))
.Union(GetDefaultLetterKeyEST(letter))
.Union(GetDefaultLetterKeyEPO(letter))
.Union(GetDefaultLetterKeyFI(letter))
.Union(GetDefaultLetterKeyFR(letter))
.Union(GetDefaultLetterKeyHR(letter))
.Union(GetDefaultLetterKeyHE(letter))
.Union(GetDefaultLetterKeyHU(letter))
.Union(GetDefaultLetterKeyIS(letter))
.Union(GetDefaultLetterKeyIPA(letter))
.Union(GetDefaultLetterKeyIT(letter))
.Union(GetDefaultLetterKeyKU(letter))
.Union(GetDefaultLetterKeyLT(letter))
.Union(GetDefaultLetterKeyROM(letter))
.Union(GetDefaultLetterKeyMK(letter))
.Union(GetDefaultLetterKeyMT(letter))
.Union(GetDefaultLetterKeyMI(letter))
.Union(GetDefaultLetterKeyNL(letter))
.Union(GetDefaultLetterKeyNO(letter))
.Union(GetDefaultLetterKeyPI(letter))
.Union(GetDefaultLetterKeyPIE(letter))
.Union(GetDefaultLetterKeyPL(letter))
.Union(GetDefaultLetterKeyPT(letter))
.Union(GetDefaultLetterKeyRO(letter))
.Union(GetDefaultLetterKeySK(letter))
.Union(GetDefaultLetterKeySL(letter))
.Union(GetDefaultLetterKeySP(letter))
.Union(GetDefaultLetterKeySR(letter))
.Union(GetDefaultLetterKeySRCyrillic(letter))
.Union(GetDefaultLetterKeySV(letter))
.Union(GetDefaultLetterKeyTK(letter))
.Union(GetDefaultLetterKeyVI(letter))
.Union(GetDefaultLetterKeySPECIAL(letter))
.ToArray();
_allLanguagesCache[letter] = cachedValue;
}
return cachedValue;
}
// Contains all characters that should be shown in all languages but currently don't belong to any of the single languages available for that letter.
// These characters can be removed from this list after they've been added to one of the other languages for that specific letter.
private static string[] GetDefaultLetterKeySPECIAL(LetterKey letter)
{
return letter switch
{
LetterKey.VK_0 => new[] { "₀", "⁰", "°", "↉" },
LetterKey.VK_1 => new[] { "₁", "¹", "½", "⅓", "¼", "⅕", "⅙", "⅐", "⅛", "⅑", "⅒" },
LetterKey.VK_2 => new[] { "₂", "²", "⅔", "⅖" },
LetterKey.VK_3 => new[] { "₃", "³", "¾", "⅗", "⅜" },
LetterKey.VK_4 => new[] { "₄", "⁴", "⅘" },
LetterKey.VK_5 => new[] { "₅", "⁵", "⅚", "⅝" },
LetterKey.VK_6 => new[] { "₆", "⁶" },
LetterKey.VK_7 => new[] { "₇", "⁷", "⅞" },
LetterKey.VK_8 => new[] { "₈", "⁸", "∞" },
LetterKey.VK_9 => new[] { "₉", "⁹" },
LetterKey.VK_A => new[] { "ȧ", "ǽ", "∀" },
LetterKey.VK_B => new[] { "ḃ" },
LetterKey.VK_C => new[] { "ċ", "°C", "©", "", "∁" },
LetterKey.VK_D => new[] { "ḍ", "ḋ", "∂" },
LetterKey.VK_E => new[] { "∈", "∃", "∄", "∉", "ĕ" },
LetterKey.VK_F => new[] { "ḟ", "°F" },
LetterKey.VK_G => new[] { "ģ", "ǧ", "ġ", "ĝ", "ǥ" },
LetterKey.VK_H => new[] { "ḣ", "ĥ", "ħ" },
LetterKey.VK_J => new[] { "ĵ" },
LetterKey.VK_K => new[] { "ķ", "ǩ" },
LetterKey.VK_L => new[] { "ļ", "₺" }, // ₺ is in VK_T for other languages, but not VK_L, so we add it here.
LetterKey.VK_M => new[] { "ṁ" },
LetterKey.VK_N => new[] { "ņ", "ṅ", "ⁿ", "", "№" },
LetterKey.VK_O => new[] { "ȯ", "∅" },
LetterKey.VK_P => new[] { "ṗ", "℗", "∏", "¶" },
LetterKey.VK_Q => new[] { "" },
LetterKey.VK_R => new[] { "ṙ", "®", "" },
LetterKey.VK_S => new[] { "ṡ", "§", "∑", "∫" },
LetterKey.VK_T => new[] { "ţ", "ṫ", "ŧ", "™" },
LetterKey.VK_U => new[] { "ŭ" },
LetterKey.VK_V => new[] { "V̇" },
LetterKey.VK_W => new[] { "ẇ" },
LetterKey.VK_X => new[] { "ẋ", "×" },
LetterKey.VK_Y => new[] { "ẏ", "ꝡ" },
LetterKey.VK_Z => new[] { "ʒ", "ǯ", "" },
LetterKey.VK_COMMA => new[] { "∙", "₋", "⁻", "", "√" }, // is in VK_MINUS for other languages, but not VK_COMMA, so we add it here.
LetterKey.VK_PERIOD => new[] { "…", "⁝", "\u0300", "\u0301", "\u0302", "\u0303", "\u0304", "\u0308", "\u030B", "\u030C" },
LetterKey.VK_MINUS => new[] { "~", "", "", "", "—", "―", "", "", "⸺", "⸻", "∓" },
LetterKey.VK_SLASH_ => new[] { "÷", "√" },
LetterKey.VK_DIVIDE_ => new[] { "÷", "√" },
LetterKey.VK_MULTIPLY_ => new[] { "×", "⋅" },
LetterKey.VK_PLUS => new[] { "≤", "≥", "≠", "≈", "≙", "⊕", "⊗", "∓", "≅", "≡" },
LetterKey.VK_BACKSLASH => new[] { "`", "~" },
_ => Array.Empty<string>(),
};
}
// Bulgarian
private static string[] GetDefaultLetterKeyBG(LetterKey letter)
{
return letter switch
{
LetterKey.VK_I => new[] { "й" },
_ => Array.Empty<string>(),
};
}
// Crimean Tatar
private static string[] GetDefaultLetterKeyCRH(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "â" },
LetterKey.VK_C => new[] { "ç" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_G => new[] { "ğ" },
LetterKey.VK_H => new[] { "₴" },
LetterKey.VK_I => new[] { "ı", "İ" },
LetterKey.VK_N => new[] { "ñ" },
LetterKey.VK_O => new[] { "ö" },
LetterKey.VK_S => new[] { "ş" },
LetterKey.VK_T => new[] { "₺" },
LetterKey.VK_U => new[] { "ü" },
_ => Array.Empty<string>(),
};
}
// Currencies (source: https://www.eurochange.co.uk/travel-money/world-currency-abbreviations-symbols-and-codes-travel-money)
private static string[] GetDefaultLetterKeyCUR(LetterKey letter)
{
return letter switch
{
LetterKey.VK_B => new[] { "฿", "в" },
LetterKey.VK_C => new[] { "¢", "₡", "č" },
LetterKey.VK_D => new[] { "₫" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_F => new[] { "ƒ" },
LetterKey.VK_H => new[] { "₴" },
LetterKey.VK_K => new[] { "₭" },
LetterKey.VK_L => new[] { "ł" },
LetterKey.VK_N => new[] { "л" },
LetterKey.VK_M => new[] { "₼" },
LetterKey.VK_P => new[] { "£", "₽" },
LetterKey.VK_R => new[] { "₹", "៛", "﷼" },
LetterKey.VK_S => new[] { "$", "₪" },
LetterKey.VK_T => new[] { "₮", "₺", "₸" },
LetterKey.VK_W => new[] { "₩" },
LetterKey.VK_Y => new[] { "¥" },
LetterKey.VK_Z => new[] { "z" },
_ => Array.Empty<string>(),
};
}
// Croatian
private static string[] GetDefaultLetterKeyHR(LetterKey letter)
{
return letter switch
{
LetterKey.VK_C => new[] { "ć", "č" },
LetterKey.VK_D => new[] { "đ" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_S => new[] { "š" },
LetterKey.VK_Z => new[] { "ž" },
_ => Array.Empty<string>(),
};
}
// Estonian
private static string[] GetDefaultLetterKeyEST(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ä" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_O => new[] { "ö", "õ" },
LetterKey.VK_U => new[] { "ü" },
LetterKey.VK_Z => new[] { "ž" },
LetterKey.VK_S => new[] { "š" },
_ => Array.Empty<string>(),
};
}
// Esperanto
private static string[] GetDefaultLetterKeyEPO(LetterKey letter)
{
return letter switch
{
LetterKey.VK_C => new[] { "ĉ" },
LetterKey.VK_G => new[] { "ĝ" },
LetterKey.VK_H => new[] { "ĥ" },
LetterKey.VK_J => new[] { "ĵ" },
LetterKey.VK_S => new[] { "ŝ" },
LetterKey.VK_U => new[] { "ŭ" },
_ => Array.Empty<string>(),
};
}
// Finnish
private static string[] GetDefaultLetterKeyFI(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ä", "å" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_O => new[] { "ö" },
_ => Array.Empty<string>(),
};
}
// French
private static string[] GetDefaultLetterKeyFR(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "à", "â", "á", "ä", "ã", "æ" },
LetterKey.VK_C => new[] { "ç" },
LetterKey.VK_E => new[] { "é", "è", "ê", "ë", "€" },
LetterKey.VK_I => new[] { "î", "ï", "í", "ì" },
LetterKey.VK_O => new[] { "ô", "ö", "ó", "ò", "õ", "œ" },
LetterKey.VK_U => new[] { "û", "ù", "ü", "ú" },
LetterKey.VK_Y => new[] { "ÿ", "ý" },
_ => Array.Empty<string>(),
};
}
// Iceland
private static string[] GetDefaultLetterKeyIS(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á", "æ" },
LetterKey.VK_D => new[] { "ð" },
LetterKey.VK_E => new[] { "é" },
LetterKey.VK_O => new[] { "ó", "ö" },
LetterKey.VK_U => new[] { "ú" },
LetterKey.VK_Y => new[] { "ý" },
LetterKey.VK_T => new[] { "þ" },
_ => Array.Empty<string>(),
};
}
// Spain
private static string[] GetDefaultLetterKeySP(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á" },
LetterKey.VK_E => new[] { "é", "€" },
LetterKey.VK_H => new[] { "ḥ" },
LetterKey.VK_I => new[] { "í" },
LetterKey.VK_L => new[] { "ḷ" },
LetterKey.VK_N => new[] { "ñ" },
LetterKey.VK_O => new[] { "ó" },
LetterKey.VK_U => new[] { "ú", "ü" },
LetterKey.VK_COMMA => new[] { "¿", "?", "¡", "!" },
_ => Array.Empty<string>(),
};
}
// Catalan
private static string[] GetDefaultLetterKeyCA(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "à", "á" },
LetterKey.VK_C => new[] { "ç" },
LetterKey.VK_E => new[] { "è", "é", "€" },
LetterKey.VK_I => new[] { "ì", "í", "ï" },
LetterKey.VK_N => new[] { "ñ" },
LetterKey.VK_O => new[] { "ò", "ó" },
LetterKey.VK_U => new[] { "ù", "ú", "ü" },
LetterKey.VK_L => new[] { "·" },
LetterKey.VK_COMMA => new[] { "¿", "?", "¡", "!" },
_ => Array.Empty<string>(),
};
}
// Maori
private static string[] GetDefaultLetterKeyMI(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ā" },
LetterKey.VK_E => new[] { "ē" },
LetterKey.VK_I => new[] { "ī" },
LetterKey.VK_O => new[] { "ō" },
LetterKey.VK_S => new[] { "$" },
LetterKey.VK_U => new[] { "ū" },
_ => Array.Empty<string>(),
};
}
// Dutch
private static string[] GetDefaultLetterKeyNL(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á", "à", "ä" },
LetterKey.VK_C => new[] { "ç" },
LetterKey.VK_E => new[] { "é", "è", "ë", "ê", "€" },
LetterKey.VK_I => new[] { "í", "ï", "î" },
LetterKey.VK_N => new[] { "ñ" },
LetterKey.VK_O => new[] { "ó", "ö", "ô" },
LetterKey.VK_U => new[] { "ú", "ü", "û" },
_ => Array.Empty<string>(),
};
}
// Pinyin
private static string[] GetDefaultLetterKeyPI(LetterKey letter)
{
return letter switch
{
LetterKey.VK_1 => new[] { "\u0304", "ˉ" },
LetterKey.VK_2 => new[] { "\u0301", "ˊ" },
LetterKey.VK_3 => new[] { "\u030c", "ˇ" },
LetterKey.VK_4 => new[] { "\u0300", "ˋ" },
LetterKey.VK_5 => new[] { "·" },
LetterKey.VK_A => new[] { "ā", "á", "ǎ", "à", "ɑ", "ɑ\u0304", "ɑ\u0301", "ɑ\u030c", "ɑ\u0300" },
LetterKey.VK_C => new[] { "ĉ" },
LetterKey.VK_E => new[] { "ē", "é", "ě", "è", "ê", "ê\u0304", "ế", "ê\u030c", "ề" },
LetterKey.VK_I => new[] { "ī", "í", "ǐ", "ì" },
LetterKey.VK_M => new[] { "m\u0304", "ḿ", "m\u030c", "m\u0300" },
LetterKey.VK_N => new[] { "n\u0304", "ń", "ň", "ǹ", "ŋ", "ŋ\u0304", "ŋ\u0301", "ŋ\u030c", "ŋ\u0300" },
LetterKey.VK_O => new[] { "ō", "ó", "ǒ", "ò" },
LetterKey.VK_S => new[] { "ŝ" },
LetterKey.VK_U => new[] { "ū", "ú", "ǔ", "ù", "ü", "ǖ", "ǘ", "ǚ", "ǜ" },
LetterKey.VK_V => new[] { "ü", "ǖ", "ǘ", "ǚ", "ǜ" },
LetterKey.VK_Y => new[] { "¥" },
LetterKey.VK_Z => new[] { "ẑ" },
_ => Array.Empty<string>(),
};
}
// Proto-Indo-European
private static string[] GetDefaultLetterKeyPIE(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ā" },
LetterKey.VK_E => new[] { "ē" },
LetterKey.VK_O => new[] { "ō" },
LetterKey.VK_K => new[] { "ḱ" },
LetterKey.VK_G => new[] { "ǵ" },
LetterKey.VK_R => new[] { "r̥" },
LetterKey.VK_L => new[] { "l̥" },
LetterKey.VK_M => new[] { "m̥" },
LetterKey.VK_N => new[] { "n̥" },
_ => Array.Empty<string>(),
};
}
// Turkish
private static string[] GetDefaultLetterKeyTK(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "â" },
LetterKey.VK_C => new[] { "ç" },
LetterKey.VK_E => new[] { "ë", "€" },
LetterKey.VK_G => new[] { "ğ" },
LetterKey.VK_I => new[] { "ı", "İ", "î", },
LetterKey.VK_O => new[] { "ö", "ô" },
LetterKey.VK_S => new[] { "ş" },
LetterKey.VK_T => new[] { "₺" },
LetterKey.VK_U => new[] { "ü", "û" },
_ => Array.Empty<string>(),
};
}
// Polish
private static string[] GetDefaultLetterKeyPL(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ą" },
LetterKey.VK_C => new[] { "ć" },
LetterKey.VK_E => new[] { "ę", "€" },
LetterKey.VK_L => new[] { "ł" },
LetterKey.VK_N => new[] { "ń" },
LetterKey.VK_O => new[] { "ó" },
LetterKey.VK_S => new[] { "ś" },
LetterKey.VK_Z => new[] { "ż", "ź" },
_ => Array.Empty<string>(),
};
}
// Portuguese
private static string[] GetDefaultLetterKeyPT(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á", "à", "â", "ã", "ª" },
LetterKey.VK_C => new[] { "ç" },
LetterKey.VK_E => new[] { "é", "ê", "€" },
LetterKey.VK_I => new[] { "í" },
LetterKey.VK_O => new[] { "ô", "ó", "õ", "º" },
LetterKey.VK_P => new[] { "π" },
LetterKey.VK_S => new[] { "$" },
LetterKey.VK_U => new[] { "ú" },
LetterKey.VK_COMMA => new[] { "≤", "≥", "≠", "≈", "≙", "±", "₊", "⁺" },
_ => Array.Empty<string>(),
};
}
// Middle Eastern Romanization
private static string[] GetDefaultLetterKeyROM(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á", "â", "ă", "ā" },
LetterKey.VK_B => new[] { "ḇ" },
LetterKey.VK_C => new[] { "č", "ç" },
LetterKey.VK_D => new[] { "ḑ", "ḍ", "ḏ", "ḏ\u0323" },
LetterKey.VK_E => new[] { "ê", "ě", "ĕ", "ē", "é", "ə" },
LetterKey.VK_G => new[] { "ġ", "ǧ", "ğ", "ḡ", "g\u0303", "g\u0331" },
LetterKey.VK_H => new[] { "ḧ", "ḩ", "ḥ", "ḫ", "h\u0331" },
LetterKey.VK_I => new[] { "í", "ı", "î", "ī", "ı\u0307\u0304" },
LetterKey.VK_J => new[] { "ǰ", "j\u0331" },
LetterKey.VK_K => new[] { "ḳ", "ḵ" },
LetterKey.VK_L => new[] { "ł" },
LetterKey.VK_N => new[] { "ⁿ", "ñ" },
LetterKey.VK_O => new[] { "ó", "ô", "ö", "ŏ", "ō", "ȫ" },
LetterKey.VK_P => new[] { "p\u0304" },
LetterKey.VK_R => new[] { "ṙ", "ṛ" },
LetterKey.VK_S => new[] { "ś", "š", "ş", "ṣ", "s\u0331", "ṣ\u0304" },
LetterKey.VK_T => new[] { "ẗ", "ţ", "ṭ", "ṯ" },
LetterKey.VK_U => new[] { "ú", "û", "ü", "ū", "ǖ" },
LetterKey.VK_V => new[] { "v\u0307", "ṿ", "ᵛ" },
LetterKey.VK_Y => new[] { "̀y" },
LetterKey.VK_Z => new[] { "ż", "ž", "z\u0304", "z\u0327", "ẓ", "z\u0324", "ẕ" },
LetterKey.VK_PERIOD => new[] { "", "ʾ", "ʿ", "", "…" },
_ => Array.Empty<string>(),
};
}
// Slovak
private static string[] GetDefaultLetterKeySK(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á", "ä" },
LetterKey.VK_C => new[] { "č" },
LetterKey.VK_D => new[] { "ď" },
LetterKey.VK_E => new[] { "é", "€" },
LetterKey.VK_I => new[] { "í" },
LetterKey.VK_L => new[] { "ľ", "ĺ" },
LetterKey.VK_N => new[] { "ň" },
LetterKey.VK_O => new[] { "ó", "ô" },
LetterKey.VK_R => new[] { "ŕ" },
LetterKey.VK_S => new[] { "š" },
LetterKey.VK_T => new[] { "ť" },
LetterKey.VK_U => new[] { "ú" },
LetterKey.VK_Y => new[] { "ý" },
LetterKey.VK_Z => new[] { "ž" },
_ => Array.Empty<string>(),
};
}
// Gaeilge (Irish language)
private static string[] GetDefaultLetterKeyGA(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á" },
LetterKey.VK_E => new[] { "é", "€" },
LetterKey.VK_I => new[] { "í" },
LetterKey.VK_O => new[] { "ó" },
LetterKey.VK_U => new[] { "ú" },
_ => Array.Empty<string>(),
};
}
// Gàidhlig (Scottish Gaelic)
private static string[] GetDefaultLetterKeyGD(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "à" },
LetterKey.VK_E => new[] { "è" },
LetterKey.VK_I => new[] { "ì" },
LetterKey.VK_O => new[] { "ò" },
LetterKey.VK_P => new[] { "£" },
LetterKey.VK_U => new[] { "ù" },
_ => Array.Empty<string>(),
};
}
// Czech
private static string[] GetDefaultLetterKeyCZ(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á" },
LetterKey.VK_C => new[] { "č" },
LetterKey.VK_D => new[] { "ď" },
LetterKey.VK_E => new[] { "ě", "é" },
LetterKey.VK_I => new[] { "í" },
LetterKey.VK_N => new[] { "ň" },
LetterKey.VK_O => new[] { "ó" },
LetterKey.VK_R => new[] { "ř" },
LetterKey.VK_S => new[] { "š" },
LetterKey.VK_T => new[] { "ť" },
LetterKey.VK_U => new[] { "ů", "ú" },
LetterKey.VK_Y => new[] { "ý" },
LetterKey.VK_Z => new[] { "ž" },
_ => Array.Empty<string>(),
};
}
// German
private static string[] GetDefaultLetterKeyDE(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ä" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_O => new[] { "ö" },
LetterKey.VK_S => new[] { "ß" },
LetterKey.VK_U => new[] { "ü" },
_ => Array.Empty<string>(),
};
}
// Greek
private static string[] GetDefaultLetterKeyEL(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new string[] { "α", "ά" },
LetterKey.VK_B => new string[] { "β" },
LetterKey.VK_C => new string[] { "χ" },
LetterKey.VK_D => new string[] { "δ" },
LetterKey.VK_E => new string[] { "ε", "έ", "η", "ή" },
LetterKey.VK_F => new string[] { "φ" },
LetterKey.VK_G => new string[] { "γ" },
LetterKey.VK_I => new string[] { "ι", "ί" },
LetterKey.VK_K => new string[] { "κ" },
LetterKey.VK_L => new string[] { "λ" },
LetterKey.VK_M => new string[] { "μ" },
LetterKey.VK_N => new string[] { "ν" },
LetterKey.VK_O => new string[] { "ο", "ό", "ω", "ώ" },
LetterKey.VK_P => new string[] { "π", "φ", "ψ" },
LetterKey.VK_R => new string[] { "ρ" },
LetterKey.VK_S => new string[] { "σ", "ς" },
LetterKey.VK_T => new string[] { "τ", "θ", "ϑ" },
LetterKey.VK_U => new string[] { "υ", "ύ" },
LetterKey.VK_X => new string[] { "ξ" },
LetterKey.VK_Y => new string[] { "υ" },
LetterKey.VK_Z => new string[] { "ζ" },
_ => Array.Empty<string>(),
};
}
// Hebrew
private static string[] GetDefaultLetterKeyHE(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "שׂ", "שׁ", "\u05b0" },
LetterKey.VK_B => new[] { "׆" },
LetterKey.VK_E => new[] { "\u05b8", "\u05b3", "\u05bb" },
LetterKey.VK_G => new[] { "ױ" },
LetterKey.VK_H => new[] { "ײ", "ײַ", "ׯ", "\u05b4" },
LetterKey.VK_M => new[] { "\u05b5" },
LetterKey.VK_P => new[] { "\u05b7", "\u05b2" },
LetterKey.VK_S => new[] { "\u05bc" },
LetterKey.VK_T => new[] { "ﭏ" },
LetterKey.VK_U => new[] { "וֹ", "וּ", "װ", "\u05b9" },
LetterKey.VK_X => new[] { "\u05b6", "\u05b1" },
LetterKey.VK_Y => new[] { "ױ" },
LetterKey.VK_COMMA => new[] { "”", "", "״", "׳" },
LetterKey.VK_PERIOD => new[] { "\u05ab", "\u05bd", "\u05bf" },
LetterKey.VK_MINUS => new[] { "", "־" },
_ => Array.Empty<string>(),
};
}
// Hungarian
private static string[] GetDefaultLetterKeyHU(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "á" },
LetterKey.VK_E => new[] { "é" },
LetterKey.VK_I => new[] { "í" },
LetterKey.VK_O => new[] { "ó", "ő", "ö" },
LetterKey.VK_U => new[] { "ú", "ű", "ü" },
_ => Array.Empty<string>(),
};
}
// Romanian
private static string[] GetDefaultLetterKeyRO(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ă", "â" },
LetterKey.VK_I => new[] { "î" },
LetterKey.VK_S => new[] { "ș" },
LetterKey.VK_T => new[] { "ț" },
_ => Array.Empty<string>(),
};
}
// Italian
private static string[] GetDefaultLetterKeyIT(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "à" },
LetterKey.VK_E => new[] { "è", "é", "ə", "€" },
LetterKey.VK_I => new[] { "ì", "í" },
LetterKey.VK_O => new[] { "ò", "ó" },
LetterKey.VK_U => new[] { "ù", "ú" },
_ => Array.Empty<string>(),
};
}
// Kurdish
private static string[] GetDefaultLetterKeyKU(LetterKey letter)
{
return letter switch
{
LetterKey.VK_C => new[] { "ç" },
LetterKey.VK_E => new[] { "ê", "€" },
LetterKey.VK_I => new[] { "î" },
LetterKey.VK_O => new[] { "ö", "ô" },
LetterKey.VK_L => new[] { "ł" },
LetterKey.VK_N => new[] { "ň" },
LetterKey.VK_R => new[] { "ř" },
LetterKey.VK_S => new[] { "ş" },
LetterKey.VK_U => new[] { "û", "ü" },
_ => Array.Empty<string>(),
};
}
// Welsh
private static string[] GetDefaultLetterKeyCY(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "â", "ä", "à", "á" },
LetterKey.VK_E => new[] { "ê", "ë", "è", "é" },
LetterKey.VK_I => new[] { "î", "ï", "ì", "í" },
LetterKey.VK_O => new[] { "ô", "ö", "ò", "ó" },
LetterKey.VK_P => new[] { "£" },
LetterKey.VK_U => new[] { "û", "ü", "ù", "ú" },
LetterKey.VK_Y => new[] { "ŷ", "ÿ", "ỳ", "ý" },
LetterKey.VK_W => new[] { "ŵ", "ẅ", "ẁ", "ẃ" },
_ => Array.Empty<string>(),
};
}
// Swedish
private static string[] GetDefaultLetterKeySV(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "å", "ä" },
LetterKey.VK_E => new[] { "é" },
LetterKey.VK_O => new[] { "ö" },
_ => Array.Empty<string>(),
};
}
// Serbian
private static string[] GetDefaultLetterKeySR(LetterKey letter)
{
return letter switch
{
LetterKey.VK_C => new[] { "ć", "č" },
LetterKey.VK_D => new[] { "đ" },
LetterKey.VK_S => new[] { "š" },
LetterKey.VK_Z => new[] { "ž" },
_ => Array.Empty<string>(),
};
}
// Serbian Cyrillic
private static string[] GetDefaultLetterKeySRCyrillic(LetterKey letter)
{
return letter switch
{
LetterKey.VK_D => new[] { "ђ", "џ" },
LetterKey.VK_L => new[] { "љ" },
LetterKey.VK_N => new[] { "њ" },
LetterKey.VK_C => new[] { "ћ" },
_ => Array.Empty<string>(),
};
}
// Macedonian
private static string[] GetDefaultLetterKeyMK(LetterKey letter)
{
return letter switch
{
LetterKey.VK_E => new[] { "ѐ" },
LetterKey.VK_I => new[] { "ѝ" },
_ => Array.Empty<string>(),
};
}
// Maltese
private static string[] GetDefaultLetterKeyMT(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "à" },
LetterKey.VK_C => new[] { "ċ" },
LetterKey.VK_E => new[] { "è", "€" },
LetterKey.VK_G => new[] { "ġ" },
LetterKey.VK_H => new[] { "ħ" },
LetterKey.VK_I => new[] { "ì" },
LetterKey.VK_O => new[] { "ò" },
LetterKey.VK_U => new[] { "ù" },
LetterKey.VK_Z => new[] { "ż" },
_ => Array.Empty<string>(),
};
}
// Norwegian
private static string[] GetDefaultLetterKeyNO(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "å", "æ" },
LetterKey.VK_E => new[] { "€", "é" },
LetterKey.VK_O => new[] { "ø" },
LetterKey.VK_S => new[] { "$" },
_ => Array.Empty<string>(),
};
}
// Danish
private static string[] GetDefaultLetterKeyDK(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "å", "æ" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_O => new[] { "ø" },
_ => Array.Empty<string>(),
};
}
// Lithuanian
private static string[] GetDefaultLetterKeyLT(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ą" },
LetterKey.VK_C => new[] { "č" },
LetterKey.VK_E => new[] { "ę", "ė", "€" },
LetterKey.VK_I => new[] { "į" },
LetterKey.VK_S => new[] { "š" },
LetterKey.VK_U => new[] { "ų", "ū" },
LetterKey.VK_Z => new[] { "ž" },
_ => Array.Empty<string>(),
};
}
// Slovenian
private static string[] GetDefaultLetterKeySL(LetterKey letter)
{
return letter switch
{
LetterKey.VK_C => new[] { "č", "ć" },
LetterKey.VK_E => new[] { "€" },
LetterKey.VK_S => new[] { "š" },
LetterKey.VK_Z => new[] { "ž" },
_ => Array.Empty<string>(),
};
}
// Vietnamese
private static string[] GetDefaultLetterKeyVI(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "à", "ả", "ã", "á", "ạ", "ă", "ằ", "ẳ", "ẵ", "ắ", "ặ", "â", "ầ", "ẩ", "ẫ", "ấ", "ậ" },
LetterKey.VK_D => new[] { "đ" },
LetterKey.VK_E => new[] { "è", "ẻ", "ẽ", "é", "ẹ", "ê", "ề", "ể", "ễ", "ế", "ệ" },
LetterKey.VK_I => new[] { "ì", "ỉ", "ĩ", "í", "ị" },
LetterKey.VK_O => new[] { "ò", "ỏ", "õ", "ó", "ọ", "ô", "ồ", "ổ", "ỗ", "ố", "ộ", "ơ", "ờ", "ở", "ỡ", "ớ", "ợ" },
LetterKey.VK_U => new[] { "ù", "ủ", "ũ", "ú", "ụ", "ư", "ừ", "ử", "ữ", "ứ", "ự" },
LetterKey.VK_Y => new[] { "ỳ", "ỷ", "ỹ", "ý", "ỵ" },
_ => Array.Empty<string>(),
};
}
// IPA (International Phonetic Alphabet)
private static string[] GetDefaultLetterKeyIPA(LetterKey letter)
{
return letter switch
{
LetterKey.VK_A => new[] { "ɐ", "ɑ", "ɒ", "ǎ" },
LetterKey.VK_B => new[] { "ʙ" },
LetterKey.VK_E => new[] { "ɘ", "ɵ", "ə", "ɛ", "ɜ", "ɞ" },
LetterKey.VK_F => new[] { "ɟ", "ɸ" },
LetterKey.VK_G => new[] { "ɢ", "ɣ" },
LetterKey.VK_H => new[] { "ɦ", "ʜ" },
LetterKey.VK_I => new[] { "ɨ", "ɪ" },
LetterKey.VK_J => new[] { "ʝ" },
LetterKey.VK_L => new[] { "ɬ", "ɮ", "ꞎ", "ɭ", "ʎ", "ʟ", "ɺ" },
LetterKey.VK_N => new[] { "ɳ", "ɲ", "ŋ", "ɴ" },
LetterKey.VK_O => new[] { "ɤ", "ɔ", "ɶ", "ǒ" },
LetterKey.VK_R => new[] { "ʁ", "ɹ", "ɻ", "ɾ", "ɽ", "ʀ" },
LetterKey.VK_S => new[] { "ʃ", "ʂ", "ɕ" },
LetterKey.VK_U => new[] { "ʉ", "ʊ", "ǔ" },
LetterKey.VK_V => new[] { "ʋ", "ⱱ", "ʌ" },
LetterKey.VK_W => new[] { "ɰ", "ɯ" },
LetterKey.VK_Y => new[] { "ʏ" },
LetterKey.VK_Z => new[] { "ʒ", "ʐ", "ʑ" },
LetterKey.VK_COMMA => new[] { "ʡ", "ʔ", "ʕ", "ʢ" },
_ => Array.Empty<string>(),
};
}
}
}