Google 日本語入力で利用している辞書データを Mac/iPhone の標準辞書向けに変換する

iPhone に辞書の一括インポート機能がないので、 iCloud Drive を経由する形で Mac から辞書登録をしようとしたところ、Google 日本語入力で一般に用いられている辞書データの形式(txt)が、Mac や iPhone と互換性がない(こちらは plist)ことがわかった。

互換性がない事自体は多少面倒なものの、 plist の実態はバイナリではなく XML 形式の簡単なテキストファイル。データ構造さえわかれば簡単にコンバートできるはずなので、変換を試してみることにした。

データ構造

Google IME で利用されている構造がこのような形。基本的に TSV の形が取られており、最後に品詞が設定されている。

${入力}\t${変換}\t${品詞}

そして、 macOS/iOS の内蔵辞書の構造が以下のようなかたちとなる。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>phrase</key>
        <string>入力</string>
        <key>shortcut</key>
        <string>変換</string>
    </dict>
</array>
</plist>

Apple 製品の入力システムは、あくまでもエイリアスやマクロ程度のプリミティブな辞書ツールのみを OS が提供しており、品詞設定はことえりなど各 IME が実装する形になっている様子。

今回は明示的にことえりを使う予定はない(macOS では Google IME を、 iPhone では標準 IME を利用している)ため、品詞情報を削除して登録することとした。

コード

上記を満たすために書いた最終的なコードは以下。fs に依存しているので、手元に Node.js が入っている前提。

// node ./oneliner.js /path/to/dict.txt の形式で実行
// コマンドライン引数で受け取ったパスのファイルを読み取ります

const fs = require('fs')

const createPlist = (t) => `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>${t}
</array>
</plist>
`

function main() {
  const [_, __, dictPath] = process.argv
  const dictData = fs.readFileSync(`${dictPath}`, { encoding: 'utf-8' })
  const plist = createPlist(dictData.split('\n')
  .map((line) => {
    const [k,v] = line.split('\t')
    if (!(k && v)) {
      return null
    }
    return `
  <dict>
    <key>shortcut</key>
    <string>${k}</string>
    <key>phrase</key>
    <string>${v}</string>
  </dict>`
  }).filter((t) => !!t).join(''))
  fs.writeFileSync('result.plist', plist, { encoding: 'utf-8' })
}

main()

おわりに

無事手元にあった 50,000 件ほどの辞書データが移行できたので、 iPhone での入力が幾分か楽になりそうでよい。

ちなみに plist のインポートは GUI 上で明示されていないが、System Preferences からキーボードへとアクセスし、その中の ユーザー辞書のタブで D&D する ことで実現できる。

逆にエクスポートは、GUI 側から他のディレクトリへと D&D することで実現できる。

分かりづらいので注意。