From 494efb745e1578b58801443aaaaf88b5ad16004a Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Tue, 3 Mar 2026 13:44:51 +0800 Subject: [PATCH] 2 --- .../Resource/kb_keyboard_layouts_i18n.json | 592 ++++++++++++------ CustomKeyboard/View/KBKeyboardView.m | 18 +- 2 files changed, 431 insertions(+), 179 deletions(-) diff --git a/CustomKeyboard/Resource/kb_keyboard_layouts_i18n.json b/CustomKeyboard/Resource/kb_keyboard_layouts_i18n.json index 33a8397..1f011f3 100644 --- a/CustomKeyboard/Resource/kb_keyboard_layouts_i18n.json +++ b/CustomKeyboard/Resource/kb_keyboard_layouts_i18n.json @@ -1,11 +1,10 @@ { "__comment": "国际化键盘布局配置文件:各国语言的专用键盘布局", - "__comment_usage": "layoutJsonId 对应 kb_input_profiles.json 中的 layoutJsonId", + "__comment_usage": "每种语言包含 4 种布局:letters(字母)、letters_upper(大写字母)、numbers(数字)、symbols(符号)", "layouts": { "letters_es": { - "__comment": "西班牙语(拉丁美洲)键盘布局", - "__comment_features": "包含 Ñ 键,支持 áéíóúü 等重音符号", + "__comment": "西班牙语(拉丁美洲)键盘布局 - 小写字母", "rows": [ { "align": "left", @@ -33,16 +32,9 @@ "insetRight": 4, "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], - "center": [ - "letter:z", "letter:x", "letter:c", "letter:v", "letter:b", - "letter:n", "letter:m" - ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:z", "letter:x", "letter:c", "letter:v", "letter:b", "letter:n", "letter:m"], + "right": [{ "id": "backspace", "width": "controlWidth" }] } }, { @@ -50,9 +42,7 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_123", "emoji", "space", "send"] } ], "shiftRows": [ @@ -82,16 +72,9 @@ "insetRight": 4, "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], - "center": [ - "letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", - "letter:N", "letter:M" - ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", "letter:N", "letter:M"], + "right": [{ "id": "backspace", "width": "controlWidth" }] } }, { @@ -99,9 +82,7 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_123", "emoji", "space", "send"] } ], "longPress": { @@ -118,46 +99,38 @@ } }, - "letters_pt": { - "__comment": "葡萄牙语键盘布局", - "__comment_features": "支持 ã, õ, ç, á, é, í, ó, ú 等重音符号", + "letters_es_numbers": { + "__comment": "西班牙语 - 数字面板(123 页)", "rows": [ { "align": "left", "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "letter:q", "letter:w", "letter:e", "letter:r", "letter:t", - "letter:y", "letter:u", "letter:i", "letter:o", "letter:p" - ] - }, - { - "align": "center", - "insetLeft": 0, - "insetRight": 0, - "gap": 5, - "items": [ - "letter:a", "letter:s", "letter:d", "letter:f", "letter:g", - "letter:h", "letter:j", "letter:k", "letter:l" - ] + "items": ["digit:1", "digit:2", "digit:3", "digit:4", "digit:5", "digit:6", "digit:7", "digit:8", "digit:9", "digit:0"] }, { "align": "left", "insetLeft": 4, "insetRight": 4, "gap": 5, + "items": ["sym:-", "sym:/", "sym::", "sym:;", "sym:(", "sym:)", "sym:$", "sym:&", "sym:@", "sym:\""] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], + "left": [{ "id": "symbols_toggle_more", "width": "symbolsSideWidth" }], "center": [ - "letter:z", "letter:x", "letter:c", "letter:v", "letter:b", - "letter:n", "letter:m" + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] } }, { @@ -165,9 +138,89 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_abc", "emoji", "space", "send"] + } + ] + }, + + "letters_es_symbols": { + "__comment": "西班牙语 - 符号面板(#+= 页)", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:[", "sym:]", "sym:{", "sym:}", "sym:#", "sym:%", "sym:^", "sym:*", "sym:+", "sym:="] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:_", "sym:\\", "sym:|", "sym:~", "sym:<", "sym:>", "sym:€", "sym:£", "sym:¥", "sym:·"] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "symbols_toggle_123", "width": "symbolsSideWidth" }], + "center": [ + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } + ], + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_abc", "emoji", "space", "send"] + } + ] + }, + + "letters_pt": { + "__comment": "葡萄牙语键盘布局 - 小写字母", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["letter:q", "letter:w", "letter:e", "letter:r", "letter:t", "letter:y", "letter:u", "letter:i", "letter:o", "letter:p"] + }, + { + "align": "center", + "insetLeft": 0, + "insetRight": 0, + "gap": 5, + "items": ["letter:a", "letter:s", "letter:d", "letter:f", "letter:g", "letter:h", "letter:j", "letter:k", "letter:l"] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:z", "letter:x", "letter:c", "letter:v", "letter:b", "letter:n", "letter:m"], + "right": [{ "id": "backspace", "width": "controlWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_123", "emoji", "space", "send"] } ], "shiftRows": [ @@ -176,20 +229,14 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "letter:Q", "letter:W", "letter:E", "letter:R", "letter:T", - "letter:Y", "letter:U", "letter:I", "letter:O", "letter:P" - ] + "items": ["letter:Q", "letter:W", "letter:E", "letter:R", "letter:T", "letter:Y", "letter:U", "letter:I", "letter:O", "letter:P"] }, { "align": "center", "insetLeft": 0, "insetRight": 0, "gap": 5, - "items": [ - "letter:A", "letter:S", "letter:D", "letter:F", "letter:G", - "letter:H", "letter:J", "letter:K", "letter:L" - ] + "items": ["letter:A", "letter:S", "letter:D", "letter:F", "letter:G", "letter:H", "letter:J", "letter:K", "letter:L"] }, { "align": "left", @@ -197,16 +244,9 @@ "insetRight": 4, "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], - "center": [ - "letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", - "letter:N", "letter:M" - ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", "letter:N", "letter:M"], + "right": [{ "id": "backspace", "width": "controlWidth" }] } }, { @@ -214,9 +254,7 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_123", "emoji", "space", "send"] } ], "longPress": { @@ -230,46 +268,38 @@ } }, - "letters_id": { - "__comment": "印尼语键盘布局", - "__comment_features": "与英文 QWERTY 相同,支持印尼语特殊字符", + "letters_pt_numbers": { + "__comment": "葡萄牙语 - 数字面板(123 页)", "rows": [ { "align": "left", "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "letter:q", "letter:w", "letter:e", "letter:r", "letter:t", - "letter:y", "letter:u", "letter:i", "letter:o", "letter:p" - ] - }, - { - "align": "center", - "insetLeft": 0, - "insetRight": 0, - "gap": 5, - "items": [ - "letter:a", "letter:s", "letter:d", "letter:f", "letter:g", - "letter:h", "letter:j", "letter:k", "letter:l" - ] + "items": ["digit:1", "digit:2", "digit:3", "digit:4", "digit:5", "digit:6", "digit:7", "digit:8", "digit:9", "digit:0"] }, { "align": "left", "insetLeft": 4, "insetRight": 4, "gap": 5, + "items": ["sym:-", "sym:/", "sym::", "sym:;", "sym:(", "sym:)", "sym:€", "sym:&", "sym:@", "sym:\""] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], + "left": [{ "id": "symbols_toggle_more", "width": "symbolsSideWidth" }], "center": [ - "letter:z", "letter:x", "letter:c", "letter:v", "letter:b", - "letter:n", "letter:m" + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] } }, { @@ -277,9 +307,89 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_abc", "emoji", "space", "send"] + } + ] + }, + + "letters_pt_symbols": { + "__comment": "葡萄牙语 - 符号面板(#+= 页)", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:[", "sym:]", "sym:{", "sym:}", "sym:#", "sym:%", "sym:^", "sym:*", "sym:+", "sym:="] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:_", "sym:\\", "sym:|", "sym:~", "sym:<", "sym:>", "sym:$", "sym:£", "sym:¥", "sym:·"] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "symbols_toggle_123", "width": "symbolsSideWidth" }], + "center": [ + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } + ], + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_abc", "emoji", "space", "send"] + } + ] + }, + + "letters_id": { + "__comment": "印尼语键盘布局 - 小写字母", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["letter:q", "letter:w", "letter:e", "letter:r", "letter:t", "letter:y", "letter:u", "letter:i", "letter:o", "letter:p"] + }, + { + "align": "center", + "insetLeft": 0, + "insetRight": 0, + "gap": 5, + "items": ["letter:a", "letter:s", "letter:d", "letter:f", "letter:g", "letter:h", "letter:j", "letter:k", "letter:l"] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:z", "letter:x", "letter:c", "letter:v", "letter:b", "letter:n", "letter:m"], + "right": [{ "id": "backspace", "width": "controlWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_123", "emoji", "space", "send"] } ], "shiftRows": [ @@ -288,20 +398,14 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "letter:Q", "letter:W", "letter:E", "letter:R", "letter:T", - "letter:Y", "letter:U", "letter:I", "letter:O", "letter:P" - ] + "items": ["letter:Q", "letter:W", "letter:E", "letter:R", "letter:T", "letter:Y", "letter:U", "letter:I", "letter:O", "letter:P"] }, { "align": "center", "insetLeft": 0, "insetRight": 0, "gap": 5, - "items": [ - "letter:A", "letter:S", "letter:D", "letter:F", "letter:G", - "letter:H", "letter:J", "letter:K", "letter:L" - ] + "items": ["letter:A", "letter:S", "letter:D", "letter:F", "letter:G", "letter:H", "letter:J", "letter:K", "letter:L"] }, { "align": "left", @@ -309,16 +413,9 @@ "insetRight": 4, "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], - "center": [ - "letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", - "letter:N", "letter:M" - ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", "letter:N", "letter:M"], + "right": [{ "id": "backspace", "width": "controlWidth" }] } }, { @@ -326,9 +423,7 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_123", "emoji", "space", "send"] } ], "longPress": { @@ -342,46 +437,38 @@ } }, - "letters_zh_hant_pinyin": { - "__comment": "繁体中文拼音布局", - "__comment_features": "与英文 QWERTY 相同,联想输出繁体字", + "letters_id_numbers": { + "__comment": "印尼语 - 数字面板(123 页)", "rows": [ { "align": "left", "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "letter:q", "letter:w", "letter:e", "letter:r", "letter:t", - "letter:y", "letter:u", "letter:i", "letter:o", "letter:p" - ] - }, - { - "align": "center", - "insetLeft": 0, - "insetRight": 0, - "gap": 5, - "items": [ - "letter:a", "letter:s", "letter:d", "letter:f", "letter:g", - "letter:h", "letter:j", "letter:k", "letter:l" - ] + "items": ["digit:1", "digit:2", "digit:3", "digit:4", "digit:5", "digit:6", "digit:7", "digit:8", "digit:9", "digit:0"] }, { "align": "left", "insetLeft": 4, "insetRight": 4, "gap": 5, + "items": ["sym:-", "sym:/", "sym::", "sym:;", "sym:(", "sym:)", "sym:Rp", "sym:&", "sym:@", "sym:\""] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], + "left": [{ "id": "symbols_toggle_more", "width": "symbolsSideWidth" }], "center": [ - "letter:z", "letter:x", "letter:c", "letter:v", "letter:b", - "letter:n", "letter:m" + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] } }, { @@ -389,9 +476,89 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_abc", "emoji", "space", "send"] + } + ] + }, + + "letters_id_symbols": { + "__comment": "印尼语 - 符号面板(#+= 页)", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:[", "sym:]", "sym:{", "sym:}", "sym:#", "sym:%", "sym:^", "sym:*", "sym:+", "sym:="] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:_", "sym:\\", "sym:|", "sym:~", "sym:<", "sym:>", "sym:Rp", "sym:$", "sym:€", "sym:·"] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "symbols_toggle_123", "width": "symbolsSideWidth" }], + "center": [ + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } + ], + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_abc", "emoji", "space", "send"] + } + ] + }, + + "letters_zh_hant_pinyin": { + "__comment": "繁体中文拼音布局 - 小写字母", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["letter:q", "letter:w", "letter:e", "letter:r", "letter:t", "letter:y", "letter:u", "letter:i", "letter:o", "letter:p"] + }, + { + "align": "center", + "insetLeft": 0, + "insetRight": 0, + "gap": 5, + "items": ["letter:a", "letter:s", "letter:d", "letter:f", "letter:g", "letter:h", "letter:j", "letter:k", "letter:l"] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:z", "letter:x", "letter:c", "letter:v", "letter:b", "letter:n", "letter:m"], + "right": [{ "id": "backspace", "width": "controlWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_123", "emoji", "space", "send"] } ], "shiftRows": [ @@ -400,20 +567,14 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "letter:Q", "letter:W", "letter:E", "letter:R", "letter:T", - "letter:Y", "letter:U", "letter:I", "letter:O", "letter:P" - ] + "items": ["letter:Q", "letter:W", "letter:E", "letter:R", "letter:T", "letter:Y", "letter:U", "letter:I", "letter:O", "letter:P"] }, { "align": "center", "insetLeft": 0, "insetRight": 0, "gap": 5, - "items": [ - "letter:A", "letter:S", "letter:D", "letter:F", "letter:G", - "letter:H", "letter:J", "letter:K", "letter:L" - ] + "items": ["letter:A", "letter:S", "letter:D", "letter:F", "letter:G", "letter:H", "letter:J", "letter:K", "letter:L"] }, { "align": "left", @@ -421,16 +582,9 @@ "insetRight": 4, "gap": 5, "segments": { - "left": [ - { "id": "shift", "width": "controlWidth" } - ], - "center": [ - "letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", - "letter:N", "letter:M" - ], - "right": [ - { "id": "backspace", "width": "controlWidth" } - ] + "left": [{ "id": "shift", "width": "controlWidth" }], + "center": ["letter:Z", "letter:X", "letter:C", "letter:V", "letter:B", "letter:N", "letter:M"], + "right": [{ "id": "backspace", "width": "controlWidth" }] } }, { @@ -438,9 +592,95 @@ "insetLeft": 4, "insetRight": 4, "gap": 5, - "items": [ - "mode_123", "emoji", "space", "send" - ] + "items": ["mode_123", "emoji", "space", "send"] + } + ] + }, + + "letters_zh_hant_pinyin_numbers": { + "__comment": "繁体中文 - 数字面板(123 页)", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["digit:1", "digit:2", "digit:3", "digit:4", "digit:5", "digit:6", "digit:7", "digit:8", "digit:9", "digit:0"] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:-", "sym:/", "sym::", "sym:;", "sym:(", "sym:)", "sym:NT$", "sym:&", "sym:@", "sym:\""] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "symbols_toggle_more", "width": "symbolsSideWidth" }], + "center": [ + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } + ], + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_abc", "emoji", "space", "send"] + } + ] + }, + + "letters_zh_hant_pinyin_symbols": { + "__comment": "繁体中文 - 符号面板(#+= 页)", + "rows": [ + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:[", "sym:]", "sym:{", "sym:}", "sym:#", "sym:%", "sym:^", "sym:*", "sym:+", "sym:="] + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["sym:_", "sym:\\", "sym:|", "sym:~", "sym:<", "sym:>", "sym:NT$", "sym:$", "sym:€", "sym:·"] + }, + { + "align": "center", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "segments": { + "left": [{ "id": "symbols_toggle_123", "width": "symbolsSideWidth" }], + "center": [ + { "id": "sym:.", "width": "symbolsWideWidth" }, + { "id": "sym:,", "width": "symbolsWideWidth" }, + { "id": "sym:?", "width": "symbolsWideWidth" }, + { "id": "sym:!", "width": "symbolsWideWidth" }, + { "id": "sym:'", "width": "symbolsWideWidth" } + ], + "right": [{ "id": "backspace", "width": "symbolsSideWidth" }] + } + }, + { + "align": "left", + "insetLeft": 4, + "insetRight": 4, + "gap": 5, + "items": ["mode_abc", "emoji", "space", "send"] } ] } diff --git a/CustomKeyboard/View/KBKeyboardView.m b/CustomKeyboard/View/KBKeyboardView.m index a8bc77e..faf757a 100644 --- a/CustomKeyboard/View/KBKeyboardView.m +++ b/CustomKeyboard/View/KBKeyboardView.m @@ -889,12 +889,24 @@ edgeSpacerMultiplier:(CGFloat)edgeSpacerMultiplier { } - (KBKeyboardLayout *)kb_currentLayout { + NSString *baseLayoutName = self.currentLayoutJsonId.length > 0 ? self.currentLayoutJsonId : @"letters"; + if (self.layoutStyle == KBKeyboardLayoutStyleNumbers) { + // 优先查找当前语言的数字/符号布局,如 letters_es_numbers / letters_es_symbols + // 如果不存在,回退到通用布局 numbers / symbolsMore + NSString *numbersName = [NSString stringWithFormat:@"%@_numbers", baseLayoutName]; + NSString *symbolsName = [NSString stringWithFormat:@"%@_symbols", baseLayoutName]; + NSString *targetName = self.symbolsMoreOn ? symbolsName : numbersName; + + KBKeyboardLayout *layout = [self kb_layoutForName:targetName]; + if (layout && layout.rows.count >= 4) { + return layout; + } + // 回退到通用布局 return [self kb_layoutForName:(self.symbolsMoreOn ? @"symbolsMore" : @"numbers")]; } - // 使用当前设置的 layoutJsonId,如果为空则回退到 "letters" - NSString *layoutName = self.currentLayoutJsonId.length > 0 ? self.currentLayoutJsonId : @"letters"; - return [self kb_layoutForName:layoutName]; + + return [self kb_layoutForName:baseLayoutName]; } - (void)reloadLayoutWithProfileId:(NSString *)profileId {