Macアプリから内蔵辞書を引きたい
自分用のツールを作ろうとして英和辞典を検索したいニーズがあったのでメモ。
ニーズはたくさんありそうなのに思ったより日本語情報が少なかったです。(なぜかPythonの情報の方が多かった…)
Control + Command + d でいいじゃんという突っ込みはなしの方向で。
方法1:辞書.appで表示
辞書.appには「dict://」というカスタムURIスキームが用意されているようなので、
1 |
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"dict://%@", q]]]; |
とかやれば、検索できます。
辞書の指定とか細かい制御はできなさそうです。
参考:Mac OS X Lionで内蔵辞書を引く #Mac #dictionary – Qiita
方法2:アプリ内で表示
こちらが本命。
Dictionary Services Reference によると DCSCopyTextDefinition を使えばできそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// #importの直後辺りで宣言しておく NSArray *DCSGetActiveDictionaries(); NSArray *DCSCopyAvailableDictionaries(); NSString *DCSDictionaryGetName(DCSDictionaryRef dictID); NSString *DCSDictionaryGetShortName(DCSDictionaryRef dictID); // 英和・和英を指定 DCSDictionaryRef dict = NULL; NSArray *dicts = DCSCopyAvailableDictionaries(); for (NSObject *d in dicts) { NSString *shortName = DCSDictionaryGetShortName((__bridge DCSDictionaryRef)d); if ([shortName isEqualToString:@"Japanese-English"]) { dict = (__bridge DCSDictionaryRef)d; } } // DCSCopyTextDefinitionを使って検索 NSString *def = (__bridge NSString *)DCSCopyTextDefinition(dict, (__bridge CFStringRef)q, CFRangeMake(0, q.length)); if (def) { NSLog(@"def: %@", def); } |
という感じでできました。
__bridgeのせいで見づらいですが、意外と簡単でした。
冒頭の宣言と辞書の指定は、OS Xの辞書アプリをコマンドラインから – PC日記 を参考にさせていただきました。(辞書指定しないと英語の辞書が使われてしまいました)
この部分がUndocumentedなので、Mac App Storeの審査に通るかはグレーです。
HIDictionaryWindowShow を使えばControl + Command + dのようなポップアップ表示もできるようです。
参考:日暮れて道遠し: PDFkit(その5)辞書.appで辞書を引く(その3)
サンプル
上記2つの方法を試せる簡単なサンプルを作ってみました。左のTextViewで文字列を選択すると、ポップアップで選択されている方法(OpenURL or DCSCopyTextDefinition)で辞書を検索します。DCSCopyTextDefinitionの場合は右のTextViewに結果が表示されます。
こんな感じです。
ソースはGithubに置いておくのでご自由にどうぞです。
tnantoka/DictionaryServicesExample · GitHub
しかし、Macアプリ作成は全然上達してる気がしないなぁ…。 もっと頑張ろうっと。
それでは;-)
最近のコメント