Add LLM configuration and MCP server management UI and backend functionality

- Implemented a new SPA page for LLM Bridge and MCP Server settings in `llm-config.js`.
- Added functionality for managing LLM and MCP configurations, including toggling, saving settings, and testing connections.
- Created HTTP endpoints in `llm_utils.py` for handling LLM chat, status checks, and MCP server configuration.
- Integrated model fetching from LaRuche and Ollama backends.
- Enhanced error handling and logging for better debugging and user feedback.
This commit is contained in:
infinition
2026-03-16 20:33:22 +01:00
parent aac77a3e76
commit b759ab6d4b
41 changed files with 9991 additions and 397 deletions

422
loki/layouts/de.json Normal file
View File

@@ -0,0 +1,422 @@
{
"a": [
0,
4
],
"b": [
0,
5
],
"c": [
0,
6
],
"d": [
0,
7
],
"e": [
0,
8
],
"f": [
0,
9
],
"g": [
0,
10
],
"h": [
0,
11
],
"i": [
0,
12
],
"j": [
0,
13
],
"k": [
0,
14
],
"l": [
0,
15
],
"m": [
0,
16
],
"n": [
0,
17
],
"o": [
0,
18
],
"p": [
0,
19
],
"q": [
0,
20
],
"r": [
0,
21
],
"s": [
0,
22
],
"t": [
0,
23
],
"u": [
0,
24
],
"v": [
0,
25
],
"w": [
0,
26
],
"x": [
0,
27
],
"y": [
0,
29
],
"z": [
0,
28
],
"A": [
2,
4
],
"B": [
2,
5
],
"C": [
2,
6
],
"D": [
2,
7
],
"E": [
2,
8
],
"F": [
2,
9
],
"G": [
2,
10
],
"H": [
2,
11
],
"I": [
2,
12
],
"J": [
2,
13
],
"K": [
2,
14
],
"L": [
2,
15
],
"M": [
2,
16
],
"N": [
2,
17
],
"O": [
2,
18
],
"P": [
2,
19
],
"Q": [
2,
20
],
"R": [
2,
21
],
"S": [
2,
22
],
"T": [
2,
23
],
"U": [
2,
24
],
"V": [
2,
25
],
"W": [
2,
26
],
"X": [
2,
27
],
"Y": [
2,
29
],
"Z": [
2,
28
],
"1": [
0,
30
],
"2": [
0,
31
],
"3": [
0,
32
],
"4": [
0,
33
],
"5": [
0,
34
],
"6": [
0,
35
],
"7": [
0,
36
],
"8": [
0,
37
],
"9": [
0,
38
],
"0": [
0,
39
],
"!": [
2,
30
],
"@": [
2,
31
],
"#": [
0,
49
],
"$": [
2,
33
],
"%": [
2,
34
],
"^": [
2,
35
],
"&": [
2,
35
],
"*": [
2,
48
],
"(": [
2,
37
],
")": [
2,
38
],
"\n": [
0,
40
],
"\r": [
0,
40
],
"\t": [
0,
43
],
" ": [
0,
44
],
"-": [
0,
45
],
"_": [
2,
45
],
"=": [
2,
39
],
"+": [
0,
48
],
"[": [
0,
47
],
"{": [
2,
47
],
"]": [
0,
48
],
"}": [
2,
48
],
"\\": [
0,
49
],
"|": [
2,
49
],
";": [
0,
51
],
":": [
2,
51
],
"'": [
2,
49
],
"\"": [
2,
52
],
"`": [
0,
53
],
"~": [
2,
53
],
",": [
0,
54
],
"<": [
0,
100
],
".": [
0,
55
],
">": [
2,
100
],
"/": [
2,
36
],
"?": [
2,
45
],
"ß": [
0,
45
],
"ü": [
0,
47
],
"Ü": [
2,
47
],
"ö": [
0,
51
],
"Ö": [
2,
51
],
"ä": [
0,
52
],
"Ä": [
2,
52
]
}

426
loki/layouts/es.json Normal file
View File

