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 することで実現できる。
分かりづらいので注意。