Xcode TIS服务:选择捷克语

Xcode TIS服务:选择捷克语,xcode,macos,cocoa,localization,Xcode,Macos,Cocoa,Localization,在关注NSTextField之后,我正在尝试更改系统输入语言。我在系统中有3种输入语言:英语、俄语和捷克语(QWERTY) 我使用这种方法: TISInputSourceRef ref = TISCopyInputSourceForLanguage(CFSTR("cs")); TISSelectInputSource(ref); 它对俄语很有效,但对捷克语不起作用。。。捷克语标签为cs、俄语-ru。两小时前我做了输出 NSLog("%@", ref); 打印一些关于捷克语的内容,但现

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

我使用这种方法:

TISInputSourceRef ref = TISCopyInputSourceForLanguage(CFSTR("cs"));
TISSelectInputSource(ref);
它对俄语很有效,但对捷克语不起作用。。。捷克语标签为
cs
、俄语-
ru
。两小时前我做了输出

NSLog("%@", ref);    
打印一些关于捷克语的内容,但现在它只打印
(空)
。我想使用确切的QWERTY,而不是QWERTZ,但我真的找不到任何地方的标签,这代表捷克QWERTY布局。苹果的文档说:

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


但它总是选择英语,而不是捷克语!正如我前面所说,在控制台中,它打印
(null)
。。。那么我必须用什么来选择捷克语呢?我做这件事已经浪费了大约3个小时。。。请提供帮助。

我可以确认
TISCopyInputSourceForLanguage()
没有按预期运行。你应该向苹果公司提交一份缺陷报告

有一些解决方法,但首先:您是否尝试设置文本字段单元格的
allowedInputSourceLocales
属性?由于它指定了一个区域设置,我不确定它是否会将输入限制为仅捷克语、选择捷克语输入源,或者特别选择捷克语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.捷克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;
但是,您应该准备好不启用或甚至不安装该输入源。(苹果可能会更改其捷克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;
}

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

非常感谢!如果我使用inputSourceID,效果非常好!另外,我写这个应用程序只是为了让我输入捷克俄语卡片来学习新单词。因此,如果语言自动改变,这是非常有用的。再说一次:谢谢!