Dictionary Services 登場

Cocoa全般
2007年10月29日 00:00

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 の形式に沿ったデータに変換するコンバータを誰か作ってください(ぉ。たぶん一晩あったら作れるけど、なかなか食指が動きません (^^;。

コメントを書く


トラックバックはありません。

トラックバックURL: http://numata.designed.jp/mt-tb.cgi/282