Skip to content

辞書を追加する

このガイドでは、ClueLens に新しい辞書または翻訳モジュールを追加する方法を説明します。すべてのソースモジュールは components/dicts/ 配下に置かれます。

基本概念

各辞書モジュールは、必要に応じて次のファイルで構成されます。

ファイル役割必須
search.ts検索を実行し結果データを返す必須
view.tsx結果表示用の React コンポーネント必須
types.ts構造化結果の型定義構造化辞書では必須
configView.tsx設定 UI設定がある場合に必須
settingBackup.tsバックアップと復元処理バックアップ対象なら必須
icon.pngソースのアイコン必須

2 つの実装パターン

シンプルな翻訳モジュール

Google 翻訳、彩云小译、DeepLx のように翻訳テキストを返すサービス向けです。

  • search.tsstring[] を返す
  • view.tsx では共有コンポーネント CommonView を再利用できる
  • 参考実装: google/caiyun/deeplx/

構造化辞書モジュール

Bing Dictionary、Jisho、Urban Dictionary のように構造化データを返すソース向けです。

  • search.ts は独自型の配列を返す
  • types.ts で型を定義する
  • view.tsx は専用レンダラーを実装する
  • 参考実装: bing/jisho/urban/wiktionary/

5 ステップ

1. DictID を登録する

components/dicts/types.ts に新しい列挙値を追加します。

ts
export enum DictID {
  // existing values
  YourDict = 'yourDict',
}

2. モジュールフォルダーを作成する

text
components/dicts/yourDict/
├── icon.png
├── search.ts
├── view.tsx
├── types.ts
├── configView.tsx
└── settingBackup.ts

3. search.ts を実装する

モジュールは配列を返す search 関数を export する必要があります。

シンプルな翻訳モジュールの例:

ts
import { SearchOptions } from '../types';

export async function search(
  text: string,
  options?: SearchOptions
): Promise<string[]> {
  const query = text.trim();
  if (!query) return [];

  const translatedText = await callYourAPI(query, options?.targetLang);
  return translatedText ? [translatedText] : [];
}

構造化辞書の例:

ts
import { YourDictResult } from './types';

export async function search(text: string): Promise<YourDictResult[]> {
  const query = text.trim();
  if (!query) return [];

  const results = await fetchResults(query);
  return results;
}

ポイント

  • 入力には必ず trim() を使う
  • 空入力では [] を返す
  • 翻訳モジュールでは options?.targetLang が使える
  • ネットワーク処理は search.ts に閉じ込める

4. レンダラーを実装する

シンプルな翻訳モジュールCommonView を再利用する例:

tsx
import TranslateView from '../shared/CommonView';

export function ResultsView({ data }: { data: unknown[] }) {
  return <TranslateView result={data as string[]} />;
}

構造化辞書モジュール の例:

tsx
import { YourDictResult } from './types';

export function ResultsView({ data }: { data: unknown[] }) {
  const results = data as YourDictResult[];
  return (
    <div>
      {results.map((item, i) => (
        <div key={i}>
          <h3>{item.title}</h3>
          <p>{item.definition}</p>
        </div>
      ))}
    </div>
  );
}

重要

view.tsxResultsView という名前付きコンポーネントを export してください。default export は使わないでください。

5. メタデータを登録する

components/dicts/index.tsx で次を行います。

  1. アイコンを import する
ts
import yourDictIcon from './yourDict/icon.png';
  1. dictMetaMap に項目を追加する
ts
[DictID.YourDict]: {
  id: DictID.YourDict,
  displayName: 'Your Dictionary',
  displayNameKey: 'dict.yourDict',
  icon: yourDictIcon,
  language: { type: 'all' },
  type: ModuleType.Dict,
},

language の意味:

意味
{ type: 'all' }すべての言語をサポートGoogle 翻訳
{ type: 'monolingual', languages: ['en'] }特定言語のみDictionaryAPI
{ type: 'pairs', pairs: [['en', 'zh'], ['zh', 'en']] }言語ペア対応Bing Dictionary

type の意味:

意味挙動
ModuleType.Dict辞書targetLang を受け取らない
ModuleType.Translator翻訳targetLang を自動で受け取る
ModuleType.OtherAI などその他targetLang を受け取らない

import.meta.glob により、検索モジュールと表示コンポーネントはファイル名から自動検出されるため、追加のローダー登録は不要です。

設定項目を追加する

API キーや独自設定が必要な場合は次を行います。

  1. yourDict/types.ts に設定型と既定値を定義する
  2. utils/storage.ts にストレージ定義を追加する
  3. yourDict/configView.tsx を作成する
  4. バックアップ対象なら yourDict/settingBackup.ts を作成し、settingsBackupHandler を export する

ローカライズを追加する

モジュール名や設定文言を翻訳したい場合は、i18n/locales/ 配下の各言語ファイルに項目を追加してください。

json
{
  "dict.yourDict": "Your Dictionary"
}

参考実装

用途参考モジュール
シンプルな翻訳google/
設定付き翻訳caiyun/deeplx/
構造化辞書urban/jisho/
HTML をそのまま表示bing/
設定 UI を持つ辞書wiktionary/
AI 出力openai/