@@ -0,0 +1,426 @@
{
"a": [
0,
4
],
"b": [
0,
5
],
"c": [
0,
6
],
"d": [
0,
7
],
"e": [
0,
8
],
"f": [
0,
9
],
"g": [
0,
10
],
"h": [
0,
11
],
"i": [
0,
12
],
"j": [
0,
13
],
"k": [
0,
14
],
"l": [
0,
15
],
"m": [
0,
16
],
"n": [
0,
17
],
"o": [
0,
18
],
"p": [
0,
19
],
"q": [
0,
20
],
"r": [
0,
21
],
"s": [
0,
22
],
"t": [
0,
23
],
"u": [
0,
24
],
"v": [
0,
25
],
"w": [
0,
26
],
"x": [
0,
27
],
"y": [
0,
28
],
"z": [
0,
29
],
"A": [
2,
4
],
"B": [
2,
5
],
"C": [
2,
6
],
"D": [
2,
7
],
"E": [
2,
8
],
"F": [
2,
9
],
"G": [
2,
10
],
"H": [
2,
11
],
"I": [
2,
12
],
"J": [
2,
13
],
"K": [
2,
14
],
"L": [
2,
15
],
"M": [
2,
16
],
"N": [
2,
17
],
"O": [
2,
18
],
"P": [
2,
19
],
"Q": [
2,
20
],
"R": [
2,
21
],
"S": [
2,
22
],
"T": [
2,
23
],
"U": [
2,
24
],
"V": [
2,
25
],
"W": [
2,
26
],
"X": [
2,
27
],
"Y": [
2,
28
],
"Z": [
2,
29
],
"1": [
0,
30
],
"2": [
0,
31
],
"3": [
0,
32
],
"4": [
0,
33
],
"5": [
0,
34
],
"6": [
0,
35
],
"7": [
0,
36
],
"8": [
0,
37
],
"9": [
0,
38
],
"0": [
0,
39
],
"!": [
2,
30
],
"@": [
2,
31
],
"#": [
2,
32
],
"$": [
2,
33
],
"%": [
2,
34
],
"^": [
2,
35
],
"&": [
2,
36
],
"*": [
2,
48
],
"(": [
2,
38
],
")": [
2,
39
],
"\n": [
0,
40
],
"\r": [
0,
40
],
"\t": [
0,
43
],
" ": [
0,
44
],
"-": [
0,
56
],
"_": [
2,
56
],
"=": [
0,
46
],
"+": [
0,
48
],
"[": [
0,
47
],
"{": [
2,
47
],
"]": [
0,
48
],
"}": [
2,
48
],
"\\": [
0,
49
],
"|": [
2,
49
],
";": [
0,
51
],
":": [
2,
51
],
"'": [
0,
45
],
"\"": [
2,
52
],
"`": [
0,
53
],
"~": [
2,
53
],
",": [
0,
54
],
"<": [
0,
100
],
".": [
0,
55
],
">": [
2,
100
],
"/": [
0,
56
],
"?": [
2,
45
],
"ñ": [
0,
51
],
"Ñ": [
2,
51
],
"ç": [
0,
49
],
"Ç": [
2,
49
],
"¡": [
0,
46
],
"¿": [
2,
46
],
"´": [
0,
47
],
"¨": [
2,
47
]
}

446
loki/layouts/fr.json Normal file
View File

