views:

544

answers:

1

Hello!

How do I learn currently selected keyboard layout / input language?

I was playing with NSInputManager but wasn’t able to achieve anything.

[NSInputManager currentInputManager]

returns (null) (as reported with %@) and thus

[[NSInputManager currentInputManager] localizedInputManagerName]

It would be the best for me to just get back a two-letter abbreviation of the language used like EN or FR, but the keyboard layout name as displayed in menubar will also work.

Any ideas? Thanks.

Edit: I also found out that an AppleSelectedInputSourcesChangedNotification gets posted into

[NSDistributedNotificationCenter defaultCenter]

when user changes the layout, however no information about the newly selected layout is “attached” to this notification.

+1  A: 

Keyboard layout to language combinations are typically one-to-many, so while you can get the localized name of the currently selected keyboard layout (or, more generally, the input source), the source can be used to type text in many languages. Why do you want to do this?

That said, you can get information about the current text input source using Text Input Source Services. For example:

  TISInputSourceRef source = TISCopyCurrentKeyboardInputSource();
  NSLog(@"languages: %@",
        TISGetInputSourceProperty(source, kTISPropertyInputSourceLanguages));
  NSLog(@"localized name: %@",
        TISGetInputSourceProperty(source, kTISPropertyLocalizedName));

gives me:

2009-04-23 14:30:17.581 sample[30688:10b] languages: (
    en,
    ca,
    da,
    de,
    es,
    eu,
    fr,
    ga,
    gl,
    gv,
    id,
    it,
    kw,
    ms,
    nb,
    nl,
    nn,
    om,
    pt,
    so,
    sq,
    sv,
    sw
)
2009-04-23 14:30:17.584 sample[30688:10b] localized name: U.S.
Nicholas Riley
I was trying to play with these also, but wasn’t able to make it even compile. What frameworks and what #imports do you add? :-) Also, do you think this is only possible with Carbon?
Ilya Birman
`#import <Carbon/Carbon.h>` (or `#include` works too, since Carbon headers have include guards). Then you need to add the Carbon framework to your project in Xcode (or use `-framework Carbon` if you're compiling otherwise). Note that while this is technically "Carbon" and "HIToolbox" it's a low-level piece of Carbon which both Carbon and Cocoa talk to, it's supported for 64-bit apps and isn't going away any time soon, so don't feel you can't use it.
Nicholas Riley
Thanks for the detailed info! It works indeed.
Ilya Birman