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;
}
请注意,未经用户许可启用输入源是对用户的敌意。
我在关注 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;
}
请注意,未经用户许可启用输入源是对用户的敌意。