osfans / trime

同文安卓輸入法平臺3.x/Android-rime/Rime Input Method Engine for Android
http://osfans.github.io/trime/
GNU General Public License v3.0
2.93k stars 361 forks source link

同文内置多语言键盘label #738

Open tumuyan opened 2 years ago

tumuyan commented 2 years ago

Is your feature request related to a problem? Please describe. 目前键盘按键的label是在皮肤内写死的,无论是皮肤还是输入法,都没有多语言支持

Describe the solution you'd like 同文输入法内置多语言的按键配置信息,当皮肤未指定label或者皮肤指定键盘语言时,自动显示预设label。 这件事情可以得到额外的好处是可以减少预设按键的数量(为了显示label和按键气泡文字,不得不设置按键),同时进一步解决shift按下后的label的显示问题。 另外,同文虽然支持四向滑动及长按,但是无法正常显示label。用不不得不通过自己设置label、hint、symbol拼接出按键提示来。需要使用规则,自动显示这些信息。

Describe alternatives you've considered

  1. 我们必须讨论一下以什么样的形式存储这些信息。(数据库?Java代码?txt或者json或者yam文件或者什么东西释放到路径里?)至少显然不适合放到内置的string.xml里
  2. 这个表是否需要用户自己可编辑?
  3. 我希望在做keycode-keylabel对应的同时,完成keyname-keycode这样的表,移除皮肤中android_key/name小节罗列按键名称的约3400个文字。
  4. 在移除皮肤中的key name时,必然造成一些兼容性问题。我觉得是有必要的——同文不应该占用Android已经定义过的keycode,而是应该使用未占用的keycode (参照附表)
  5. 另外,按下按键读出键名这个功能可能使用的人不多,但是可能需要类似的方式进行优化,但是更加复杂——譬如同样是中文用户,拼音方案下,应该读啊 啵 次 的,但是切入ASCII键盘时需要读A B C D

Additional context Android.jar (API 31)的keycode与trime.yaml的对照表。可以看到两者高度相似,所以产生的问题不会太多,可以快速调整皮肤来解决

