Use keyboard shortcuts, regardless of the keyboard layout

Good afternoon!

To use keyboard shortcuts to the user with different from the Latin keyboard layout, must switch it first. It is not too convenient.

Maybe it makes sense to add bindings to the file app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 for the keys that relevant to Latin keys?

Here is implementation for users with a Cyrillic keyboard:

'№':               {handler: 'goToPost', anonymous: true},
'\\':              {handler: 'toggleSearch', anonymous: true},
'+':               {handler: 'toggleHamburgerMenu', anonymous: true},
',':               {handler: 'showHelpModal', anonymous: true},
'ю':               {click: '.alert.alert-info.clickable', anonymous: true}, // show incoming/updated topics
'и':               {handler: 'toggleBookmark'},
'с':               {handler: 'createTopic'},
'ctrl+а':          {handler: 'showPageSearch', anonymous: true},
'command+а':       {handler: 'showPageSearch', anonymous: true},
'ctrl+з':          {handler: 'printTopic', anonymous: true},
'command+з':       {handler: 'printTopic', anonymous: true},
'в':               {postAction: 'deletePost'},
'у':               {postAction: 'editPost'},
'end':             {handler: 'goToLastPost', anonymous: true},
'command+down':    {handler: 'goToLastPost', anonymous: true},
'а':               {handler: 'toggleBookmarkTopic'},
'п р':             {path: '/', anonymous: true},
'п д':             {path: '/latest', anonymous: true},
'п т':             {path: '/new'},
'п г':             {path: '/unread'},
'п с':             {path: '/categories', anonymous: true},
'п е':             {path: '/top', anonymous: true},
'п и':             {path: '/bookmarks'},
'п з':             {path: '/my/activity'},
'п ь':             {path: '/my/messages'},
'home':            {handler: 'goToFirstPost', anonymous: true},
'command+up':      {handler: 'goToFirstPost', anonymous: true},
'о':               {handler: 'selectDown', anonymous: true},
'л':               {handler: 'selectUp', anonymous: true},
'д':               {click: '.topic-post.selected button.toggle-like'},
'ь ь':             {handler: 'setTrackingToMuted'}, // mark topic as muted
'ь к':             {handler: 'setTrackingToRegular'}, // mark topic as regular
'ь е':             {handler: 'setTrackingToTracking'}, // mark topic as tracking
'ь ц':             {handler: 'setTrackingToWatching'}, // mark topic as watching
'щ':         		 {click: '.topic-list tr.selected a.title', anonymous: true}, // open selected topic
'з':               {handler: 'showCurrentUser'},
'й':               {handler: 'quoteReply'},
'к':               {postAction: 'replyToPost'},
'ы':               {click: '.topic-post.selected a.post-date', anonymous: true}, // share post
'shift+о':         {handler: 'nextSection', anonymous: true},
'shift+л':         {handler: 'prevSection', anonymous: true},
'shift+з':         {handler: 'pinUnpinTopic'},
'shift+к':         {handler: 'replyToTopic'},
'shift+ы':         {click: '#topic-footer-buttons button.share', anonymous: true}, // share topic
'shift+я shift+я': {handler: 'logout'},
'е':               {postAction: 'replyAsNewTopic'},
'г':               {handler: 'goBack', anonymous: true},
'ч к':             {click: '#dismiss-new,#dismiss-new-top,#dismiss-posts,#dismiss-posts-top'}, // dismiss new/posts
'ч е':             {click: '#dismiss-topics,#dismiss-topics-top'} // dismiss topics
4 Likes

My concern here is around the overlapping letters like a and e.

Perhaps a site setting to switch this for communities that use Cyrillic? Which locales do we have now that use this layout?

3 Likes

a and а might look the same, but are different characters: a а

Same with e and е. I expect users of Cyrillic keyboards will get that immediately.

4 Likes

Here are the Cyrillic-Latin keyboard:

I mean here that if at the moment I have Cyrillic layout, then i should switch it (Shift+Alt) to Latin for Discourse keyboard shortcuts using.

I propose to add additional bindings to resolve this issue, for example:

  • for share: 's,ы': {click: '.topic-post.selected a.post-date', anonymous: true}
  • for likes: 'l,д': {click: '.topic-post.selected button.toggle-like'}
    etc. There is no overlapping.
1 Like

Yeah, +1

it’s annoying when the shortcuts don’t work in some layout.

e.g. Ctrl+Ы works as Ctrl+S in most apps, and even on Discourse Ctrl+:ru: А works as Ctrl+F. But other shortcuts like k, j do not work here in Russian layout.

1 Like

I am open to having a PR that fixes this, we do not have any people with a Russian layout keyboard on the team.

Does GMail work as expected here?

2 Likes

Yes, and Youtube too.

It should be easy to test, you can just add another layout in your OS and press the same keys as you normally would. Also there are virtual/on-screen keyboards included in all OS.


About the workaround suggested in the first post, maybe it would be better to use the key codes instead of the letters of every non-latin layout? As I understand they are the same everywhere.

3 Likes