@@ -0,0 +1,446 @@
{
"a": [
0,
20
],
"b": [
0,
5
],
"c": [
0,
6
],
"d": [
0,
7
],
"e": [
0,
8
],
"f": [
0,
9
],
"g": [
0,
10
],
"h": [
0,
11
],
"i": [
0,
12
],
"j": [
0,
13
],
"k": [
0,
14
],
"l": [
0,
15
],
"m": [
0,
51
],
"n": [
0,
17
],
"o": [
0,
18
],
"p": [
0,
19
],
"q": [
0,
4
],
"r": [
0,
21
],
"s": [
0,
22
],
"t": [
0,
23
],
"u": [
0,
24
],
"v": [
0,
25
],
"w": [
0,
29
],
"x": [
0,
27
],
"y": [
0,
28
],
"z": [
0,
26
],
"A": [
2,
20
],
"B": [
2,
5
],
"C": [
2,
6
],
"D": [
2,
7
],
"E": [
2,
8
],
"F": [
2,
9
],
"G": [
2,
10
],
"H": [
2,
11
],
"I": [
2,
12
],
"J": [
2,
13
],
"K": [
2,
14
],
"L": [
2,
15
],
"M": [
2,
51
],
"N": [
2,
17
],
"O": [
2,
18
],
"P": [
2,
19
],
"Q": [
2,
4
],
"R": [
2,
21
],
"S": [
2,
22
],
"T": [
2,
23
],
"U": [
2,
24
],
"V": [
2,
25
],
"W": [
2,
29
],
"X": [
2,
27
],
"Y": [
2,
28
],
"Z": [
2,
26
],
"1": [
2,
30
],
"2": [
2,
31
],
"3": [
2,
32
],
"4": [
2,
33
],
"5": [
2,
34
],
"6": [
2,
35
],
"7": [
2,
36
],
"8": [
2,
37
],
"9": [
2,
38
],
"0": [
2,
39
],
"!": [
0,
56
],
"@": [
64,
39
],
"#": [
64,
32
],
"$": [
0,
48
],
"%": [
2,
52
],
"^": [
0,
47
],
"&": [
0,
30
],
"*": [
0,
49
],
"(": [
0,
34
],
")": [
0,
45
],
"\n": [
0,
40
],
"\r": [
0,
40
],
"\t": [
0,
43
],
" ": [
0,
44
],
"-": [
0,
35
],
"_": [
0,
37
],
"=": [
0,
46
],
"+": [
2,
46
],
"[": [
64,
34
],
"{": [
64,
33
],
"]": [
64,
45
],
"}": [
64,
46
],
"\\": [
64,
37
],
"|": [
64,
35
],
";": [
0,
54
],
":": [
0,
55
],
"'": [
0,
33
],
"\"": [
0,
32
],
"`": [
64,
36
],
"~": [
64,
31
],
",": [
0,
16
],
"<": [
0,
100
],
".": [
2,
54
],
">": [
2,
100
],
"/": [
2,
55
],
"?": [
2,
16
],
"é": [
0,
31
],
"è": [
0,
36
],
"ç": [
0,
38
],
"à": [
0,
39
],
"§": [
2,
56
],
"€": [
64,
8
],
"°": [
2,
45
],
"¨": [
2,
47
],
"£": [
2,
48
],
"¤": [
64,
48
],
"µ": [
2,
49
],
"ù": [
0,
52
],
"²": [
0,
53
]
}

View File

