TIS服务:选择捷克语

时间:2015-01-28 03:41:18

标签: xcode macos cocoa localization

我专注于NSTextField后尝试更改系统输入语言。我在系统中有3种输入语言:英语,俄语和捷克语(QWERTY)。

我使用这种方法:

TISInputSourceRef ref = TISCopyInputSourceForLanguage(CFSTR("cs"));
TISSelectInputSource(ref);

它适用于俄语,但不适用于捷克语......捷克语标签为cs,俄语 - ru。两个小时前我做了输出

NSLog("%@", ref);    

打印有关捷克语的内容,但现在只打印(null)。我想要使​​用QWERTY,而不是QWERTZ,但我真的找不到任何标签,代表捷克QWERTY布局。 Apple文档说:

  

如果存在多个这样的输入源且至少有一个输入源   使用时,选择最近使用的输入源。

但它总是选择英语,而不是捷克语!在控制台中,正如我之前所说,打印(null) ...那么我必须选择捷克语?我已经失去了大约3个小时这样做...请帮助。

1 个答案:

答案 0 :(得分:0)

我可以确认TISCopyInputSourceForLanguage()没有按预期行事。您应该向Apple提交错误报告。

有一些解决方法,但首先:您是否尝试过设置文本字段单元格的allowedInputSourceLocales属性?由于这指定了区域设置,我不确定它是否会将输入限制为捷克语,选择捷克语输入源,或者特别选择捷克语QWERTY输入源,但值得一试。< / p>

如果这没有帮助,那么我会在TISCopyInputSourceForLanguage()失败时编写回退代码。复制所有已启用的键盘布局输入源的列表,并搜索支持捷克语作为语言的源列表。

TISInputSourceRef ref = TISCopyInputSourceForLanguage(CFSTR("cs"));

if (!ref)
{
    NSDictionary* properties = @{ (__bridge NSString*)kTISPropertyInputSourceCategory: (__bridge NSString*)kTISCategoryKeyboardInputSource,
                                  (__bridge NSString*)kTISPropertyInputSourceType: (__bridge NSString*)kTISTypeKeyboardLayout,
                                  (__bridge NSString*)kTISPropertyInputSourceIsSelectCapable: @YES,
                                  };
    NSArray* sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)properties, NO));
    for (id sourceObj in sources)
    {
        TISInputSourceRef source = (__bridge TISInputSourceRef)sourceObj;
        NSArray* langs = (__bridge NSArray*)TISGetInputSourceProperty(source, kTISPropertyInputSourceLanguages);
        if ([langs containsObject:@"cs"])
        {
            ref = source;
            break;
        }
    }
}

TISSelectInputSource(ref);

您可以通过查找&#34; cs&#34;的来源来扩展它。最早出现在语言数组中(如果多个来源支持它)。

即使这并不能保证您获得捷克输入源的QWERTY变体。如果你真的想要那个,特别是你应该使用它的输入源ID,即&#34; com.apple.keylayout.Czech-QWERTY&#34;。

要找到那个,你可以使用:

NSDictionary* properties = @{ (__bridge NSString*)kTISPropertyInputSourceID: @"com.apple.keylayout.Czech-QWERTY" };
NSArray* sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)properties, NO));
TISInputSourceRef source = (__bridge TISInputSourceRef)sources.firstObject;

但是,您应该准备好不启用甚至可能安装的输入源。 (Apple可能会更改其Czech-QWERTY布局以使用不同的标识符等。)如果已安装但未启用,您可以通过在上述代码之后添加如下代码来找到它:

if (!source)
{
    properties = @{ (__bridge NSString*)kTISPropertyInputSourceID: @"com.apple.keylayout.Czech-QWERTY",
                    (__bridge NSString*)kTISPropertyInputSourceIsEnableCapable: @YES };
    sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)properties, YES));
    source = (__bridge TISInputSourceRef)sources.firstObject;

    if (source && TISEnableInputSource(source) != noErr)
        source = NULL;
}

请注意,在没有用户许可的情况下启用输入源是用户敌对的。