Chrome拡張機能のServiceWorker上でchrome.i18n.getMessage()が取れない時の対応法
Chrome Extensions Manifest V2からV3へ移行するタイミングでchrome.i18n.getMessage()が取れなくなる事象に出会いましたので、その時行った対処法を残しておきます。
コードを交えた具体的な内容としては、background.js
にて以下のi18n対応用のファイルを読み込んでいました。
production時にchrome.i18n.getMessage()
でlocaleに合わせた翻訳ファイルを読むというなんていうことのない内容なのですが、どうやらそもそもnot a functionに。
V3ではbackground.js
がService Workerへ移行しますが、調べてみるとこのService Worker上でどうやらchrome.i18n
が利用できない状況のようで、bugs.chromium.orgでも「Service Worker上でchrome.i18nが利用できない」という報告が複数上がっていました。getMessage()
以外にもgetUILanguage()
も同様に利用出来ないようです。
いずれ解消される可能性もあるので待つのもありでしたが、私のプロダクトでは翻訳ファイルを読み込むだけでしか使用していなかったのでchrome.i18n.getMessage()
を使わない方法に変更することで対応しました。
Extension APIの使用有無での分岐が必要なくなったのは副作用としては嬉しいものでした。(ただし.js
ファイルのバンドルサイズは翻訳ファイル分増加します)
V3移行の際に、翻訳ファイルの読み込みなどの局所的な利用でchrome.i18n.getMessage()
を使用している場合はnavigator.language
へ切り替えてみるのも対応手段としてありだと思います。
ただし根本的な解消まで待つ必要がある方は暫くIssue 1159438を追ってみると良さそうです。