@@ -0,0 +1,78 @@
import json
import os
# Chargement de la base US existante
with open("us.json", "r") as f:
US_BASE = json.load(f)
# Définition des différences par rapport au clavier US
# 0 = Normal, 2 = Shift, 64 = AltGr (Right Alt)
LAYOUT_DIFFS = {
"fr": {
"a": [0, 20], "A": [2, 20], "q": [0, 4], "Q": [2, 4],
"z": [0, 26], "Z": [2, 26], "w": [0, 29], "W": [2, 29],
"m": [0, 51], "M": [2, 51],
"1": [2, 30], "2": [2, 31], "3": [2, 32], "4": [2, 33], "5": [2, 34],
"6": [2, 35], "7": [2, 36], "8": [2, 37], "9": [2, 38], "0": [2, 39],
"&": [0, 30], "é": [0, 31], "\"": [0, 32], "'": [0, 33], "(": [0, 34],
"-": [0, 35], "è": [0, 36], "_": [0, 37], "ç": [0, 38], "à": [0, 39],
"~": [64, 31], "#": [64, 32], "{": [64, 33], "[": [64, 34], "|": [64, 35],
"`": [64, 36], "\\": [64, 37], "^": [0, 47], "@": [64, 39], "]": [64, 45],
"}": [64, 46], "!": [0, 56], "§": [2, 56], "": [64, 8], ")": [0, 45],
"°": [2, 45], "=": [0, 46], "+": [2, 46], "¨": [2, 47], "$": [0, 48],
"£": [2, 48], "¤": [64, 48], "*": [0, 49], "µ": [2, 49], "ù": [0, 52],
"%": [2, 52], "²": [0, 53], ",": [0, 16], "?": [2, 16], ";": [0, 54],
".": [2, 54], ":": [0, 55], "/": [2, 55], "<": [0, 100], ">": [2, 100]
},
"uk": {
"\"": [2, 31], "@": [2, 52], "£": [2, 32], "~": [0, 50],
"#": [0, 49], "\\": [0, 100], "|": [2, 100]
},
"de": {
"y": [0, 29], "Y": [2, 29], "z": [0, 28], "Z": [2, 28],
"ß": [0, 45], "?": [2, 45], "ü": [0, 47], "Ü": [2, 47],
"+": [0, 48], "*": [2, 48], "ö": [0, 51], "Ö": [2, 51],
"ä": [0, 52], "Ä": [2, 52], "#": [0, 49], "'": [2, 49],
"&": [2, 35], "/": [2, 36], "(": [2, 37], ")": [2, 38],
"=": [2, 39], "<": [0, 100], ">": [2, 100]
},
"es": {
"ñ": [0, 51], "Ñ": [2, 51], "ç": [0, 49], "Ç": [2, 49],
"'": [0, 45], "?": [2, 45], "¡": [0, 46], "¿": [2, 46],
"´": [0, 47], "¨": [2, 47], "+": [0, 48], "*": [2, 48],
"<": [0, 100], ">": [2, 100], "-": [0, 56], "_": [2, 56]
},
"it": {
"ò": [0, 51], "ç": [2, 51], "à": [0, 52], "°": [2, 52],
"ù": [0, 49], "§": [2, 49], "è": [0, 47], "é": [2, 47],
"ì": [0, 46], "^": [2, 46], "'": [0, 45], "?": [2, 45],
"+": [0, 48], "*": [2, 48], "<": [0, 100], ">": [2, 100],
"-": [0, 56], "_": [2, 56]
},
"ru": {
"й": [0, 20], "ц": [0, 26], "у": [0, 8], "к": [0, 21], "е": [0, 23],
"н": [0, 28], "г": [0, 24], "ш": [0, 12], "щ": [0, 18], "з": [0, 19],
"х": [0, 47], "ъ": [0, 48], "ф": [0, 4], "ы": [0, 22], "в": [0, 7],
"а": [0, 4], "п": [0, 10], "р": [0, 11], "о": [0, 13], "л": [0, 14],
"д": [0, 15], "ж": [0, 51], "э": [0, 52], "я": [0, 29], "ч": [0, 27],
"с": [0, 6], "м": [0, 25], "и": [0, 5], "т": [0, 17], "ь": [0, 16],
"б": [0, 54], "ю": [0, 55], "ё": [0, 53], ".": [0, 56], ",": [2, 56],
"": [2, 32], ";": [2, 33], ":": [2, 35], "?": [2, 36]
},
"zh": {} # ZH utilise exactement le layout US
}
def generate_layouts():
for lang, diff in LAYOUT_DIFFS.items():
# Copie de la base US
new_layout = dict(US_BASE)
# Application des modifications
new_layout.update(diff)
filename = f"{lang}.json"
with open(filename, "w", encoding="utf-8") as f:
json.dump(new_layout, f, indent=4, ensure_ascii=False)
print(f"Généré : {filename} ({len(new_layout)} touches)")
if __name__ == "__main__":
generate_layouts()

430
loki/layouts/it.json Normal file
View File

