Leopard で Dictionary Services というものが追加されてる。その名の通り(プログラマ的には紛らわしい名前だけど)辞書を引くためのフレームワークで、Core Services フレームワークの内部フレームワーク。
現在公開されている機能は、DCSCopyTextDefinition() という関数を使って New Oxford American Dictionary を引くだけ。
でも隠れた関数を nm して探すと、
- DCSCopyAvailableDictionaries()
- DCSDictionaryGetName()
などの関数が用意されてる。
各種辞書のハンドルとなる DCSDictionaryRef の正体が分からないので、とりあえず、
NSArray *DCSGetActiveDictionaries();
NSArray *DCSCopyAvailableDictionaries();
NSString *DCSDictionaryGetName(DCSDictionaryRef dictID);
NSString *DCSDictionaryGetShortName(DCSDictionaryRef dictID);
という宣言をしておいて、
DCSDictionaryRef _DCSGetJapaneseEnglishDictionary() {
NSArray *dicts = DCSCopyAvailableDictionaries();
for (NSObject *aDict in dicts) {
NSString *aShortName = DCSDictionaryGetShortName((DCSDictionaryRef)aDict);
if ([aShortName isEqualToString:@"Japanese-English"]) {
return (DCSDictionaryRef)aDict;
}
}
return NULL;
}
こんな風にするとプログレッシブ英和・和英中辞典のハンドルが取れる。あとはこのハンドルを公開されてる関数に渡して、
NSString *searchStr = @"test";
DCSDictionaryRef jeDict = _DCSGetJapaneseEnglishDictionary();
CFRange range = DCSGetTermRangeInString(jeDict, (CFStringRef)searchStr, 0);
NSString *result = (NSString *)DCSCopyTextDefinition(jeDict, (CFStringRef)searchStr, range);
NSLog(@"result={%@}", result);
とすると、ちゃんと日本語の結果がもらえた。
result={名 詞
1 (...の)試験, 考査, テスト⦅in ...⦆;検査, 吟味;(特定の)試験, 検査(⇒TRIAL[類語]);〘心理学〙テスト, 検査
a test in mathematics|数学の試験
an eye test|眼の検査
a blood test|血液検査
...
ということで、これを使えばいろんな辞書アプリが作れそうです。
存在意義の薄くなった英辞郎ビューアですが、英辞郎については、Dictionary Services の形式に沿ったデータに変換するコンバータを誰か作ってください(ぉ。たぶん一晩あったら作れるけど、なかなか食指が動きません (^^;。
コメントを書く