TIS 服务:选择捷克语

TIS Services: selecting Czech

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

我用的是这个方法:

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

它在俄语中效果很好,但在捷克语中效果不佳...捷克语标签是 cs,俄语 - ru。两个小时前我做了输出

NSLog("%@", ref);    

打印一些关于捷克语的内容,但现在它只打印 (null)。我想完全使用 QWERTY,而不是 QWERTZ,但我真的无法在任何地方找到代表捷克 QWERTY 布局的标签。苹果文档说:

If more than one such input source exists and at least one has been used, the most recently used input source is chosen.

但它总是选择英语,而不是捷克语!在控制台中,正如我之前所说,它打印 (null)... 那么我必须使用什么来选择捷克语?我为此浪费了大约 3 个小时...请帮忙。

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

有一些解决方法,但首先:您是否尝试过设置文本字段单元格的 allowedInputSourceLocales 属性?由于它指定了语言环境,我不确定它是否会将输入限制为仅捷克语、select 捷克语输入源,或者 select 特别是捷克语 QWERTY 输入源,但值得一试.

如果这没有帮助,那么我会在 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);

您可以通过查找 "cs" 在语言数组中最早出现的来源来扩展它(以防多个来源支持它)。

即使这样也不能保证您会获得捷克语输入法的 QWERTY 变体。如果你真的想要那个,具体来说,你应该使用它的输入源 ID,即 "com.apple.keylayout.Czech-QWERTY".

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

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;
}

请注意,未经用户许可启用输入源是对用户的敌意。