Android KeyName (Remove KEYCODE_) Android KeyCode / Trime keyName index Trime keyName
UNKNOWN 0 VoidSymbol
SOFT_LEFT 1 SOFT_LEFT
SOFT_RIGHT 2 SOFT_RIGHT
HOME 3 HOME
BACK 4 BACK
CALL 5 CALL
ENDCALL 6 ENDCALL
0 7 '0'
1 8 '1'
2 9 '2'
3 10 '3'
4 11 '4'
5 12 '5'
6 13 '6'
7 14 '7'
8 15 '8'
9 16 '9'
STAR 17 asterisk
POUND 18 numbersign
DPAD_UP 19 Up
DPAD_DOWN 20 Down
DPAD_LEFT 21 Left
DPAD_RIGHT 22 Right
DPAD_CENTER 23 KP_Begin
VOLUME_UP 24 VOLUME_UP
VOLUME_DOWN 25 VOLUME_DOWN
POWER 26 POWER
CAMERA 27 CAMERA
CLEAR 28 Clear
A 29 a
B 30 b
C 31 c
D 32 d
E 33 e
F 34 f
G 35 g
H 36 h
I 37 i
J 38 j
K 39 k
L 40 l
M 41 m
N 42 n
O 43 o
P 44 p
Q 45 q
R 46 r
S 47 s
T 48 t
U 49 u
V 50 v
W 51 w
X 52 x
Y 53 y
Z 54 z
COMMA 55 comma
PERIOD 56 period
ALT_LEFT 57 Alt_L
ALT_RIGHT 58 Alt_R
SHIFT_LEFT 59 Shift_L
SHIFT_RIGHT 60 Shift_R
TAB 61 Tab
SPACE 62 space
SYM 63 SYM
EXPLORER 64 EXPLORER
ENVELOPE 65 ENVELOPE
ENTER 66 Return
DEL 67 BackSpace
GRAVE 68 grave
MINUS 69 minus
EQUALS 70 equal
LEFT_BRACKET 71 bracketleft
RIGHT_BRACKET 72 bracketright
BACKSLASH 73 backslash
SEMICOLON 74 semicolon
APOSTROPHE 75 apostrophe
SLASH 76 slash
AT 77 at
NUM 78 NUM
HEADSETHOOK 79 HEADSETHOOK
FOCUS 80 FOCUS
PLUS 81 plus
MENU 82 Menu
NOTIFICATION 83 NOTIFICATION
SEARCH 84 Find
MEDIA_PLAY_PAUSE 85 MEDIA_PLAY_PAUSE
MEDIA_STOP 86 MEDIA_STOP
MEDIA_NEXT 87 MEDIA_NEXT
MEDIA_PREVIOUS 88 MEDIA_PREVIOUS
MEDIA_REWIND 89 MEDIA_REWIND
MEDIA_FAST_FORWARD 90 MEDIA_FAST_FORWARD
MUTE 91 MUTE
PAGE_UP 92 Page_Up
PAGE_DOWN 93 Page_Down
PICTSYMBOLS 94 PICTSYMBOLS
SWITCH_CHARSET 95 Mode_switch
BUTTON_A 96 BUTTON_A
BUTTON_B 97 BUTTON_B
BUTTON_C 98 BUTTON_C
BUTTON_X 99 BUTTON_X
BUTTON_Y 100 BUTTON_Y
BUTTON_Z 101 BUTTON_Z
BUTTON_L1 102 BUTTON_L1
BUTTON_R1 103 BUTTON_R1
BUTTON_L2 104 BUTTON_L2
BUTTON_R2 105 BUTTON_R2
BUTTON_THUMBL 106 BUTTON_THUMBL
BUTTON_THUMBR 107 BUTTON_THUMBR
BUTTON_START 108 BUTTON_START
BUTTON_SELECT 109 BUTTON_SELECT
BUTTON_MODE 110 BUTTON_MODE
ESCAPE 111 Escape
FORWARD_DEL 112 Delete
CTRL_LEFT 113 Control_L
CTRL_RIGHT 114 Control_R
CAPS_LOCK 115 Caps_Lock
SCROLL_LOCK 116 Scroll_Lock
META_LEFT 117 Meta_L
META_RIGHT 118 Meta_R
FUNCTION 119 function
SYSRQ 120 Sys_Req
BREAK 121 Pause
MOVE_HOME 122 Home
MOVE_END 123 End
INSERT 124 Insert
FORWARD 125 Next
MEDIA_PLAY 126 MEDIA_PLAY
MEDIA_PAUSE 127 MEDIA_PAUSE
MEDIA_CLOSE 128 MEDIA_CLOSE
MEDIA_EJECT 129 MEDIA_EJECT
MEDIA_RECORD 130 MEDIA_RECORD
F1 131 F1
F2 132 F2
F3 133 F3
F4 134 F4
F5 135 F5
F6 136 F6
F7 137 F7
F8 138 F8
F9 139 F9
F10 140 F10
F11 141 F11
F12 142 F12
NUM_LOCK 143 Num_Lock
NUMPAD_0 144 KP_0
NUMPAD_1 145 KP_1
NUMPAD_2 146 KP_2
NUMPAD_3 147 KP_3
NUMPAD_4 148 KP_4
NUMPAD_5 149 KP_5
NUMPAD_6 150 KP_6
NUMPAD_7 151 KP_7
NUMPAD_8 152 KP_8
NUMPAD_9 153 KP_9
NUMPAD_DIVIDE 154 KP_Divide
NUMPAD_MULTIPLY 155 KP_Multiply
NUMPAD_SUBTRACT 156 KP_Subtract
NUMPAD_ADD 157 KP_Add
NUMPAD_DOT 158 KP_Decimal
NUMPAD_COMMA 159 KP_Separator
NUMPAD_ENTER 160 KP_Enter
NUMPAD_EQUALS 161 KP_Equal
NUMPAD_LEFT_PAREN 162 parenleft
NUMPAD_RIGHT_PAREN 163 parenright
VOLUME_MUTE 164 VOLUME_MUTE
INFO 165 INFO
CHANNEL_UP 166 CHANNEL_UP
CHANNEL_DOWN 167 CHANNEL_DOWN
ZOOM_IN 168 ZOOM_IN
ZOOM_OUT 169 ZOOM_OUT
TV 170 TV
WINDOW 171 WINDOW
GUIDE 172 GUIDE
DVR 173 DVR
BOOKMARK 174 BOOKMARK
CAPTIONS 175 CAPTIONS
SETTINGS 176 SETTINGS
TV_POWER 177 TV_POWER
TV_INPUT 178 TV_INPUT
STB_POWER 179 STB_POWER
STB_INPUT 180 STB_INPUT
AVR_POWER 181 AVR_POWER
AVR_INPUT 182 AVR_INPUT
PROG_RED 183 PROG_RED
PROG_GREEN 184 PROG_GREEN
PROG_YELLOW 185 PROG_YELLOW
PROG_BLUE 186 PROG_BLUE
APP_SWITCH 187 APP_SWITCH
BUTTON_1 188 BUTTON_1
BUTTON_2 189 BUTTON_2
BUTTON_3 190 BUTTON_3
BUTTON_4 191 BUTTON_4
BUTTON_5 192 BUTTON_5
BUTTON_6 193 BUTTON_6
BUTTON_7 194 BUTTON_7
BUTTON_8 195 BUTTON_8
BUTTON_9 196 BUTTON_9
BUTTON_10 197 BUTTON_10
BUTTON_11 198 BUTTON_11
BUTTON_12 199 BUTTON_12
BUTTON_13 200 BUTTON_13
BUTTON_14 201 BUTTON_14
BUTTON_15 202 BUTTON_15
BUTTON_16 203 BUTTON_16
LANGUAGE_SWITCH 204 LANGUAGE_SWITCH
MANNER_MODE 205 MANNER_MODE
3D_MODE 206 3D_MODE
CONTACTS 207 CONTACTS
CALENDAR 208 CALENDAR
MUSIC 209 MUSIC
CALCULATOR 210 CALCULATOR
ZENKAKU_HANKAKU 211 Zenkaku_Hankaku
EISU 212 Eisu_toggle
MUHENKAN 213 Muhenkan
HENKAN 214 Henkan
KATAKANA_HIRAGANA 215 Hiragana_Katakana
YEN 216 yen
RO 217 RO
KANA 218 Kana_Lock
ASSIST 219 ASSIST
BRIGHTNESS_DOWN 220 BRIGHTNESS_DOWN
BRIGHTNESS_UP 221 BRIGHTNESS_UP
MEDIA_AUDIO_TRACK 222 MEDIA_AUDIO_TRACK
SLEEP 223 SLEEP
WAKEUP 224 WAKEUP
PAIRING 225 PAIRING
MEDIA_TOP_MENU 226 MEDIA_TOP_MENU
11 227 '11'
12 228 '12'
LAST_CHANNEL 229 LAST_CHANNEL
TV_DATA_SERVICE 230 TV_DATA_SERVICE
VOICE_ASSIST 231 VOICE_ASSIST
TV_RADIO_SERVICE 232 TV_RADIO_SERVICE
TV_TELETEXT 233 TV_TELETEXT
TV_NUMBER_ENTRY 234 TV_NUMBER_ENTRY
TV_TERRESTRIAL_ANALOG 235 TV_TERRESTRIAL_ANALOG
TV_TERRESTRIAL_DIGITAL 236 TV_TERRESTRIAL_DIGITAL
TV_SATELLITE 237 TV_SATELLITE
TV_SATELLITE_BS 238 TV_SATELLITE_BS
TV_SATELLITE_CS 239 TV_SATELLITE_CS
TV_SATELLITE_SERVICE 240 TV_SATELLITE_SERVICE
TV_NETWORK 241 TV_NETWORK
TV_ANTENNA_CABLE 242 TV_ANTENNA_CABLE
TV_INPUT_HDMI_1 243 TV_INPUT_HDMI_1
TV_INPUT_HDMI_2 244 TV_INPUT_HDMI_2
TV_INPUT_HDMI_3 245 TV_INPUT_HDMI_3
TV_INPUT_HDMI_4 246 TV_INPUT_HDMI_4
TV_INPUT_COMPOSITE_1 247 TV_INPUT_COMPOSITE_1
TV_INPUT_COMPOSITE_2 248 TV_INPUT_COMPOSITE_2
TV_INPUT_COMPONENT_1 249 TV_INPUT_COMPONENT_1
TV_INPUT_COMPONENT_2 250 TV_INPUT_COMPONENT_2
TV_INPUT_VGA_1 251 TV_INPUT_VGA_1
TV_AUDIO_DESCRIPTION 252 TV_AUDIO_DESCRIPTION
TV_AUDIO_DESCRIPTION_MIX_UP 253 TV_AUDIO_DESCRIPTION_MIX_UP
TV_AUDIO_DESCRIPTION_MIX_DOWN 254 TV_AUDIO_DESCRIPTION_MIX_DOWN
TV_ZOOM_MODE 255 TV_ZOOM_MODE
TV_CONTENTS_MENU 256 TV_CONTENTS_MENU
TV_MEDIA_CONTEXT_MENU 257 TV_MEDIA_CONTEXT_MENU
TV_TIMER_PROGRAMMING 258 TV_TIMER_PROGRAMMING
HELP 259 Help
NAVIGATE_PREVIOUS 260 NAVIGATE_PREVIOUS
NAVIGATE_NEXT 261 NAVIGATE_NEXT
NAVIGATE_IN 262 NAVIGATE_IN
NAVIGATE_OUT 263 NAVIGATE_OUT
STEM_PRIMARY 264 STEM_PRIMARY
STEM_1 265 STEM_1
STEM_2 266 STEM_2
STEM_3 267 STEM_3
DPAD_UP_LEFT 268 Pointer_UpLeft
DPAD_DOWN_LEFT 269 Pointer_DownLeft
DPAD_UP_RIGHT 270 Pointer_UpRight
DPAD_DOWN_RIGHT 271 Pointer_DownRight
MEDIA_SKIP_FORWARD 272 MEDIA_SKIP_FORWARD
MEDIA_SKIP_BACKWARD 273 MEDIA_SKIP_BACKWARD
MEDIA_STEP_FORWARD 274 MEDIA_STEP_FORWARD
MEDIA_STEP_BACKWARD 275 MEDIA_STEP_BACKWARD
SOFT_SLEEP 276 SOFT_SLEEP
CUT 277 CUT
COPY 278 COPY
PASTE 279 PASTE
SYSTEM_NAVIGATION_UP 280 SYSTEM_NAVIGATION_UP
SYSTEM_NAVIGATION_DOWN 281 SYSTEM_NAVIGATION_DOWN
SYSTEM_NAVIGATION_LEFT 282 SYSTEM_NAVIGATION_LEFT
SYSTEM_NAVIGATION_RIGHT 283 SYSTEM_NAVIGATION_RIGHT
ALL_APPS 284 ALL_APPS
REFRESH 285 REFRESH
THUMBS_UP 286 THUMBS_UP
THUMBS_DOWN 287 THUMBS_DOWN
PROFILE_SWITCH 288 PROFILE_SWITCH
    A
    B
    C
    D
    E
    F
    G
    H
    I
    J
    K
    L
    M
    N
    O
    P
    Q
    R
    S
    T
    U
    V
    W
    X
    Y
    Z
    exclam
    quotedbl
    dollar
    percent
    ampersand
    colon
    less
    greater
    question
    asciicircum
    underscore
    braceleft
    bar
    braceright
    asciitilde