@@ -0,0 +1,430 @@
{
"a": [
0,
4
],
"b": [
0,
5
],
"c": [
0,
6
],
"d": [
0,
7
],
"e": [
0,
8
],
"f": [
0,
9
],
"g": [
0,
10
],
"h": [
0,
11
],
"i": [
0,
12
],
"j": [
0,
13
],
"k": [
0,
14
],
"l": [
0,
15
],
"m": [
0,
16
],
"n": [
0,
17
],
"o": [
0,
18
],
"p": [
0,
19
],
"q": [
0,
20
],
"r": [
0,
21
],
"s": [
0,
22
],
"t": [
0,
23
],
"u": [
0,
24
],
"v": [
0,
25
],
"w": [
0,
26
],
"x": [
0,
27
],
"y": [
0,
28
],
"z": [
0,
29
],
"A": [
2,
4
],
"B": [
2,
5
],
"C": [
2,
6
],
"D": [
2,
7
],
"E": [
2,
8
],
"F": [
2,
9
],
"G": [
2,
10
],
"H": [
2,
11
],
"I": [
2,
12
],
"J": [
2,
13
],
"K": [
2,
14
],
"L": [
2,
15
],
"M": [
2,
16
],
"N": [
2,
17
],
"O": [
2,
18
],
"P": [
2,
19
],
"Q": [
2,
20
],
"R": [
2,
21
],
"S": [
2,
22
],
"T": [
2,
23
],
"U": [
2,
24
],
"V": [
2,
25
],
"W": [
2,
26
],
"X": [
2,
27
],
"Y": [
2,
28
],
"Z": [
2,
29
],
"1": [
0,
30
],
"2": [
0,
31
],
"3": [
0,
32
],
"4": [
0,
33
],
"5": [
0,
34
],
"6": [
0,
35
],
"7": [
0,
36
],
"8": [
0,
37
],
"9": [
0,
38
],
"0": [
0,
39
],
"!": [
2,
30
],
"@": [
2,
31
],
"#": [
2,
32
],
"$": [
2,
33
],
"%": [
2,
34
],
"^": [
2,
46
],
"&": [
2,
36
],
"*": [
2,
48
],
"(": [
2,
38
],
")": [
2,
39
],
"\n": [
0,
40
],
"\r": [
0,
40
],
"\t": [
0,
43
],
" ": [
0,
44
],
"-": [
0,
56
],
"_": [
2,
56
],
"=": [
0,
46
],
"+": [
0,
48
],
"[": [
0,
47
],
"{": [
2,
47
],
"]": [
0,
48
],
"}": [
2,
48
],
"\\": [
0,
49
],
"|": [
2,
49
],
";": [
0,
51
],
":": [
2,
51
],
"'": [
0,
45
],
"\"": [
2,
52
],
"`": [
0,
53
],
"~": [
2,
53
],
",": [
0,
54
],
"<": [
0,
100
],
".": [
0,
55
],
">": [
2,
100
],
"/": [
0,
56
],
"?": [
2,
45
],
"ò": [
0,
51
],
"ç": [
2,
51
],
"à": [
0,
52
],
"°": [
2,
52
],
"ù": [
0,
49
],
"§": [
2,
49
],
"è": [
0,
47
],
"é": [
2,
47
],
"ì": [
0,
46
]
}

530
loki/layouts/ru.json Normal file
View File

