日本語の読み上げは、いままさに取り組んでいるところです。声がそこに届く前に、まずインターフェース自体が日本語を話すべきなので、こちらを先にやりました。ユーザーに見えるすべての文字列を、String Catalogsでローカライズできるようにしました。UI、オンボーディング、リーダー、設定、さらに4つの読書テーマ名まで、すべて日本語訳をそろえています。カタログはビルド時に文字列を抽出するので、新しいTextやButtonのリテラルも自動的に拾われます。こっそり英語のまま出荷される、ということがありません。
厄介だったのは、ローカライズされているように見えて、実はされていない文字列でした。本のタイトルはコンテンツであってUIではないので、絶対に翻訳してはいけません。そこで、ラベルがリテラルと実行時のコンテンツを混ぜている箇所(リーダーのタイトル、章メニュー、ダウンロードの進捗)では、両者を切り分けて、リテラルだけをカタログに通し、コンテンツはそのまま残すようにしました。作業はSwiftパッケージの内側にも及びました。DocumentKitとSpeechKitのインポートエラーと合成エラーをLocalizedErrorに準拠させたので、あの素っ気ない「操作を完了できませんでした」ではなく、インポートの失敗が読者自身の言語で理由を説明してくれます。
ローカライズは単純な作業に思えて、実のところ難しさの半分は「何を訳さないか」を決めることにあります。