tumuyan commented 2 years ago

考虑到易于编辑,拟定使用csv档案存储label的信息。

  1. 存储keycode - keyname 的转换由java类内置;存储 trime key、preset_keys 的key - key label的转换为share目录的csv文件,每种语言1个文件。
  2. 显示按键时,先读取
  3. 需要考虑label和气泡不一致的特殊需求:label需要内容,而不需要气泡;label需要同时显示多种动作的信息,而气泡显示单个动作的信息;
  4. 取消按键语音的功能
  5. 和KeyCharacterMap.class有相关性
tumuyan commented 2 years ago

事实上,处理label多语言的问题有些i18n或者icu的味道。 是否需要引入icu呢?

关联的问题是,键盘本地化不止是label,还意味着输入符号和字母的本地化。这一点可以参考floris——但是按照rime现状看似乎不必如此。

tumuyan commented 2 years ago

我把多语言的模式设想的太简单了。 键盘涉及布局keycode和label三个部分。

  1. 部分按键以及符号键发生了调整,以至于shift和Alt Gr可能出现问题(事实上Alt Gr并没有出现在Android的keyevent类中,真实键盘如何工作不得而知)。
  2. 不同语言需求的按键数量不同,用户定义的键盘布局只能保证26个英文字母,而缺少的符号可能导致其他语言无法正常使用。

总的来说,考虑到同文主要用户为中文,并且并没有多少其他语言的方案,可能只做如下适配:

  1. 非default键盘:对显示的文字进行翻译(对实际操作无任何影响,仅保证键盘与系统UI一致)
  2. default键盘ASCII=1: 显示英文label,根据在同文设置界面用户选择的qwert等不同布局,调整按键A-Z
  3. default键盘ASCII=0: 显示主题指定label,如无,根据ASCII=1的设定显示,或者显示大写字母
  4. default键盘ASCII=0的符号,根据符号表显示首选符号
tumuyan commented 2 years ago

太麻烦了,考虑搁置此issue

tumuyan commented 1 year ago

再次考虑做一点程度的实现。 普通104键盘包含的按键读按键名做兜底,其他按键如果没有设置则不读,用开关配置数字和标点的读法,开关拼接字符串读开关状态。 中文输入状态从输入方案获取按键显示的label和读音。