@@ -0,0 +1,530 @@
{
"a": [
0,
4
],
"b": [
0,
5
],
"c": [
0,
6
],
"d": [
0,
7
],
"e": [
0,
8
],
"f": [
0,
9
],
"g": [
0,
10
],
"h": [
0,
11
],
"i": [
0,
12
],
"j": [
0,
13
],
"k": [
0,
14
],
"l": [
0,
15
],
"m": [
0,
16
],
"n": [
0,
17
],
"o": [
0,
18
],
"p": [
0,
19
],
"q": [
0,
20
],
"r": [
0,
21
],
"s": [
0,
22
],
"t": [
0,
23
],
"u": [
0,
24
],
"v": [
0,
25
],
"w": [
0,
26
],
"x": [
0,
27
],
"y": [
0,
28
],
"z": [
0,
29
],
"A": [
2,
4
],
"B": [
2,
5
],
"C": [
2,
6
],
"D": [
2,
7
],
"E": [
2,
8
],
"F": [
2,
9
],
"G": [
2,
10
],
"H": [
2,
11
],
"I": [
2,
12
],
"J": [
2,
13
],
"K": [
2,
14
],
"L": [
2,
15
],
"M": [
2,
16
],
"N": [
2,
17
],
"O": [
2,
18
],
"P": [
2,
19
],
"Q": [
2,
20
],
"R": [
2,
21
],
"S": [
2,
22
],
"T": [
2,
23
],
"U": [
2,
24
],
"V": [
2,
25
],
"W": [
2,
26
],
"X": [
2,
27
],
"Y": [
2,
28
],
"Z": [
2,
29
],
"1": [
0,
30
],
"2": [
0,
31
],
"3": [
0,
32
],
"4": [
0,
33
],
"5": [
0,
34
],
"6": [
0,
35
],
"7": [
0,
36
],
"8": [
0,
37
],
"9": [
0,
38
],
"0": [
0,
39
],
"!": [
2,
30
],
"@": [
2,
31
],
"#": [
2,
32
],
"$": [
2,
33
],
"%": [
2,
34
],
"^": [
2,
35
],
"&": [
2,
36
],
"*": [
2,
37
],
"(": [
2,
38
],
")": [
2,
39
],
"\n": [
0,
40
],
"\r": [
0,
40
],
"\t": [
0,
43
],
" ": [
0,
44
],
"-": [
0,
45
],
"_": [
2,
45
],
"=": [
0,
46
],
"+": [
2,
46
],
"[": [
0,
47
],
"{": [
2,
47
],
"]": [
0,
48
],
"}": [
2,
48
],
"\\": [
0,
49
],
"|": [
2,
49
],
";": [
2,
33
],
":": [
2,
35
],
"'": [
0,
52
],
"\"": [
2,
52
],
"`": [
0,
53
],
"~": [
2,
53
],
",": [
2,
56
],
"<": [
2,
54
],
".": [
0,
56
],
">": [
2,
55
],
"/": [
0,
56
],
"?": [
2,
36
],
"й": [
0,
20
],
"ц": [
0,
26
],
"у": [
0,
8
],
"к": [
0,
21
],
"е": [
0,
23
],
"н": [
0,
28
],
"г": [
0,
24
],
"ш": [
0,
12
],
"щ": [
0,
18
],
"з": [
0,
19
],
"х": [
0,
47
],
"ъ": [
0,
48
],
"ф": [
0,
4
],
"ы": [
0,
22
],
"в": [
0,
7
],
"а": [
0,
4
],
"п": [
0,
10
],
"р": [
0,
11
],
"о": [
0,
13
],
"л": [
0,
14
],
"д": [
0,
15
],
"ж": [
0,
51
],
"э": [
0,
52
],
"я": [
0,
29
],
"ч": [
0,
27
],
"с": [
0,
6
],
"м": [
0,
25
],
"и": [
0,
5
],
"т": [
0,
17
],
"ь": [
0,
16
],
"б": [
0,
54
],
"ю": [
0,
55
],
"ё": [
0,
53
],
"№": [
2,
32
]
}

398
loki/layouts/uk.json Normal file
View File

@@ -0,0 +1,398 @@
{
"a": [
0,
4
],
"b": [
0,
5
],
"c": [
0,
6
],
"d": [
0,
7
],
"e": [
0,
8
],
"f": [
0,
9
],
"g": [
0,
10
],
"h": [
0,
11
],
"i": [
0,
12
],
"j": [
0,
13
],
"k": [
0,
14
],
"l": [
0,
15
],
"m": [
0,
16
],
"n": [
0,
17
],
"o": [
0,
18
],
"p": [
0,
19
],
"q": [
0,
20
],
"r": [
0,
21
],
"s": [
0,
22
],
"t": [
0,
23
],
"u": [
0,
24
],
"v": [
0,
25
],
"w": [
0,
26
],
"x": [
0,
27
],
"y": [
0,
28
],
"z": [
0,
29
],
"A": [
2,
4
],
"B": [
2,
5
],
"C": [
2,
6
],
"D": [
2,
7
],
"E": [
2,
8
],
"F": [
2,
9
],
"G": [
2,
10
],
"H": [
2,
11
],
"I": [
2,
12
],
"J": [
2,
13
],
"K": [
2,
14
],
"L": [
2,
15
],
"M": [
2,
16
],
"N": [
2,
17
],
"O": [
2,
18
],
"P": [
2,
19
],
"Q": [
2,
20
],
"R": [
2,
21
],
"S": [
2,
22
],
"T": [
2,
23
],
"U": [
2,
24
],
"V": [
2,
25
],
"W": [
2,
26
],
"X": [
2,
27
],
"Y": [
2,
28
],
"Z": [
2,
29
],
"1": [
0,
30
],
"2": [
0,
31
],
"3": [
0,
32
],
"4": [
0,
33
],
"5": [
0,
34
],
"6": [
0,
35
],
"7": [
0,
36
],
"8": [
0,
37
],
"9": [
0,
38
],
"0": [
0,
39
],
"!": [
2,
30
],
"@": [
2,
52
],
"#": [
0,
49
],
"$": [
2,
33
],
"%": [
2,
34
],
"^": [
2,
35
],
"&": [
2,
36
],
"*": [
2,
37
],
"(": [
2,
38
],
")": [
2,
39
],
"\n": [
0,
40
],
"\r": [
0,
40
],
"\t": [
0,
43
],
" ": [
0,
44
],
"-": [
0,
45
],
"_": [
2,
45
],
"=": [
0,
46
],
"+": [
2,
46
],
"[": [
0,
47
],
"{": [
2,
47
],
"]": [
0,
48
],
"}": [
2,
48
],
"\\": [
0,
100
],
"|": [
2,
100
],
";": [
0,
51
],
":": [
2,
51
],
"'": [
0,
52
],
"\"": [
2,
31
],
"`": [
0,
53
],
"~": [
0,
50
],
",": [
0,
54
],
"<": [
2,
54
],
".": [
0,
55
],
">": [
2,
55
],
"/": [
0,
56
],
"?": [
2,
56
],
"£": [
2,
32
]
}

394
loki/layouts/zh.json Normal file
View File

@@ -0,0 +1,394 @@
{
"a": [
0,
4
],
"b": [
0,
5
],
"c": [
0,
6
],
"d": [
0,
7
],
"e": [
0,
8
],
"f": [
0,
9
],
"g": [
0,
10
],
"h": [
0,
11
],
"i": [
0,
12
],
"j": [
0,
13
],
"k": [
0,
14
],
"l": [
0,
15
],
"m": [
0,
16
],
"n": [
0,
17
],
"o": [
0,
18
],
"p": [
0,
19
],
"q": [
0,
20
],
"r": [
0,
21
],
"s": [
0,
22
],
"t": [
0,
23
],
"u": [
0,
24
],
"v": [
0,
25
],
"w": [
0,
26
],
"x": [
0,
27
],
"y": [
0,
28
],
"z": [
0,
29
],
"A": [
2,
4
],
"B": [
2,
5
],
"C": [
2,
6
],
"D": [
2,
7
],
"E": [
2,
8
],
"F": [
2,
9
],
"G": [
2,
10
],
"H": [
2,
11
],
"I": [
2,
12
],
"J": [
2,
13
],
"K": [
2,
14
],
"L": [
2,
15
],
"M": [
2,
16
],
"N": [
2,
17
],
"O": [
2,
18
],
"P": [
2,
19
],
"Q": [
2,
20
],
"R": [
2,
21
],
"S": [
2,
22
],
"T": [
2,
23
],
"U": [
2,
24
],
"V": [
2,
25
],
"W": [
2,
26
],
"X": [
2,
27
],
"Y": [
2,
28
],
"Z": [
2,
29
],
"1": [
0,
30
],
"2": [
0,
31
],
"3": [
0,
32
],
"4": [
0,
33
],
"5": [
0,
34
],
"6": [
0,
35
],
"7": [
0,
36
],
"8": [
0,
37
],
"9": [
0,
38
],
"0": [
0,
39
],
"!": [
2,
30
],
"@": [
2,
31
],
"#": [
2,
32
],
"$": [
2,
33
],
"%": [
2,
34
],
"^": [
2,
35
],
"&": [
2,
36
],
"*": [
2,
37
],
"(": [
2,
38
],
")": [
2,
39
],
"\n": [
0,
40
],
"\r": [
0,
40
],
"\t": [
0,
43
],
" ": [
0,
44
],
"-": [
0,
45
],
"_": [
2,
45
],
"=": [
0,
46
],
"+": [
2,
46
],
"[": [
0,
47
],
"{": [
2,
47
],
"]": [
0,
48
],
"}": [
2,
48
],
"\\": [
0,
49
],
"|": [
2,
49
],
";": [
0,
51
],
":": [
2,
51
],
"'": [
0,
52
],
"\"": [
2,
52
],
"`": [
0,
53
],
"~": [
2,
53
],
",": [
0,
54
],
"<": [
2,
54
],
".": [
0,
55
],
">": [
2,
55
],
"/": [
0,
56
],
"?": [
2,
56
]
}